* astdb - tools for handeling the astdb */ $getopt = (function_exists('_getopt') ? '_' : '') . 'getopt'; $vars = $getopt($short = '', $long = array('opts::', 'id::', 'astdb::', 'data::')); //if the id option was passed if (isset($vars['id']) && $vars['id']) { //bu = backup settings //s= servers //b= backup object if ($bu = backup_get_backup($vars['id'])) { //dont run if no storage servers were found if (!isset($bu['storage_servers']) || count($bu['storage_servers']) < 1) { backup_log(_('No storage servers found! Aborting.')); exit; } $s = backup_get_server('all_detailed'); $b = new FreePBX\modules\Backup\Backup($bu, $s); backup_log(_('Initializing Backup') . ' ' . $vars['id']); backup_clear_log(); $b->init(); if ($b->b['bu_server'] == "0") { // lock to prevent backups from being run concurrently while (!$b->acquire_lock()) { backup_log(_('waiting for lock...')); sleep(10); } backup_log(_('Backup Lock acquired!')); backup_log(_('Running pre-backup hooks...')); $b->run_hooks('pre-backup'); backup_log(_('Adding items...')); $b->add_items();
break; default: //if backup_restore_path is already set, we probobly dont want that any more. delete it if (isset($_SESSION['backup_restore_path'])) { unset($_SESSION['backup_restore_path']); } break; } //view actions switch ($var['action']) { case 'browseserver': $content = load_view(dirname(__FILE__) . '/views/restore/browseserver.php', $var); break; case 'upload': case 'backup_list': $var['servers'] = backup_get_server('all'); $var['templates'] = backup_get_template('all_detailed'); //transalate variables //TODO: make this anonymous once we require php 5.3 function callback(&$var) { $var = backup__($var); } array_walk_recursive($var['servers'], 'callback'); array_walk_recursive($var['templates'], 'callback'); if (is_array($_SESSION['backup_restore_path'])) { //TODO: if $var['restore_path'] is an array, that means it contains an error + error // message. Do something with the error meesage echo _('Invalid backup for or undefined error'); break; }
public function getRightNav($request) { $var = array(); switch ($request['display']) { case 'backup': if (isset($request['action']) && $request['action'] == 'edit') { $var['backup'] = backup_get_backup('all'); } return load_view(dirname(__FILE__) . '/views/rnav/backup.php', $var); break; case 'backup_restore': $var['servers'] = backup_get_server('all'); return load_view(dirname(__FILE__) . '/views/rnav/restore.php', $var); break; case 'backup_servers': if (isset($request['action']) && $request['action'] == 'edit') { $var['servers'] = backup_get_server('all'); } return load_view(dirname(__FILE__) . '/views/rnav/servers.php', $var); break; case 'backup_templates': if (isset($request['action']) && $request['action'] == 'edit') { $var['templates'] = backup_get_template('all'); } return load_view(dirname(__FILE__) . '/views/rnav/templates.php', $var); break; } }
$var['maxsize'] = $maxsize; unset($var['maxtype']); $var['id'] = backup_put_server($var); break; case 'delete': $var['id'] = backup_del_server($var['id']); break; } //view action switch ($var['action']) { case 'edit': case 'save': if (!$var['id']) { $var['id'] = $var['server_type']; } $var = array_merge($var, backup_get_server($var['id'])); $content = load_view(dirname(__FILE__) . '/views/servers/' . $var['type'] . '.php', $var); break; default: $content = load_view(dirname(__FILE__) . '/views/servers/servers.php', $var); break; } $heading = _("Servers"); ?> <div class="container-fluid"> <h1><?php echo $heading; ?> </h1> <div class = "display full-border">
function backup_get_server($id = '') { global $db; //return a blank if no id was set, all servers if 'all' was passed //otherwise, a specifc server switch ($id) { case 'email': case 'ftp': case 'local': case 'mysql': case 'awss3': case 'ssh': global $backup_server_blanks; return $backup_server_blanks[$id]; break; case 'all': case 'all_detailed': $ret = sql('SELECT * FROM backup_servers ORDER BY name', 'getAll', DB_FETCHMODE_ASSOC); foreach ($ret as $s) { //set index to server id for easy retrieval $servers[$s['id']] = $s; //default name in one is missing if (!$servers[$s['id']]['name']) { switch ($s['type']) { case 'email': $sname = _('Email Server '); break; case 'ftp': $sname = _('FTP Server '); break; case 'local': $sname = _('Local Server '); break; case 'mysql': $sname = _('Mysql Server '); break; case 'ssh': $sname = _('SSH Server '); break; case 'awss3': $sname = _('Amazon S3 Server '); break; } $servers[$s['id']]['name'] = $sname . $s['id']; } //add details if requested if ($id == 'all_detailed') { $servers[$s['id']] = backup_get_server($s['id']); } } return $servers; break; default: $sql = 'SELECT * FROM backup_servers WHERE id = ?'; $ret = $db->getAll($sql, array($id), DB_FETCHMODE_ASSOC); if ($db->IsError($ret)) { die_freepbx($ret->getDebugInfo()); } //return a blank set if an invalid id was entered if (!$ret) { return backup_get_server(''); } $ret = $ret[0]; $sql = 'SELECT `key`, value FROM backup_server_details WHERE server_id = ?'; $ret1 = $db->getAll($sql, array($id), DB_FETCHMODE_ASSOC); if ($db->IsError($ret1)) { die_freepbx($ret1->getDebugInfo()); } foreach ($ret1 as $key => $r) { $ret[$r['key']] = $r['value']; } //default a name switch ($ret['type']) { case 'email': $sname = _('Email Server '); break; case 'ftp': $sname = _('FTP Server '); break; case 'local': $sname = _('Local Server '); break; case 'mysql': $sname = _('Mysql Server '); break; case 'ssh': $sname = _('SSH Server '); break; case 'awss3': $sname = _('AWS S3 Server '); break; } $ret['name'] = $ret['name'] ? $ret['name'] : $sname . $ret['id']; //unserialize readonly $ret['readonly'] = $ret['readonly'] ? unserialize($ret['readonly']) : array(); return $ret; break; } }
/** * make sure backup file is local, download it and make it local if necessary */ function backup_restore_locate_file($id, $path) { global $amp_conf; $path = trim($path, '/'); $path = str_replace(array('..', ':'), '', trim($path, '/')); $path = escapeshellcmd($path); $s = backup_get_server($id); if (!$s) { return array('error_msg' => _('Backup Server not found!')); } //dest is where we gona put backup files pulled infrom other servers $dest = $amp_conf['ASTSPOOLDIR'] . '/tmp/' . 'backuptmp-s' . $id . '-' . time() . '-' . basename($path); switch ($s['type']) { case 'local': $s['path'] = backup__($s['path']); $path = $s['path'] . '/' . $path; break; case 'ftp': //subsitute variables if nesesary $s['host'] = backup__($s['host']); $s['port'] = backup__($s['port']); $s['user'] = backup__($s['user']); $s['password'] = backup__($s['password']); $s['path'] = backup__($s['path']); $path = ltrim($path, '/'); $connection = new Connection($s['host'], $s['user'], $s['password'], $s['port'], 90, $s['transfer'] == 'passive'); try { $connection->open(); } catch (\Exception $e) { $this->b['error'] = $e->getMessage(); backup_log($this->b['error']); return; } $wrapper = new FTPWrapper($connection); $permFactory = new PermissionsFactory(); $ftptype = $wrapper->systype(); if (strtolower($ftptype) == "unix") { $fsFactory = new FilesystemFactory($permFactory); } else { $fsFactory = new WindowsFilesystemFactory(); } $manager = new FTPFilesystemManager($wrapper, $fsFactory); $dlVoter = new DownloaderVoter(); $dlVoter->addDefaultFTPDownloaders($wrapper); $ulVoter = new UploaderVoter(); $ulVoter->addDefaultFTPUploaders($wrapper); $crVoter = new CreatorVoter(); $crVoter->addDefaultFTPCreators($wrapper, $manager); $deVoter = new DeleterVoter(); $deVoter->addDefaultFTPDeleters($wrapper, $manager); $ftp = new FTP($manager, $dlVoter, $ulVoter, $crVoter, $deVoter); if (!$ftp) { $this->b['error'] = _("Error creating the FTP object"); } $ftpdirs = $ftp->findFilesystems(new \Touki\FTP\Model\Directory($s['path'])); $file = null; foreach ($ftpdirs as $thisdir) { if ($ftp->fileExists(new \Touki\FTP\Model\File($thisdir->getRealPath() . '/' . $path))) { $file = $ftp->findFileByName($thisdir->getRealPath() . '/' . $path); } } try { $options = array(FTP::NON_BLOCKING => false, FTP::TRANSFER_MODE => FTP_BINARY); $ftp->download($dest, $file, $options); $path = $dest; } catch (\Exception $e) { return array('error_msg' => _('Failed to retrieve file from server!')); } break; case 'ssh': $s['path'] = backup__($s['path']); $s['user'] = backup__($s['user']); $s['host'] = backup__($s['host']); $cmd[] = fpbx_which('scp'); $cmd[] = '-o StrictHostKeyChecking=no -i'; $cmd[] = $s['key']; $cmd[] = '-P ' . $s['port']; $cmd[] = $s['user'] . '\\@' . $s['host'] . ':' . $s['path'] . '/' . $path; $cmd[] = $dest; exec(implode(' ', $cmd), $foo, $ret); unset($cmd); if ($ret === 0) { $path = $dest; } else { return array('error_msg' => _('Failed to retrieve file from server!')); } break; case 'awss3': $s['bucket'] = backup__($s['bucket']); $s['awsaccesskey'] = backup__($s['awsaccesskey']); $s['awssecret'] = backup__($s['awssecret']); $awss3 = new S3($s['awsaccesskey'], $s['awssecret']); dbug('S3 Path: ' . $path); dbug('S3 Dest: ' . $dest); if ($awss3->getObject($s['bucket'], $path, $dest) !== false) { $path = $dest; } else { return array('error_msg' => _('Failed to retrieve file from server!')); } break; } if (file_exists($path)) { return $path; } else { return array('error_msg' => _('File not found! ' . $path)); } }
/** * make sure backup file is local, download it and make it local if necessary */ function backup_restore_locate_file($id, $path) { global $amp_conf; $path = trim($path, '/'); $path = str_replace(array('..', ':'), '', trim($path, '/')); $path = escapeshellcmd($path); $s = backup_get_server($id); if (!$s) { return array('error_msg' => _('Backup Server not found!')); } //dest is where we gona put backup files pulled infrom other servers $dest = $amp_conf['ASTSPOOLDIR'] . '/tmp/' . 'backuptmp-s' . $id . '-' . time() . '-' . basename($path); switch ($s['type']) { case 'local': $s['path'] = backup__($s['path']); $path = $s['path'] . '/' . $path; break; case 'ftp': //subsitute variables if nesesary $s['host'] = backup__($s['host']); $s['port'] = backup__($s['port']); $s['user'] = backup__($s['user']); $s['password'] = backup__($s['password']); $s['path'] = backup__($s['path']); $ftp = ftp_connect($s['host'], $s['port']); if (ftp_login($ftp, $s['user'], $s['password'])) { ftp_pasv($ftp, $s['transfer'] == 'passive'); if (ftp_get($ftp, $dest, $s['path'] . '/' . $path, FTP_BINARY)) { $path = $dest; } else { return array('error_msg' => _('Failed to retrieve file from server!')); } ftp_close($ftp); } else { dbug('ftp connect error'); } break; case 'ssh': $s['path'] = backup__($s['path']); $s['user'] = backup__($s['user']); $s['host'] = backup__($s['host']); $cmd[] = fpbx_which('scp'); $cmd[] = '-o StrictHostKeyChecking=no -i'; $cmd[] = $s['key']; $cmd[] = '-P ' . $s['port']; $cmd[] = $s['user'] . '\\@' . $s['host'] . ':' . $s['path'] . '/' . $path; $cmd[] = $dest; exec(implode(' ', $cmd), $foo, $ret); unset($cmd); if ($ret === 0) { $path = $dest; } else { return array('error_msg' => _('Failed to retrieve file from server!')); } break; case 'awss3': $s['bucket'] = backup__($s['bucket']); $s['awsaccesskey'] = backup__($s['awsaccesskey']); $s['awssecret'] = backup__($s['awssecret']); $awss3 = new S3($s['awsaccesskey'], $s['awssecret']); dbug('S3 Path: ' . $path); dbug('S3 Dest: ' . $dest); if ($awss3->getObject($s['bucket'], $path, $dest) !== false) { $path = $dest; } else { return array('error_msg' => _('Failed to retrieve file from server!')); } break; } if (file_exists($path)) { return $path; } else { return array('error_msg' => _('File not found! ' . $path)); } }