public function main() { //init controller data $this->extensions->hk_InitData($this, __FUNCTION__); $this->loadLanguage('tool/backup'); $this->loadModel('tool/backup'); $this->document->setTitle($this->language->get('heading_title')); //shedule task for backup if ($this->request->is_POST() && $this->_validate()) { if (is_uploaded_file($this->request->files['restore']['tmp_name'])) { if (pathinfo($this->request->files['restore']['name'], PATHINFO_EXTENSION) == 'sql') { $filetype = 'sql'; $content = file_get_contents($this->request->files['restore']['tmp_name']); } else { $content = false; } } elseif (is_uploaded_file($this->request->files['import']['tmp_name'])) { if (pathinfo($this->request->files['import']['name'], PATHINFO_EXTENSION) == 'xml') { $filetype = 'xml'; $content = file_get_contents($this->request->files['import']['tmp_name']); } else { $content = false; } } else { $content = false; //if do sheduled task for backup $task_details = $this->model_tool_backup->createBackupTask('sheduled_backup', $this->request->post); if (!$task_details) { $this->error['warning'] = array_merge($this->error, $this->model_tool_backup->errors); } else { $this->session->data['success'] = sprintf($this->language->get('text_success_scheduled'), $this->html->getSecureURL('tool/task')); $this->redirect($this->html->getSecureURL('tool/backup')); } } if ($content) { $this->cache->delete('*'); if ($filetype == 'sql') { $this->model_tool_backup->restore($content); $this->session->data['success'] = $this->language->get('text_success'); $this->redirect($this->html->getSecureURL('tool/backup')); } else { if ($this->model_tool_backup->load($content)) { $this->session->data['success'] = $this->language->get('text_success_xml'); $this->redirect($this->html->getSecureURL('tool/backup')); } else { $this->error['warning'] = $this->language->get('error_xml'); } } } elseif (!has_value($this->request->post['do_backup'])) { if ($this->request->files) { $this->error['warning'] = $this->language->get('error_empty') . ' (' . pathinfo($this->request->files['restore']['name'], PATHINFO_EXTENSION) . ')'; } else { $this->error['warning'] = $this->language->get('error_upload'); $uploaded_file = ''; if (isset($this->request->files['restore'])) { $uploaded_file = $this->request->files['restore']; } elseif ($this->request->files['import']) { $uploaded_file = $this->request->files['import']; } if ($uploaded_file) { $this->error['warning'] .= '<br>Error: ' . getTextUploadError($uploaded_file['error']); } } } } if (isset($this->error['warning'])) { $this->data['error_warning'] = $this->error['warning']; } elseif ($this->session->data['error']) { $this->data['error_warning'] = $this->session->data['error']; unset($this->session->data['error']); } else { $bkp = new ABackup('manual_backup'); $bkp->validate(); $this->data['error_warning'] = implode("\n", $bkp->error); } if (isset($this->session->data['success'])) { $this->data['success'] = $this->session->data['success']; unset($this->session->data['success']); } else { $this->data['success'] = ''; } $this->document->resetBreadcrumbs(); $this->document->addBreadcrumb(array('href' => $this->html->getSecureURL('index/home'), 'text' => $this->language->get('text_home'), 'separator' => FALSE)); $this->document->addBreadcrumb(array('href' => $this->html->getSecureURL('tool/backup'), 'text' => $this->language->get('heading_title'), 'separator' => ' :: ', 'current' => true)); $this->loadModel('tool/backup'); $this->data['tables'] = $this->model_tool_backup->getTables(); //if we cannot to get table list from database -show error if ($this->data['tables'] === false) { $this->data['tables'] = array(); } $table_sizes = $this->model_tool_backup->getTableSizes($this->data['tables']); $tables = array(); $db_size = 0; foreach ($this->data['tables'] as $table) { $tables[$table] = $table . ' (' . $table_sizes[$table]['text'] . ')'; $db_size += $table_sizes[$table]['bytes']; } //size of data of database (sql-file will be greater) if ($db_size > 1048576) { $this->data['entry_tables_size'] = round($db_size / 1048576, 1) . 'Mb'; } else { $this->data['entry_tables_size'] = round($db_size / 1024, 1) . 'Kb'; } $form = new AForm('ST'); $form->setForm(array('form_name' => 'backup')); $this->data['form']['id'] = 'backup'; $this->data['form']['form_open'] = $form->getFieldHtml(array('type' => 'form', 'name' => 'backup', 'action' => $this->html->getSecureURL('tool/backup'), 'attr' => 'class="aform form-horizontal"')) . $form->getFieldHtml(array('type' => 'hidden', 'name' => 'do_backup', 'value' => 1)); $this->data['form']['fields']['tables'] = $form->getFieldHtml(array('type' => 'checkboxgroup', 'name' => 'table_list[]', 'value' => $this->data['tables'], 'options' => $tables, 'scrollbox' => true, 'style' => 'checkboxgroup')); $c_size = $this->model_tool_backup->getCodeSize(); if ($c_size > 1048576) { $code_size = round($c_size / 1048576, 1) . 'Mb'; } else { $code_size = round($c_size / 1024, 1) . 'Kb'; } $this->data['entry_backup_code'] = sprintf($this->language->get('entry_backup_code'), $code_size); $this->data['form']['fields']['backup_code'] = $form->getFieldHtml(array('type' => 'checkbox', 'name' => 'backup_code', 'value' => '1', 'checked' => true)); $c_size = $this->model_tool_backup->getContentSize(); if ($c_size > 1048576) { $content_size = round($c_size / 1048576, 1) . 'Mb'; } else { $content_size = round($c_size / 1024, 1) . 'Kb'; } $this->data['entry_backup_content'] = sprintf($this->language->get('entry_backup_content'), $content_size); $this->data['form']['fields']['backup_content'] = $form->getFieldHtml(array('type' => 'checkbox', 'name' => 'backup_content', 'value' => '1', 'checked' => true)); $this->data['form']['fields']['compress_backup'] = $form->getFieldHtml(array('type' => 'checkbox', 'name' => 'compress_backup', 'value' => 1)); $this->data['entry_compress_backup'] = sprintf($this->language->get('entry_compress_backup'), str_replace(DIR_ROOT, '', DIR_BACKUP), DIR_BACKUP); $this->data['form']['build_task_url'] = $this->html->getSecureURL('r/tool/backup/buildTask'); $this->data['form']['complete_task_url'] = $this->html->getSecureURL('r/tool/backup/complete'); $this->data['form']['backup_now'] = $form->getFieldHtml(array('type' => 'button', 'name' => 'backup_now', 'text' => $this->language->get('button_backup_now'), 'style' => 'button1')); $this->data['form']['backup_schedule'] = $form->getFieldHtml(array('type' => 'button', 'name' => 'backup_schedule', 'text' => $this->language->get('button_backup_schedule'), 'style' => 'button1')); $form = new AForm('ST'); $form->setForm(array('form_name' => 'restore_form')); $this->data['restoreform']['id'] = 'restore_form'; $this->data['restoreform']['form_open'] = $form->getFieldHtml(array('type' => 'form', 'name' => 'restore_form', 'action' => $this->html->getSecureURL('tool/backup'), 'attr' => 'class="aform form-horizontal"')); $this->data['restoreform']['file'] = $form->getFieldHtml(array('type' => 'file', 'name' => 'restore')); $this->data['restoreform']['submit'] = $form->getFieldHtml(array('type' => 'button', 'name' => 'submit', 'text' => $this->language->get('tab_restore'), 'style' => 'button1')); $form = new AForm('ST'); $form->setForm(array('form_name' => 'loadxml_form')); $this->data['xmlform']['id'] = 'loadxml_form'; $this->data['xmlform']['form_open'] = $form->getFieldHtml(array('type' => 'form', 'name' => 'loadxml_form', 'action' => $this->html->getSecureURL('tool/backup'), 'attr' => 'class="aform form-horizontal"')); $this->data['xmlform']['file'] = $form->getFieldHtml(array('type' => 'file', 'name' => 'import')); $this->data['xmlform']['submit'] = $form->getFieldHtml(array('type' => 'button', 'name' => 'submit', 'text' => $this->language->get('button_load'), 'style' => 'button1')); $this->data['text_fail_note'] = sprintf($this->language->get('text_fail_note'), DIR_APP_SECTION . 'system/backup'); $this->view->batchAssign($this->data); $this->view->assign('help_url', $this->gen_help_url()); $this->view->assign('current_url', $this->html->currentURL()); $this->processTemplate('pages/tool/backup.tpl'); //update controller data $this->extensions->hk_UpdateData($this, __FUNCTION__); }
/** * @param array $data * @return bool|string */ public function generatePackage($data = array()) { $project_info = $this->getProjectConfig($this->session->data['dev_tools_prj_id']); $extension = $project_info['extension_txt_id']; if (!$extension) { return false; } if (!is_dir(DIR_EXT . $extension)) { return false; } $config_xml = simplexml_load_file(DIR_EXT . $extension . '/config.xml'); $data['version'] = (string) $config_xml->version; foreach ($config_xml->cartversions->item as $store_version) { $data['cartversions'][] = (string) $store_version; } if (is_writable(DIR_APP_SECTION . 'system/temp') && file_exists(DIR_APP_SECTION . 'system/temp')) { $package_dir = DIR_APP_SECTION . 'system/temp/'; } elseif (!is_dir(DIR_APP_SECTION . 'system/temp')) { $result = mkdir(DIR_APP_SECTION . 'system/temp', 0777); if (!$result) { $package_dir = sys_get_temp_dir(); } else { $package_dir = DIR_APP_SECTION . 'system/temp/'; } } else { $package_dir = sys_get_temp_dir(); } if (file_exists($package_dir . $extension)) { // if stuck files exists - breaks return false; } $package_directory = $package_dir . $extension . '_' . $data['version'] . '/'; mkdir($package_directory, 0777); mkdir($package_directory . '/code', 0777); mkdir($package_directory . '/code/extensions', 0777); mkdir($package_directory . '/code/extensions/' . $extension, 0777); $this->_copyDir(DIR_EXT . $extension, $package_directory . '/code/extensions/' . $extension); // build package.xml $xml_data = array('id' => $extension, 'type' => 'extension', 'version' => $data['version'], 'minversion' => $data['version']); if ($data['cartversions']) { foreach ($data['cartversions'] as &$ver) { $ver = explode('.', $ver); $ver = $ver[0] . "." . $ver[1]; } unset($ver); $xml_data['cartversions'] = array('item' => $data['cartversions']); } $xml_data['package_content'] = array('extensions' => array('extension' => $extension)); $xml = Array2XML::createXML('package', $xml_data); $xml = $xml->saveXML(); file_put_contents($package_directory . 'package.xml', $xml); if ($data['license']) { file_put_contents($package_directory . 'license.txt', $data['license']); } if ($data['copyright']) { file_put_contents($package_directory . 'copyright.txt', $data['copyright']); } $archive = new ABackup($extension . '_' . $data['version']); $archive->archive($package_dir . $extension . '_' . $data['version'] . '.tar.gz', $package_dir, $extension . '_' . $data['version']); if (file_exists($package_dir . $extension . '_' . $data['version'] . '.tar.gz')) { return $package_dir . $extension . '_' . $data['version'] . '.tar.gz'; } else { return false; } }
public function CompressBackup() { if ($this->request->get['eta'] > 30) { set_time_limit((int) $this->request->get['eta'] + 30); } $backup_name = preg_replace('[^0-9A-z_\\.]', '', $this->request->get['backup_name']); $backup_name = !$backup_name ? 'manual_backup' : $backup_name; $bkp = new ABackup($backup_name); $arc_basename = DIR_BACKUP . $bkp->getBackupName(); if (is_file($arc_basename . '.tar')) { unlink($arc_basename . '.tar'); } if (is_file($arc_basename . '.tar.gz')) { unlink($arc_basename . '.tar.gz'); } $result = $bkp->archive($arc_basename . '.tar.gz', DIR_BACKUP, $bkp->getBackupName()); if ($result) { $this->load->library('json'); $this->response->addJSONHeader(); $output = array('result' => true, 'filename' => $bkp->getBackupName()); $this->response->setOutput(AJson::encode($output)); } else { $error = new AError('compress backup error'); return $error->toJSONResponse('APP_ERROR_402', array('error_text' => $bkp->error, 'reset_value' => true)); } }
/** * @param string $task_name * @param array $data * @return array|bool */ public function createBackupTask($task_name, $data = array()) { if (!$task_name) { $this->errors[] = 'Can not to create task. Empty task name given'; } //NOTE: remove temp backup dir before process to prevent progressive increment of directory date if some backup-steps will be failed $bkp = new ABackup('manual_backup'); $bkp->removeBackupDirectory(); unset($bkp); $tm = new ATaskManager(); //1. create new task $task_id = $tm->addTask(array('name' => $task_name, 'starter' => 1, 'created_by' => $this->user->getId(), 'status' => 1, 'start_time' => date('Y-m-d H:i:s', mktime(0, 0, 0, date('m'), date('d') + 1, date('Y'))), 'last_time_run' => '0000-00-00 00:00:00', 'progress' => '0', 'last_result' => '0', 'run_interval' => '0', 'max_execution_time' => '0')); if (!$task_id) { $this->errors = array_merge($this->errors, $tm->errors); return false; } //create step for table backup if ($data['table_list']) { //calculate estimate time for dumping of tables // get sizes of tables $table_list = array(); foreach ($data['table_list'] as $table) { if (!is_string($table)) { continue; } // clean $table_list[] = $this->db->escape($table); } $sql = "SELECT SUM(data_length + index_length - data_free) AS 'db_size'\n\t\t\t\t\tFROM information_schema.TABLES\n\t\t\t\t\tWHERE information_schema.TABLES.table_schema = '" . DB_DATABASE . "'\n\t\t\t\t\t\tAND TABLE_NAME IN ('" . implode("','", $data['table_list']) . "')\t"; if ($prefix_len) { $sql .= " AND TABLE_NAME like '" . DB_PREFIX . "%'"; } $result = $this->db->query($sql); $db_size = $result->row['db_size']; //size in bytes $step_id = $tm->addStep(array('task_id' => $task_id, 'sort_order' => 1, 'status' => 1, 'last_time_run' => '0000-00-00 00:00:00', 'last_result' => '0', 'max_execution_time' => ceil($db_size / 2794843) * 4, 'controller' => 'task/tool/backup/dumptables', 'settings' => array('table_list' => $data['table_list'], 'sql_dump_mode' => $data['sql_dump_mode']))); if (!$step_id) { $this->errors = array_merge($this->errors, $tm->errors); return false; } else { // get eta in seconds. 2794843 - "bytes per seconds" of dumping for Pentium(R) Dual-Core CPU E5200 @ 2.50GHz × 2 $this->eta[$step_id] = ceil($db_size / 2794843) * 4; $this->est_backup_size += ceil($db_size * 1.61); // size of sql-file of output } } //create step for content-files backup if ($data['backup_code']) { //calculate estimate time for copying of code $dirs_size = $this->getCodeSize(); $step_id = $tm->addStep(array('task_id' => $task_id, 'sort_order' => 2, 'status' => 1, 'last_time_run' => '0000-00-00 00:00:00', 'last_result' => '0', 'max_execution_time' => ceil($dirs_size / 28468838), 'controller' => 'task/tool/backup/backupCodeFiles', 'settings' => array('interrupt_on_step_fault' => false))); if (!$step_id) { $this->errors = array_merge($this->errors, $tm->errors); return false; } else { //// get eta in seconds. 28468838 - "bytes per seconds" of copiing of files for SATA III hdd $this->eta[$step_id] = ceil($dirs_size / 28468838); $this->est_backup_size += $dirs_size; } } //create step for content-files backup if ($data['backup_content']) { //calculate estimate time for copying of content files $dirs_size = $this->getContentSize(); $step_id = $tm->addStep(array('task_id' => $task_id, 'sort_order' => 3, 'status' => 1, 'last_time_run' => '0000-00-00 00:00:00', 'last_result' => '0', 'max_execution_time' => ceil($dirs_size / 28468838), 'controller' => 'task/tool/backup/backupContentFiles', 'settings' => array('interrupt_on_step_fault' => false))); if (!$step_id) { $this->errors = array_merge($this->errors, $tm->errors); return false; } else { //// get eta in seconds. 28468838 - "bytes per seconds" of copiing of files for SATA III hdd $this->eta[$step_id] = ceil($dirs_size / 28468838); $this->est_backup_size += $dirs_size; } } //create last step for compressing backup if ($data['compress_backup']) { $step_id = $tm->addStep(array('task_id' => $task_id, 'sort_order' => 4, 'status' => 1, 'last_time_run' => '0000-00-00 00:00:00', 'last_result' => '0', 'max_execution_time' => ceil($this->est_backup_size / 18874368), 'controller' => 'task/tool/backup/compressbackup')); if (!$step_id) { $this->errors = array_merge($this->errors, $tm->errors); return false; } else { //// get eta in seconds. 18874368 - "bytes per seconds" of gz-compression, level 1 on // AMD mobile Athlon XP2400+ 512 MB RAM Linux 2.6.12-rc4 gzip 1.3.3 $this->eta[$step_id] = ceil($this->est_backup_size / 18874368); } } $task_details = $tm->getTaskById($task_id); if ($task_details) { foreach ($this->eta as $step_id => $eta) { $task_details['steps'][$step_id]['eta'] = $eta; } return $task_details; } else { $this->errors[] = 'Can not to get task details for execution'; $this->errors = array_merge($this->errors, $tm->errors); return false; } }
/** * @return bool */ private function _upgradeCore() { $package_info =& $this->session->data['package_info']; if (versionCompare(VERSION, $package_info['package_version'], ">=")) { $this->session->data['error'] = str_replace('%VERSION%', VERSION, $this->language->get('error_core_version')) . $package_info['package_version'] . '!'; unset($this->session->data['package_info']); $this->redirect($this->_get_begin_href()); } $corefiles = $package_info['package_content']['core']; $pmanager = new APackageManager(); //#1 backup files $backup = new ABackup('abantecart_' . str_replace('.', '', VERSION)); foreach ($corefiles as $core_file) { if (file_exists(DIR_ROOT . '/' . $core_file)) { if (!$backup->backupFile(DIR_ROOT . '/' . $core_file, false)) { return false; } } } //#2 backup database if ($backup->dumpDatabase()) { $backup_dirname = $backup->getBackupName(); if ($backup_dirname) { if (!$backup->dumpDatabase()) { $this->session->data['error'] = $backup->error; return false; } if (!$backup->archive(DIR_BACKUP . $backup_dirname . '.tar.gz', DIR_BACKUP, $backup_dirname)) { $this->session->data['error'] = $backup->error; return false; } } else { $this->session->data['error'] = 'Error: Unknown directory name for backup.'; return false; } $install_upgrade_history = new ADataset('install_upgrade_history', 'admin'); $install_upgrade_history->addRows(array('date_added' => date("Y-m-d H:i:s", time()), 'name' => 'Backup before core upgrade. Core version: ' . VERSION, 'version' => VERSION, 'backup_file' => $backup_dirname . '.tar.gz', 'backup_date' => date("Y-m-d H:i:s", time()), 'type' => 'backup', 'user' => $this->user->getUsername())); } else { $this->session->data['error'] = $backup->error; return false; } //#3 replace files $pmanager->replaceCoreFiles(); //#4 run sql and php upgare procedure files $package_dirname = $package_info['tmp_dir'] . $package_info['package_dir']; /** * @var SimpleXmlElement $config */ $config = simplexml_load_string(file_get_contents($package_dirname . '/package.xml')); if (!$config) { $this->session->data['error'] = 'Error: package.xml from package content is not valid xml-file!'; unset($this->session->data['package_info']); $this->redirect($this->_get_begin_href()); } $pmanager->upgradeCore($config); $pmanager->updateCoreVersion((string) $config->version); return true; }
/** * Function make backup and move it into admin/system/backup/directory * @param string $extension_id * @return bool */ public function backupPrevious($extension_id = '') { $old_path = !$extension_id ? DIR_ROOT . '/' . $this->session->data['package_info']['dst_dir'] : DIR_EXT; $package_id = !$extension_id ? $this->session->data['package_info']['package_id'] : $extension_id; if (!$package_id) { return false; } if (file_exists($old_path . $package_id)) { $backup = new ABackup($extension_id); $backup_dirname = $backup->getBackupName(); if ($backup_dirname) { if (!$backup->backupDirectory($old_path . $package_id)) { $this->error = $backup->error; return false; } if (!$backup->dumpDatabase()) { return false; } if (!$backup->archive(DIR_BACKUP . $backup_dirname . '.tar.gz', DIR_BACKUP, $backup_dirname)) { return false; } } else { return false; } $info = $this->extensions->getExtensionInfo($package_id); $install_upgrade_history = new ADataset('install_upgrade_history', 'admin'); $install_upgrade_history->addRows(array('date_added' => date("Y-m-d H:i:s", time()), 'name' => $package_id, 'version' => $info['version'], 'backup_file' => $backup_dirname . '.tar.gz', 'backup_date' => date("Y-m-d H:i:s", time()), 'type' => 'backup', 'user' => $this->user->getUsername())); //delete previous version $this->removeDir($old_path . $package_id); } return true; }
/** * Method of checks before installation process */ public function validate() { $this->error = ''; //1.check is extension directory writable if (!is_writable(DIR_EXT)) { $this->error .= 'Directory ' . DIR_EXT . ' is not writable. Please change permissions for it.' . "\n"; } //2. check temporaty directory. just call method $this->getTempDir(); //3. run validation for backup-process before install $bkp = new ABackup('', false); if (!$bkp->validate()) { $this->error .= implode("\n", $bkp->error); } $this->extensions->hk_ValidateData($this); return $this->error ? false : true; }
public function backup($tables, $rl = true, $config = false) { $sql_dump = ''; // make dump foreach ($tables as $table) { if (DB_PREFIX) { if (strpos($table, DB_PREFIX) === FALSE) { $status = FALSE; } else { $status = TRUE; } } else { $status = TRUE; } if ($status) { $sql_dump .= 'TRUNCATE TABLE `' . $table . '`;' . "\n\n"; $query = $this->db->query("SELECT * FROM `" . $table . "`"); foreach ($query->rows as $result) { $fields = ''; foreach (array_keys($result) as $value) { $fields .= '`' . $value . '`, '; } $values = ''; foreach (array_values($result) as $value) { $value = str_replace(array("", "\n", "\r", ""), array('\\0', '\\n', '\\r', '\\Z'), $value); $value = str_replace(array("\n", "\r", "\t"), array('\\n', '\\r', '\\t'), $value); $value = str_replace('\\', '\\\\', $value); $value = str_replace('\'', '\\\'', $value); $value = str_replace('\\\\n', '\\n', $value); $value = str_replace('\\\\r', '\\r', $value); $value = str_replace('\\\\t', '\\t', $value); $values .= '\'' . $value . '\', '; } $sql_dump .= 'INSERT INTO `' . $table . '` (' . preg_replace('/, $/', '', $fields) . ') VALUES (' . preg_replace('/, $/', '', $values) . ');' . "\n"; } $sql_dump .= "\n\n"; } } $result = false; $bkp = new ABackup('manual_backup'); if (!$bkp->error) { $backup_dir = DIR_BACKUP . $bkp->getBackupName() . '/'; $fp = fopen($backup_dir . 'data/dump.sql', 'w'); fwrite($fp, $sql_dump); fclose($fp); if ($rl) { $bkp->backupDirectory(DIR_RESOURCE, false); } if ($config) { $bkp->backupFile(DIR_ROOT . '/system/config.php', false); } $result = $bkp->archive(DIR_BACKUP . $bkp->getBackupName() . '.tar.gz', DIR_BACKUP, $bkp->getBackupName()); if (!$result) { $this->error = $bkp->error; } else { $this->backup_filename = $bkp->getBackupName(); } } return $result; }