/** * Export labs, configs and devices * * @param array $labs List of labs to be exported * @param array $configs List of configs to be exported * @param string $file_export File where export data * @return bool True if successfully exported */ function export($labs, $configs, $file_export) { $file_tmp = '/tmp/iou-web-export.db'; // Delete destination file if exists if (file_exists($file_export) && !unlink($file_export)) { error_log('DB: cannot delete the database file' . $file_export . '.'); return false; } // Create a database if (!database_init($file_tmp)) { error_log('DB: cannot reinitializate database file' . $file_tmp . '.'); return false; } try { global $db; // Attach the temporary database $query = "ATTACH '" . $file_tmp . "' AS export_db;"; $statement = $db->prepare($query); $statement->execute(); $db->beginTransaction(); // Current version is stored $query = "CREATE TABLE export_db.data (data_name TEXT, data_value TEXT)"; $db->query($query); $query = "INSERT INTO export_db.data (data_name, data_value) VALUES ('db_version', '" . VERSION . "')"; $db->query($query); // Export data if ($configs != false) { $query = "INSERT INTO export_db.configs (cfg_id, cfg_name, cfg_config) SELECT cfg_id, cfg_name, cfg_config FROM main.configs WHERE cfg_name LIKE '" . implode(" - %' OR cfg_name LIKE '", $configs) . " - %' ORDER BY cfg_id"; $db->query($query); } if ($labs != false) { $query = "INSERT INTO export_db.devices (dev_id, lab_id, dev_name, bin_name, dev_ram, dev_nvram, dev_ethernet, dev_serial, dev_picture, cfg_id, dev_top, dev_left, dev_l2keepalive, dev_watchdog) SELECT dev_id, lab_id, dev_name, bin_name, dev_ram, dev_nvram, dev_ethernet, dev_serial, dev_picture, cfg_id, dev_top, dev_left, dev_l2keepalive, dev_watchdog FROM devices WHERE lab_id=" . implode(" OR lab_id=", $labs) . " ORDER BY lab_id"; $db->query($query); $query = "INSERT INTO export_db.labs (lab_id, lab_name, lab_description, lab_info, lab_netmap, lab_diagram, lab_time, lab_points) SELECT lab_id, lab_name, lab_description, lab_info, lab_netmap, lab_diagram, lab_time, lab_points FROM labs WHERE lab_id=" . implode(" OR lab_id=", $labs) . " ORDER BY lab_id"; $db->query($query); $query = "INSERT INTO export_db.rel_img_lab (img_id, lab_id) SELECT img_id, lab_id FROM main.rel_img_lab WHERE main.rel_img_lab.lab_id=" . implode(" OR main.rel_img_lab.lab_id=", $labs) . ";"; $db->query($query); // INSERT OR REPLACE used because multiple labs can be linked to the same image (Integrity constraint violation: 19 PRIMARY KEY must be unique") $query = "INSERT OR REPLACE INTO export_db.images (img_id, img_name, img_info, img_content, img_map) SELECT DISTINCT img_id, img_name, img_info, img_content, img_map FROM main.images NATURAL JOIN main.rel_img_lab WHERE main.rel_img_lab.lab_id=" . implode(" OR main.rel_img_lab.lab_id=", $labs) . ";"; $db->query($query); } $db->commit(); $query = "DETACH 'export_db';"; $statement = $db->prepare($query); $statement->execute(); } catch (PDOException $e) { error_log('DB: cannot export data with error "' . $e->getMessage() . '" (query was "' . $query . '".'); return false; } // Now optimize the DB if (!database_optimize($file_tmp)) { return false; } $exported_db = new PDO('sqlite:' . $file_tmp); $exported_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); try { $fp = gzopen($file_export, 'w9'); gzwrite($fp, file_get_contents($file_tmp)); gzclose($fp); return true; } catch (Exception $e) { error_log('DB: cannot compress the database with error "' . $e->getMessage() . '".'); return false; } }
<? require_once '../../../inc/database.inc.php'; if (isset($_POST['message'])) { $link = database_init(); save_message($link, $_POST['message']); } header('Location: /status/admin/'); ?>
} } else { $status = 'Error'; $message = 'Admin privileges required.'; } xml_message('AJAX ' . $action, $status, $message); break; /************************************************************************* * Database: wipe * *************************************************************************/ /************************************************************************* * Database: wipe * *************************************************************************/ case 'db_wipe': if (is_admin()) { if (database_init(DATABASE)) { $status = 'Informational'; $message = 'Database reinitializated.'; session_unset(); unset($GLOBAL['all_configs']); unset($GLOBAL['all_configpack']); unset($GLOBAL['all_bins']); unset($GLOBAL['all_images']); unset($GLOBAL['all_folders']); unset($GLOBAL['all_labs']); } else { $status = 'Error'; $message = 'Cannot reinitializated the database. Check logs (under Downloads page) for additional informations.'; } } else { $status = 'Error';