From 9e3775dbc2d1e3038bfcde1154fb78946d3fd7a9 Mon Sep 17 00:00:00 2001 From: mjollnir_ Date: Fri, 23 Mar 2007 06:14:40 +0000 Subject: [PATCH] Backup refactor: moved backup_execute.html into functions, added new backup_course_silently function as proof of concept (matches import_backup_file_silently) --- backup/backup_execute.html | 254 +----------------- backup/backup_form.html | 38 +-- backup/backuplib.php | 534 +++++++++++++++++++++++++++++++++++++ backup/lib.php | 151 ++++++++++- backup/restorelib.php | 13 +- 5 files changed, 696 insertions(+), 294 deletions(-) diff --git a/backup/backup_execute.html b/backup/backup_execute.html index 76f9a0f2af..16abc3a81c 100644 --- a/backup/backup_execute.html +++ b/backup/backup_execute.html @@ -29,10 +29,7 @@ $preferences = new StdClass; backup_fetch_prefs_from_request($preferences,$count,$course); //Another Info - $preferences->moodle_version = $CFG->version; - $preferences->moodle_release = $CFG->release; - $preferences->backup_version = $CFG->backup_version; - $preferences->backup_release = $CFG->backup_release; + backup_add_static_preferences($preferences); if ($count == 0) { notice("No backupable modules are installed!"); @@ -58,254 +55,9 @@ //Start the main ul echo ""; diff --git a/backup/backup_form.html b/backup/backup_form.html index 6a57c4ed6a..1cb94ad4ec 100644 --- a/backup/backup_form.html +++ b/backup/backup_form.html @@ -279,43 +279,9 @@ function selectItemInCheckboxByName(formId, checkName, checked ) { $backup_unique_code = time(); //Calculate the backup string - - //Calculate the backup word - //Take off some characters in the filename !! - $takeoff = array(" ", ":", "/", "\\", "|"); - $backup_word = str_replace($takeoff,"_",moodle_strtolower(get_string("backupfilename"))); - //If non-translated, use "backup" - if (substr($backup_word,0,1) == "[") { - $backup_word= "backup"; - } - - //Calculate the date format string - $backup_date_format = str_replace(" ","_",get_string("backupnameformat")); - //If non-translated, use "%Y%m%d-%H%M" - if (substr($backup_date_format,0,1) == "[") { - $backup_date_format = "%%Y%%m%%d-%%H%%M"; - } - - //Calculate the shortname - $backup_shortname = clean_filename($course->shortname); - if (empty($backup_shortname) or $backup_shortname == '_' ) { - $backup_shortname = $course->id; - } - - //Calculate the final backup filename - //The backup word - $backup_name = $backup_word."-"; - //The shortname - $backup_name .= moodle_strtolower($backup_shortname)."-"; - //The date format - $backup_name .= userdate(time(),$backup_date_format,99,false); - //The extension - $backup_name .= ".zip"; - //And finally, clean everything - $backup_name = clean_filename($backup_name); - //Calculate the backup unique code to allow simultaneus backups (to define //the temp-directory name and records in backup temp tables + $backup_name = backup_get_zipfile_name($course, $backup_unique_code); ?> @@ -328,4 +294,4 @@ function selectItemInCheckboxByName(formId, checkName, checked ) { " /> " /> - \ No newline at end of file + diff --git a/backup/backuplib.php b/backup/backuplib.php index e583a5d84e..70e708befd 100644 --- a/backup/backuplib.php +++ b/backup/backuplib.php @@ -2330,4 +2330,538 @@ } fwrite ($bf, end_tag("ROLES_ASSIGNMENTS", $startlevel, true)); } + + + function backup_execute(&$preferences, &$errorstr) { + global $CFG; + $status = true; + + //Check for temp and backup and backup_unique_code directory + //Create them as needed + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("creatingtemporarystructures").'
  • '; + } + + $status = check_and_create_backup_dir($preferences->backup_unique_code); + //Empty dir + if ($status) { + $status = clear_backup_dir($preferences->backup_unique_code); + } + + //Delete old_entries from backup tables + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("deletingolddata").'
  • '; + } + $status = backup_delete_old_data(); + if (!$status) { + if (!defined('BACKUP_SILENTLY')) { + error ("An error occurred deleting old backup data"); + } + else { + $errorstr = "An error occurred deleting old backup data"; + return false; + } + } + + //Create the moodle.xml file + if ($status) { + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("creatingxmlfile"); + //Begin a new list to xml contents + echo "
  • "; + } + } + + //Now, if selected, copy user files + if ($status) { + if ($preferences->backup_user_files) { + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("copyinguserfiles").'
  • '; + } + if (!$status = backup_copy_user_files ($preferences)) { + if (!defined('BACKUP_SILENTLY')) { + notify("An error occurred while copying user files"); + } + else { + $errorstr = "An error occurred while copying user files"; + return false; + } + } + } + } + + //Now, if selected, copy course files + if ($status) { + if ($preferences->backup_course_files) { + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("copyingcoursefiles").'
  • '; + } + if (!$status = backup_copy_course_files ($preferences)) { + if (!defined('BACKUP_SILENTLY')) { + notify("An error occurred while copying course files"); + } + else { + $errorstr = "An error occurred while copying course files"; + return false; + } + } + } + } + + //Now, zip all the backup directory contents + if ($status) { + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("zippingbackup").'
  • '; + } + if (!$status = backup_zip ($preferences)) { + if (!defined('BACKUP_SILENTLY')) { + notify("An error occurred while zipping the backup"); + } + else { + $errorstr = "An error occurred while zipping the backup"; + return false; + } + } + } + + //Now, copy the zip file to course directory + if ($status) { + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("copyingzipfile").'
  • '; + } + if (!$status = copy_zip_to_course_dir ($preferences)) { + if (!defined('BACKUP_SILENTLY')) { + notify("An error occurred while copying the zip file to the course directory"); + } + else { + $errorstr = "An error occurred while copying the zip file to the course directory"; + return false; + } + } + } + + //Now, clean temporary data (db and filesystem) + if ($status) { + if (!defined('BACKUP_SILENTLY')) { + echo "
  • ".get_string("cleaningtempdata").'
  • '; + } + if (!$status = clean_temp_data ($preferences)) { + if (!defined('BACKUP_SILENTLY')) { + notify("An error occurred while cleaning up temporary data"); + } + else { + $errorstr = "An error occurred while cleaning up temporary data"; + return false; + } + } + } + + return $status; + } + + /** + * This function generates the default zipfile name for a backup + * based on the course id and the unique code. + * + * @param object $course course object + * @param string $backup_unique_code (optional, if left out current timestamp used) + * + + * @return string filename (excluding path information) + */ + function backup_get_zipfile_name($course, $backup_unique_code='') { + + if (empty($backup_unique_code)) { + $backup_unique_code = time(); + } + + //Calculate the backup word + //Take off some characters in the filename !! + $takeoff = array(" ", ":", "/", "\\", "|"); + $backup_word = str_replace($takeoff,"_",moodle_strtolower(get_string("backupfilename"))); + //If non-translated, use "backup" + if (substr($backup_word,0,1) == "[") { + $backup_word= "backup"; + } + + //Calculate the date format string + $backup_date_format = str_replace(" ","_",get_string("backupnameformat")); + //If non-translated, use "%Y%m%d-%H%M" + if (substr($backup_date_format,0,1) == "[") { + $backup_date_format = "%%Y%%m%%d-%%H%%M"; + } + + //Calculate the shortname + $backup_shortname = clean_filename($course->shortname); + if (empty($backup_shortname) or $backup_shortname == '_' ) { + $backup_shortname = $course->id; + } + + //Calculate the final backup filename + //The backup word + $backup_name = $backup_word."-"; + //The shortname + $backup_name .= moodle_strtolower($backup_shortname)."-"; + //The date format + $backup_name .= userdate(time(),$backup_date_format,99,false); + //The extension + $backup_name .= ".zip"; + //And finally, clean everything + $backup_name = clean_filename($backup_name); + + return $backup_name; + + } + + /** + * This function adds on the standard items to the preferences + * Like moodle version and backup version + * + * @param object $preferences existing preferences object. + * (passed by reference) + */ + function backup_add_static_preferences(&$preferences) { + global $CFG; + $preferences->moodle_version = $CFG->version; + $preferences->moodle_release = $CFG->release; + $preferences->backup_version = $CFG->backup_version; + $preferences->backup_release = $CFG->backup_release; + } + ?> diff --git a/backup/lib.php b/backup/lib.php index 25944442e6..3b4668b461 100644 --- a/backup/lib.php +++ b/backup/lib.php @@ -104,6 +104,12 @@ //Copied from the web !! function delete_dir_contents ($dir,$excludeddir="") { + if (!is_dir($dir)) { + // if we've been given a directory that doesn't exist yet, return true. + // this happens when we're trying to clear out a course that has only just + // been created. + return true; + } $slash = "/"; // Create arrays to store files and directories @@ -599,10 +605,15 @@ * @param int $destinationcourse the course id to restore to. * @param boolean $emptyfirst whether to delete all coursedata first. * @param boolean $userdata whether to include any userdata that may be in the backup file. + * @param array $preferences optional, 0 will be used. Can contain: + * metacourse + * logs + * course_files + * messages */ - function import_backup_file_silently($pathtofile,$destinationcourse,$emptyfirst=false,$userdata=false) { + function import_backup_file_silently($pathtofile,$destinationcourse,$emptyfirst=false,$userdata=false, $preferences=array()) { global $CFG,$SESSION,$USER; // is there such a thing on cron? I guess so.. - + global $restore; // ick if (empty($USER)) { $USER = get_admin(); $USER->admin = 1; // not sure why, but this doesn't get set @@ -666,12 +677,24 @@ return false; } - restore_setup_for_check($SESSION->restore,$backup_unique_code); + $SESSION->restore = new StdClass; // add on some extra stuff we need... - $SESSION->restore->restoreto = 1; - $SESSION->restore->course_id = $destinationcourse; - $SESSION->restore->deleting = $emptyfirst; + $SESSION->restore->metacourse = $restore->metacourse = (isset($preferences['restore_metacourse']) ? $preferences['restore_metacourse'] : 0); + $SESSION->restore->restoreto = $restore->restoreto = 1; + $SESSION->restore->users = $restore->users = $userdata; + $SESSION->restore->logs = $restore->logs = (isset($preferences['restore_logs']) ? $preferences['restore_logs'] : 0); + $SESSION->restore->user_files = $restore->user_files = $userdata; + $SESSION->restore->messages = $restore->messages = (isset($preferences['restore_messages']) ? $preferences['restore_messages'] : 0); + $SESSION->restore->course_id = $restore->course_id = $destinationcourse; + $SESSION->restore->restoreto = 1; + $SESSION->restore->course_id = $destinationcourse; + $SESSION->restore->deleting = $emptyfirst; + $SESSION->restore->restore_course_files = $restore->course_files = (isset($preferences['restore_course_files']) ? $preferences['restore_course_files'] : 0); + $SESSION->restore->backup_version = $SESSION->info->backup_backup_version; + $SESSION->restore->course_startdateoffset = $course->startdate - $SESSION->course_header->course_startdate; + + restore_setup_for_check($SESSION->restore,$backup_unique_code); // maybe we need users (defaults to 2 in restore_setup_for_check) if (!empty($userdata)) { @@ -687,8 +710,14 @@ $SESSION->restore->mods[$modname]->restore = true; $SESSION->restore->mods[$modname]->userinfo = $userdata; } + else { + // avoid warnings + $SESSION->restore->mods[$modname]->restore = false; + $SESSION->restore->mods[$modname]->userinfo = false; + } } } + $restore = clone($SESSION->restore); if (!restore_execute($SESSION->restore,$SESSION->info,$SESSION->course_header,$errorstr)) { mtrace($debuginfo.'Failed restore_execute (error was '.$errorstr.')'); return false; @@ -696,4 +725,114 @@ return true; } + /** + * Function to backup an entire course silently and create a zipfile. + * + * @param int $courseid the id of the course + * @param array $prefs see {@link backup_generate_preferences_artificially} + */ + function backup_course_silently($courseid, $prefs, &$errorstring) { + global $CFG, $preferences; // global preferences here because something else wants it :( + define('BACKUP_SILENTLY', 1); + if (!$course = get_record('course', 'id', $courseid)) { + debugging("Couldn't find course with id $courseid in backup_course_silently"); + return false; + } + $preferences = backup_generate_preferences_artificially($course, $prefs); + if (backup_execute($preferences, $errorstring)) { + return $CFG->dataroot . '/' . $course->id . '/backupdata/' . $preferences->backup_name; + } + else { + return false; + } + } + + /** + * Function to generate the $preferences variable that + * backup uses. This will back up all modules and instances in a course. + * + * @param object $course course object + * @param array $prefs can contain: + backup_metacourse + backup_users + backup_logs + backup_user_files + backup_course_files + backup_messages + * and if not provided, they will not be included. + */ + + function backup_generate_preferences_artificially($course, $prefs) { + global $CFG; + $preferences = new StdClass; + $preferences->backup_unique_code = time(); + $preferences->backup_name = backup_get_zipfile_name($course, $preferences->backup_unique_code); + $count = 0; + + if ($allmods = get_records("modules") ) { + foreach ($allmods as $mod) { + $modname = $mod->name; + $modfile = "$CFG->dirroot/mod/$modname/backuplib.php"; + $modbackup = $modname."_backup_mods"; + $modbackupone = $modname."_backup_one_mod"; + $modcheckbackup = $modname."_check_backup_mods"; + if (!file_exists($modfile)) { + continue; + } + include_once($modfile); + if (!function_exists($modbackup) || !function_exists($modcheckbackup)) { + continue; + } + $var = "exists_".$modname; + $preferences->$var = true; + $count++; + // check that there are instances and we can back them up individually + if (!count_records('course_modules','course',$course->id,'module',$mod->id) || !function_exists($modbackupone)) { + continue; + } + $var = 'exists_one_'.$modname; + $preferences->$var = true; + $varname = $modname.'_instances'; + $preferences->$varname = get_all_instances_in_course($modname,$course); + foreach ($preferences->$varname as $instance) { + $preferences->mods[$modname]->instances[$instance->id]->name = $instance->name; + $var = 'backup_'.$modname.'_instance_'.$instance->id; + $preferences->$var = true; + $preferences->mods[$modname]->instances[$instance->id]->backup = true; + $var = 'backup_user_info_'.$modname.'_instance_'.$instance->id; + $preferences->$var = true; + $preferences->mods[$modname]->instances[$instance->id]->userinfo = true; + $var = 'backup_'.$modname.'_instances'; + $preferences->$var = 1; // we need this later to determine what to display in modcheckbackup. + } + + //Check data + //Check module info + $preferences->mods[$modname]->name = $modname; + + $var = "backup_".$modname; + $preferences->$var = true; + $preferences->mods[$modname]->backup = true; + + //Check include user info + $var = "backup_user_info_".$modname; + $preferences->$var = true; + $preferences->mods[$modname]->userinfo = true; + + } + } + + //Check other parameters + $preferences->backup_metacourse = (isset($prefs['backup_metacourse']) ? $prefs['backup_metacourse'] : 0); + $preferences->backup_users = (isset($prefs['backup_users']) ? $prefs['backup_users'] : 0); + $preferences->backup_logs = (isset($prefs['backup_logs']) ? $prefs['backup_logs'] : 0); + $preferences->backup_user_files = (isset($prefs['backup_user_files']) ? $prefs['backup_user_files'] : 0); + $preferences->backup_course_files = (isset($prefs['backup_course_files']) ? $prefs['backup_course_files'] : 0); + $preferences->backup_messages = (isset($prefs['backup_messages']) ? $prefs['backup_messages'] : 0); + $preferences->backup_course = $course->id; + backup_add_static_preferences($preferences); + return $preferences; + } + + ?> diff --git a/backup/restorelib.php b/backup/restorelib.php index 855e08031d..6e51e4a267 100644 --- a/backup/restorelib.php +++ b/backup/restorelib.php @@ -6328,7 +6328,18 @@ } if ($status = restore_close_html($restore)){ - echo '
  • Closing the Restorelog.html file.
  • '; + if (!defined('RESTORE_SILENTLY')) { + echo '
  • Closing the Restorelog.html file.
  • '; + } + } + else { + if (!defined('RESTORE_SILENTLY')) { + notify("Could not close the restorelog.html file"); + } + else { + $errorstr = "Could not close the restorelog.html file"; + return false; + } } if (!defined('RESTORE_SILENTLY')) { -- 2.39.5