dirroot . '/backup/util/includes/backup_includes.php'); require_once($CFG->dirroot . "/backup/util/includes/restore_includes.php"); $courseid = $_GET["courseid"]; $categoryid = $_GET["categoryid"]; $timestamp = $_GET["timestamp"]; try { $course = get_course($courseid); } catch (Exception $ex) { $course = null; } if (!$course) { if (!get_course(((int) $courseid) - 1)) { die("Cannot recreate course with this ID!"); } } if ($course && !$categoryid) { $categoryid = $course->category; } $category = $DB->get_record('course_categories', array('id' => $categoryid), '*', MUST_EXIST); $replicationconfig = get_config('local_replication'); $directory = $replicationconfig->directory; $infile = $directory . DIRECTORY_SEPARATOR . "course_" . $courseid . "_" . $categoryid . "_" . $timestamp . ".mbz"; if (empty($CFG->tempdir)) { $CFG->tempdir = $CFG->dataroot . DIRECTORY_SEPARATOR . 'temp'; } if (!file_exists($infile)) { die("Backup file '" . $infile . "' does not exist."); } if (!is_readable($infile)) { die("Backup file '" . $infile . "' is not readable."); } $backupdir = "restore_" . uniqid(); if (isset($CFG->backuptempdir)){ $path = $CFG->backuptempdir . DIRECTORY_SEPARATOR . $backupdir; } else{ $path = $CFG->tempdir . DIRECTORY_SEPARATOR . "backup" . DIRECTORY_SEPARATOR . $backupdir; } $fp = get_file_packer('application/vnd.moodle.backup'); $fp->extract_to_pathname($infile, $path); $xmlfile = $path . DIRECTORY_SEPARATOR . "course" . DIRECTORY_SEPARATOR . "course.xml"; $xml = simplexml_load_file($xmlfile); $fullname = $xml->xpath('/course/fullname'); if (!$fullname) { $fullname = $xml->xpath('/MOODLE_BACKUP/COURSE/HEADER/FULLNAME'); } $shortname = $xml->xpath('/course/shortname'); if (!$shortname) { $shortname = $xml->xpath('/MOODLE_BACKUP/COURSE/HEADER/SHORTNAME'); } $fullname = (string)($fullname[0]); $shortname = (string)($shortname[0]); if (!$fullname) { $fullname = $shortname; } if (!$course && $DB->get_record('course', array('category' => $category->id, 'shortname' => $shortname))) { $matches = NULL; preg_match('/(.*)_(\d+)$/', $shortname, $matches); if ($matches) { $base = $matches[1]; $number = $matches[2]; } else { $base = $shortname; $number = 1; } $shortname = $base . '_' . $number; while ($DB->get_record('course', array('category' => $category->id, 'shortname' => $shortname))) { $number++; $shortname = $base . '_' . $number; } } if ($course) { echo "Overwriting current content of existing course -> Course ID: $courseid\n"; $rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $USER->id, 0); } else { echo "Creating new course to restore backup\n"; $courseid = restore_dbops::create_new_course($fullname, $shortname, $category->id); $rc = new restore_controller($backupdir, $courseid, backup::INTERACTIVE_NO, backup::MODE_GENERAL, $USER->id, backup::TARGET_NEW_COURSE); } if ($rc->get_status() == backup::STATUS_REQUIRE_CONV) { $rc->convert(); } $plan = $rc->get_plan(); if (!$rc->execute_precheck()){ $check = $rc->get_precheck_results(); echo("Restore pre-check failed!"); var_dump($check); die(); } $deletingoptions = array(); $deletingoptions['keep_roles_and_enrolments'] = 1; $deletingoptions['keep_groups_and_groupings'] = 1; restore_dbops::delete_course_content($courseid, $deletingoptions); $rc->execute_plan(); $rc->destroy(); #unlink($infile); $course = get_course($courseid); $course->category = $categoryid; $course->fullname = $fullname; $course->shortname = $shortname; $DB->update_record('course', $course); echo "New course ID for '$shortname': $courseid in category {$category->id}\n"; echo "OK"