protected function unzip() { // 一時ディレクトリにZIPを展開 $temp_dir = $this->getTempDir() . '/'; $temp_zip = $temp_dir . $this->zip_name; if (!backup_copy_file($this->zip_dir . '/' . $this->zip_name, $temp_zip)) { throw new SharingCart_Exception('Unzip failure - backup_copy_file("' . $this->zip_dir . '/' . $this->zip_name . '", "' . $temp_zip . '")'); } if (!restore_unzip($temp_zip)) { throw new SharingCart_Exception('Unzip failure'); } // blackboard の変換 global $CFG; require_once $CFG->dirroot . '/backup/bb/restore_bb.php'; if (!blackboard_convert($temp_dir)) { throw new SharingCart_Exception('Backboard convertion failure'); } }
/** * @param string $errorstr passed by reference, if silent is true, * errorstr will be populated and this function will return false rather than calling error() or notify() * @param boolean $noredirect (optional) if this is passed, this function will not print continue, or * redirect to the next step in the restore process, instead will return $backup_unique_code */ function restore_precheck($id, $file, &$errorstr, $noredirect = false) { global $CFG, $SESSION; //Prepend dataroot to variable to have the absolute path $file = $CFG->dataroot . "/" . $file; if (!defined('RESTORE_SILENTLY')) { //Start the main table echo "<table cellpadding=\"5\">"; echo "<tr><td>"; //Start the mail ul echo "<ul>"; } //Check the file exists if (!is_file($file)) { if (!defined('RESTORE_SILENTLY')) { error("File not exists ({$file})"); } else { $errorstr = "File not exists ({$file})"; return false; } } //Check the file name ends with .zip if (!substr($file, -4) == ".zip") { if (!defined('RESTORE_SILENTLY')) { error("File has an incorrect extension"); } else { $errorstr = 'File has an incorrect extension'; return false; } } //Now calculate the unique_code for this restore $backup_unique_code = time(); //Now check and create the backup dir (if it doesn't exist) if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("creatingtemporarystructures") . '</li>'; } $status = check_and_create_backup_dir($backup_unique_code); //Empty dir if ($status) { $status = clear_backup_dir($backup_unique_code); } //Now delete old data and directories under dataroot/temp/backup if ($status) { if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("deletingolddata") . '</li>'; } $status = backup_delete_old_data(); } //Now copy he zip file to dataroot/temp/backup/backup_unique_code if ($status) { if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("copyingzipfile") . '</li>'; } if (!($status = backup_copy_file($file, $CFG->dataroot . "/temp/backup/" . $backup_unique_code . "/" . basename($file)))) { if (!defined('RESTORE_SILENTLY')) { notify("Error copying backup file. Invalid name or bad perms."); } else { $errorstr = "Error copying backup file. Invalid name or bad perms"; return false; } } } //Now unzip the file if ($status) { if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("unzippingbackup") . '</li>'; } if (!($status = restore_unzip($CFG->dataroot . "/temp/backup/" . $backup_unique_code . "/" . basename($file)))) { if (!defined('RESTORE_SILENTLY')) { notify("Error unzipping backup file. Invalid zip file."); } else { $errorstr = "Error unzipping backup file. Invalid zip file."; return false; } } } //Check for Blackboard backups and convert if ($status) { require_once "{$CFG->dirroot}/backup/bb/restore_bb.php"; if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("checkingforbbexport") . '</li>'; } $status = blackboard_convert($CFG->dataroot . "/temp/backup/" . $backup_unique_code); } //Now check for the moodle.xml file if ($status) { $xml_file = $CFG->dataroot . "/temp/backup/" . $backup_unique_code . "/moodle.xml"; if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("checkingbackup") . '</li>'; } if (!($status = restore_check_moodle_file($xml_file))) { if (!is_file($xml_file)) { $errorstr = 'Error checking backup file. moodle.xml not found at root level of zip file.'; } else { $errorstr = 'Error checking backup file. moodle.xml is incorrect or corrupted.'; } if (!defined('RESTORE_SILENTLY')) { notify($errorstr); } else { return false; } } } $info = ""; $course_header = ""; //Now read the info tag (all) if ($status) { if (!defined('RESTORE_SILENTLY')) { echo "<li>" . get_string("readinginfofrombackup") . '</li>'; } //Reading info from file $info = restore_read_xml_info($xml_file); //Reading course_header from file $course_header = restore_read_xml_course_header($xml_file); if (!is_object($course_header)) { // ensure we fail if there is no course header $course_header = false; } } if (!defined('RESTORE_SILENTLY')) { //End the main ul echo "</ul>\n"; //End the main table echo "</td></tr>"; echo "</table>"; } //We compare Moodle's versions if ($CFG->version < $info->backup_moodle_version && $status) { $message = new object(); $message->serverversion = $CFG->version; $message->serverrelease = $CFG->release; $message->backupversion = $info->backup_moodle_version; $message->backuprelease = $info->backup_moodle_release; print_simple_box(get_string('noticenewerbackup', '', $message), "center", "70%", '', "20", "noticebox"); } //Now we print in other table, the backup and the course it contains info if ($info and $course_header and $status) { //First, the course info if (!defined('RESTORE_SILENTLY')) { $status = restore_print_course_header($course_header); } //Now, the backup info if ($status) { if (!defined('RESTORE_SILENTLY')) { $status = restore_print_info($info); } } } //Save course header and info into php session if ($status) { $SESSION->info = $info; $SESSION->course_header = $course_header; } //Finally, a little form to continue //with some hidden fields if ($status) { if (!defined('RESTORE_SILENTLY')) { echo "<br /><div style='text-align:center'>"; $hidden["backup_unique_code"] = $backup_unique_code; $hidden["launch"] = "form"; $hidden["file"] = $file; $hidden["id"] = $id; print_single_button("restore.php", $hidden, get_string("continue"), "post"); echo "</div>"; } else { if (empty($noredirect)) { // in 2.0 we must not print "Continue" redirect link here, because ppl click on it and the execution gets interrupted on next page!!! // imo RESTORE_SILENTLY is an ugly hack :-P $sillystr = get_string('donotclickcontinue'); redirect($CFG->wwwroot . '/backup/restore.php?backup_unique_code=' . $backup_unique_code . '&launch=form&file=' . $file . '&id=' . $id, $sillystr, 0); } else { return $backup_unique_code; } } } if (!$status) { if (!defined('RESTORE_SILENTLY')) { error("An error has ocurred"); } else { $errorstr = "An error has occured"; // helpful! :P return false; } } return true; }
public static function restoreCourse($preferences, $session) { global $Out; // the initial set of preferences should be enough to get the restore started. // once in progress the restore will obtain the preferences from the backup file // itself if (!isset($preferences)) { return null; } // Assumes the backup file is in the course data directory and the // preferences are in the backup file itself. global $CFG; // for large files uncomment following code //@ini_set("max_execution_time","3000"); //raise_memory_limit("192M"); $file = self::createBackupFilePath($preferences->course_id); $file .= '/' . $preferences->backup_name; //path to file //Check the file exists if (!is_file($file)) { return false; } //Check the file name ends with .zip if (!substr($file, -4) == ".zip") { return false; } //Now calculate the unique_code for this restore $backup_unique_code = $preferences->backup_unique_code; //Now check and create the backup dir (if it doesn't exist) $status = check_and_create_backup_dir($backup_unique_code); //Empty dir if ($status) { $status = clear_backup_dir($backup_unique_code); } //Now delete old data and directories under dataroot/temp/backup if ($status) { $status = backup_delete_old_data(); } $tempBackupPath = synch_backup_controller::createTempBackupPath($backup_unique_code); //Now copy the zip file to dataroot/temp/backup/backup_unique_code if ($status) { if (!($status = backup_copy_file($file, $tempBackupPath . "/" . basename($file)))) { // There has been a problem. Invalid name or bad perms return false; } } //Now unzip the file if ($status) { if (!($status = restore_unzip($tempBackupPath . "/" . basename($file)))) { // error: Invalid zip file return false; } } //Check for Blackboard backups and convert if ($status) { require_once "{$CFG->dirroot}/backup/bb/restore_bb.php"; $status = blackboard_convert($tempBackupPath); } // backup file has now been unpacked. Retrieve the serialized preferences $preferencesPath = $tempBackupPath . '/' . self::getPreferencesFileName(); $preferences = FileSystem::unSerializeFromFile($preferencesPath); // Now we have the preferences from the backup we need to tailor it to our current needs // should we be updating an existing item or creating one. $dataItemId = SynchContentHierarchy::generateDataItemId($preferences->course_id, synch_view_controller::$TYPE_ID_COURSE); global $SynchManager, $SynchServerController; $itemExists = $SynchManager->getSessionItemExistsByServerId($SynchServerController->getServerId(), $session); if (isset($itemExists) && is_array($itemExists) && in_array($dataItemId, $itemExists)) { $preferences->restoreto = 1; $preferences->deleting = 1; } else { $preferences->restoreto = 2; } //Now check for the moodle.xml file if ($status) { $xml_file = $tempBackupPath . "/moodle.xml"; if (!($status = restore_check_moodle_file($xml_file))) { if (!is_file($xml_file)) { //Error checking backup file. moodle.xml not found at root level of zip file return false; } else { //Error checking backup file. moodle.xml is incorrect or corrupted. return false; } } } //unpack backup file //read contents //Reading info from file $info = restore_read_xml_info($xml_file); //Reading course_header from file $courseHeader = restore_read_xml_course_header($xml_file); //Save course header and info into php session if ($status) { //$SESSION->info = $info; //$SESSION->course_header = $course_header; } global $restore; $restore = $preferences; $message = null; $restoreSuccess = restore_execute($preferences, $info, $courseHeader, $message); return $restoreSuccess; }