moodle-local_replication/import.php
2022-08-22 09:52:55 +00:00

137 lines
3.8 KiB
PHP

<?php
require_once("../../config.php");
require_once($CFG->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"