$status = true;
+ $emailpending = false;
+
//Get now
$now = time();
//Now we backup every course with nextstarttime < now
if ($backup_course->nextstarttime > 0 && $backup_course->nextstarttime < $now) {
//Set laststarttime
- set_field("backup_courses","laststarttime",time(),"id",$backup_course->courseid);
+ $starttime = time();
+ set_field("backup_courses","laststarttime",$starttime,"id",$backup_course->courseid);
//Launch backup
- $course_status = schedule_backup_launch_backup($course);
+ $course_status = schedule_backup_launch_backup($course,$starttime);
+ //We have to send a email because we have included at least one backup
+ $emailpending = true;
//Set lastendtime
set_field("backup_courses","lastendtime",time(),"id",$backup_course->courseid);
//Set laststatus
delete_records_select("backup_log", "laststarttime < '$loglifetime'");
}
+ //Send email to admin
+ if ($emailpending) {
+ echo " Sending email to admin\n";
+ $message = "";
+ //Build the message text (future versions should handle html messages too!!)
+ $logs = get_records_select ("backup_log","laststarttime >= '$now'","id");
+ if ($logs) {
+ $currentcourse = 1;
+ foreach ($logs as $log) {
+ if ($currentcourse != $log->courseid) {
+ $message .= "\n==================================================\n\n";
+ $currentcourse = $log->courseid;
+ }
+ $message .= userdate($log->time,"%T",$admin->timezone)." ".$log->info."\n";
+ }
+ }
+ //Send the message
+ email_to_user($admin,$admin,get_string("scheduledbackupstatus"),$message);
+ }
+
+
//Everything is finished stop backup_sche_running
backup_set_config("backup_sche_running","0");
//This function executes the ENTIRE backup of a course (passed as parameter)
//using all the scheduled backup preferences
-function schedule_backup_launch_backup($course) {
+function schedule_backup_launch_backup($course,$starttime = 0) {
$preferences = false;
$status = false;
echo " Executing backup\n";
- $preferences = schedule_backup_course_configure($course);
+ schedule_backup_log($starttime,$course->id,"Start backup course $course->fullname");
+ schedule_backup_log($starttime,$course->id," Phase 1: Checking and counting:");
+ $preferences = schedule_backup_course_configure($course,$starttime);
if ($preferences) {
- $status = schedule_backup_course_execute($preferences);
+ schedule_backup_log($starttime,$course->id," Phase 2: Executing and copying:");
+ $status = schedule_backup_course_execute($preferences,$starttime);
}
if ($status && $preferences) {
echo " End backup OK\n";
+ schedule_backup_log($starttime,$course->id,"End backup course $course->fullname - OK");
} else {
echo " End backup with ERROR\n";
+ schedule_backup_log($starttime,$course->id,"End backup course $course->fullname - ERROR!!");
}
return $status && $preferences;
}
+//This function saves to backup_log all the needed process info
+//to use it later. NOTE: If $starttime = 0 no info in saved
+function schedule_backup_log($starttime,$courseid,$message) {
+
+ if ($starttime) {
+ $log->courseid = $courseid;
+ $log->time = time();
+ $log->laststarttime = $starttime;
+ $log->info = $message;
+
+ insert_record ("backup_log",$log);
+ }
+
+}
+
//This function returns the next future GMT time to execute the course based in the
//configuration of the scheduled backups
function schedule_backup_next_execution ($backup_course,$backup_config,$now,$timezone) {
//This function implements all the needed code to prepare a course
//to be in backup (insert temp info into backup temp tables).
-function schedule_backup_course_configure($course) {
+function schedule_backup_course_configure($course,$starttime = 0) {
global $CFG;
$status = true;
+ schedule_backup_log($starttime,$course->id," checking parameters");
+
//Check the required variable
if (empty($course->id)) {
$status = false;
//Calculate the backup string
if ($status) {
+ schedule_backup_log($starttime,$course->id," calculating backup name");
//Take off some characters in the filename !!
$takeoff = array(" ", ":", "/", "\\", "|");
$backup_name = str_replace($takeoff,"_",strtolower(get_string("backupfilename")));
//Calculate necesary info to backup modules
if ($status) {
+ schedule_backup_log($starttime,$course->id," calculating modules data");
if ($allmods = get_records("modules") ) {
foreach ($allmods as $mod) {
$modname = $mod->name;
$var = "backup_user_info_".$modname;
//Call the check function to show more info
$modcheckbackup = $modname."_check_backup_mods";
+ schedule_backup_log($starttime,$course->id," $modname");
$modcheckbackup($course->id,$$var,$backup_unique_code);
}
}
//Now calculate the users
if ($status) {
+ schedule_backup_log($starttime,$course->id," calculating users");
user_check_backup($course->id,$backup_unique_code,$preferences->backup_users);
}
//Now calculate the logs
if ($status) {
if ($preferences->backup_logs) {
+ schedule_backup_log($starttime,$course->id," calculating logs");
log_check_backup($course->id);
}
}
//Now calculate the userfiles
if ($status) {
if ($preferences->backup_user_files) {
+ schedule_backup_log($starttime,$course->id," calculating user files");
user_files_check_backup($course->id,$preferences->backup_unique_code);
}
}
//Now calculate the coursefiles
if ($status) {
if ($preferences->backup_course_files) {
+ schedule_backup_log($starttime,$course->id," calculating course files");
course_files_check_backup($course->id,$preferences->backup_unique_code);
}
}
//This function implements all the needed code to backup a course
//copying it to the desired destination (default if not specified)
-function schedule_backup_course_execute($preferences) {
+function schedule_backup_course_execute($preferences,$starttime = 0) {
global $CFG;
//Check for temp and backup and backup_unique_code directory
//Create them as needed
+ schedule_backup_log($starttime,$preferences->backup_course," checking temp structures");
$status = check_and_create_backup_dir($preferences->backup_unique_code);
//Empty dir
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," cleaning old data");
$status = clear_backup_dir($preferences->backup_unique_code);
}
//Create the moodle.xml file
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," creating backup file");
//Obtain the xml file (create and open) and print prolog information
$backup_file = backup_open_xml($preferences->backup_unique_code);
//Prints general info about backup to file
if ($backup_file) {
+ schedule_backup_log($starttime,$preferences->backup_course," general info");
$status = backup_general_info($backup_file,$preferences);
} else {
$status = false;
//Section info
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," sections info");
$status = backup_course_sections($backup_file,$preferences);
}
//User info
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," user info");
$status = backup_user_info($backup_file,$preferences);
}
//If we have selected to backup quizzes, backup categories and
//questions structure (step 1). See notes on mod/quiz/backuplib.php
if ($status and $preferences->mods['quiz']->backup) {
+ schedule_backup_log($starttime,$preferences->backup_course," categories & questions");
$status = quiz_backup_question_categories($backup_file,$preferences);
}
//Print logs if selected
if ($status) {
if ($preferences->backup_logs) {
+ schedule_backup_log($starttime,$preferences->backup_course," logs");
$status = backup_log_info($backup_file,$preferences);
}
}
//Print scales info
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," scales");
$status = backup_scales_info($backup_file,$preferences);
}
}
//If we have to backup some module
if ($mods_to_backup) {
+ schedule_backup_log($starttime,$preferences->backup_course," modules");
//Start modules tag
$status = backup_modules_start ($backup_file,$preferences);
//Iterate over modules and call backup
foreach ($preferences->mods as $module) {
if ($module->backup and $status) {
+ schedule_backup_log($starttime,$preferences->backup_course," $module->name");
$status = backup_module($backup_file,$preferences,$module->name);
}
}
//Now, if selected, copy user files
if ($status) {
if ($preferences->backup_user_files) {
+ schedule_backup_log($starttime,$preferences->backup_course," copying user files");
$status = backup_copy_user_files ($preferences);
}
}
//Now, if selected, copy course files
if ($status) {
if ($preferences->backup_course_files) {
+ schedule_backup_log($starttime,$preferences->backup_course," copying course files");
$status = backup_copy_course_files ($preferences);
}
}
//Now, zip all the backup directory contents
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," zipping files");
$status = backup_zip ($preferences);
}
//Now, copy the zip file to course directory
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," copying backup");
$status = copy_zip_to_course_dir ($preferences);
}
//Now, clean temporary data (db and filesystem)
if ($status) {
+ schedule_backup_log($starttime,$preferences->backup_course," cleaning temp data");
$status = clean_temp_data ($preferences);
}