ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç PK}\ly3lang/en/report_backups.phpnu[. /** * Strings for component 'report_backups' * * @package report * @subpackage backups * @copyright 2007 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ $string['backupofcourselogs'] = 'Backup logs of {$a}'; $string['logsofbackupexecutedon'] = 'Logs of the backup executed on {$a}'; $string['nobackupsfound'] = 'There were no backups found.'; $string['nologsfound'] = 'There were no logs found for this backup.'; $string['pluginname'] = 'Backups report'; $string['strftimetime'] = '%I:%M:%S %p'; $string['viewlogs'] = 'View logs'; $string['privacy:metadata'] = 'The Backups reports plugin does not store any personal data.'; PK}\8 version.phpnu[. /** * Version details. * * @package report * @subpackage backups * @copyright 2007 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die; $plugin->version = 2025041400; // The current plugin version (Date: YYYYMMDDXX). $plugin->requires = 2025040800; // Requires this Moodle version. $plugin->component = 'report_backups'; // Full name of the plugin (used for diagnostics) PK}\bclasses/privacy/provider.phpnu[. /** * Privacy Subsystem implementation for report_backups. * * @package report_backups * @copyright 2018 Zig Tan * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace report_backups\privacy; defined('MOODLE_INTERNAL') || die(); /** * Privacy Subsystem for report_backups implementing null_provider. * * @copyright 2018 Zig Tan * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class provider implements \core_privacy\local\metadata\null_provider { /** * Get the language string identifier with the component's language * file to explain why this plugin stores no data. * * @return string */ public static function get_reason(): string { return 'privacy:metadata'; } }PK}\DzJ5"" index.phpnu[. /** * A report to display the outcome of scheduled backups * * @package report * @subpackage backups * @copyright 2007 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ require_once('../../config.php'); require_once($CFG->libdir . '/adminlib.php'); // Required for backup::xxx constants. require_once($CFG->dirroot . '/backup/util/interfaces/checksumable.class.php'); require_once($CFG->dirroot . '/backup/backup.class.php'); $courseid = optional_param('courseid', 0, PARAM_INT); $page = optional_param('page', 0, PARAM_INT); // This represents which backup we are viewing. // Required for constants in backup_cron_automated_helper require_once($CFG->dirroot.'/backup/util/helper/backup_cron_helper.class.php'); admin_externalpage_setup('reportbackups', '', null, '', array('pagelayout'=>'report')); $strftimedatetime = get_string('strftimerecent'); $strerror = get_string('error'); $strok = get_string('statusok'); $strunfinished = get_string('unfinished'); $strskipped = get_string('skipped'); $strwarning = get_string('warning'); $strnotyetrun = get_string('backupnotyetrun'); $strqueued = get_string('queued'); if ($courseid) { $course = $DB->get_record('course', array('id' => $courseid), 'id, fullname', MUST_EXIST); // Get the automated backups that have been performed for this course. $params = array('operation' => backup::OPERATION_BACKUP, 'type' => backup::TYPE_1COURSE, 'itemid' => $course->id, 'interactive' => backup::INTERACTIVE_NO); if ($backups = $DB->get_records('backup_controllers', $params, 'timecreated DESC', 'id, backupid, status, timecreated', $page, 1)) { // Get the backup we want to use. $backup = reset($backups); // Get the backup status. if ($backup->status == backup::STATUS_FINISHED_OK) { $status = $strok; $statusclass = 'table-success'; // Green. } else if ($backup->status == backup::STATUS_AWAITING || $backup->status == backup::STATUS_EXECUTING) { $status = $strunfinished; $statusclass = 'table-danger'; // Red. } else { // Else show error. $status = $strerror; $statusclass = 'table-danger'; // Red. } $table = new html_table(); $table->head = array(''); $table->data = array(); $statusrow = get_string('status') . ' - ' . html_writer::tag('span', $status, array('class' => $statusclass)); $table->data[] = array($statusrow); // Get the individual logs for this backup. if ($logs = $DB->get_records('backup_logs', array('backupid' => $backup->backupid), 'timecreated ASC', 'id, message, timecreated')) { foreach ($logs as $log) { $table->data[] = array(userdate($log->timecreated, get_string('strftimetime', 'report_backups')) . ' - ' . $log->message); } } else { $table->data[] = array(get_string('nologsfound', 'report_backups')); } } // Set the course name to display. $coursename = format_string($course->fullname, true, array('context' => context_course::instance($course->id))); echo $OUTPUT->header(); echo $OUTPUT->heading(get_string('backupofcourselogs', 'report_backups', $coursename)); if (isset($backup)) { // We put this logic down here as we may be viewing a backup that was performed which there were no logs // recorded for. We still want to display the pagination so the user can still navigate to other backups, // and we also display a message so they are aware that the backup happened but there were no logs. $baseurl = new moodle_url('/report/backups/index.php', array('courseid' => $courseid)); $numberofbackups = $DB->count_records('backup_controllers', $params); $pagingbar = new paging_bar($numberofbackups, $page, 1, $baseurl); echo $OUTPUT->render($pagingbar); echo $OUTPUT->heading(get_string('logsofbackupexecutedon', 'report_backups', userdate($backup->timecreated)), 3); echo html_writer::table($table); echo $OUTPUT->render($pagingbar); } else { echo $OUTPUT->box(get_string('nobackupsfound', 'report_backups'), 'center'); } echo $OUTPUT->footer(); exit(); } $table = new html_table; $table->head = array( get_string("course"), get_string("timetaken", "backup"), get_string("status"), get_string("backupnext") ); $table->headspan = array(1, 3, 1, 1); $table->attributes = array('class' => 'generaltable backup-report'); $table->data = array(); $select = ', ' . context_helper::get_preload_record_columns_sql('ctx'); $join = "LEFT JOIN {context} ctx ON (ctx.instanceid = c.id AND ctx.contextlevel = :contextlevel)"; $sql = "SELECT bc.*, c.id as courseid, c.fullname $select FROM {backup_courses} bc JOIN {course} c ON c.id = bc.courseid $join"; $rs = $DB->get_recordset_sql($sql, array('contextlevel' => CONTEXT_COURSE)); foreach ($rs as $backuprow) { // Cache the course context context_helper::preload_from_record($backuprow); // Prepare a cell to display the status of the entry. if ($backuprow->laststatus == backup_cron_automated_helper::BACKUP_STATUS_OK) { $status = $strok; $statusclass = 'table-success'; // Green. } else if ($backuprow->laststatus == backup_cron_automated_helper::BACKUP_STATUS_UNFINISHED) { $status = $strunfinished; $statusclass = 'table-danger'; // Red. } else if ($backuprow->laststatus == backup_cron_automated_helper::BACKUP_STATUS_SKIPPED) { $status = $strskipped; $statusclass = 'table-success'; // Green. } else if ($backuprow->laststatus == backup_cron_automated_helper::BACKUP_STATUS_WARNING) { $status = $strwarning; $statusclass = 'table-warning'; // Orange. } else if ($backuprow->laststatus == backup_cron_automated_helper::BACKUP_STATUS_NOTYETRUN) { $status = $strnotyetrun; $statusclass = 'table-success'; } else if ($backuprow->laststatus == backup_cron_automated_helper::BACKUP_STATUS_QUEUED) { $status = $strqueued; $statusclass = 'table-success'; } else { $status = $strerror; $statusclass = 'table-danger'; // Red. } $status = new html_table_cell($status); $status->attributes = array('class' => $statusclass); // Create the row and add it to the table $backuprowname = format_string($backuprow->fullname, true, array('context' => context_course::instance($backuprow->courseid))); $backuplogsurl = new moodle_url('/report/backups/index.php', array('courseid' => $backuprow->courseid)); $backuplogsicon = new pix_icon('t/viewdetails', get_string('viewlogs', 'report_backups')); $cells = array( $backuprowname . ' ' . $OUTPUT->action_icon($backuplogsurl, $backuplogsicon), userdate($backuprow->laststarttime, $strftimedatetime), '-', userdate($backuprow->lastendtime, $strftimedatetime), $status, userdate($backuprow->nextstarttime, $strftimedatetime) ); $table->data[] = new html_table_row($cells); } $rs->close(); // Check if we have any results and if not add a no records notification if (empty($table->data)) { $cell = new html_table_cell($OUTPUT->notification(get_string('nologsfound'))); $cell->colspan = 6; $table->data[] = new html_table_row(array($cell)); } $automatedbackupsenabled = get_config('backup', 'backup_auto_active'); // Display the backup report echo $OUTPUT->header(); echo $OUTPUT->heading(get_string("backuploglaststatus")); echo $OUTPUT->box_start(); if (empty($automatedbackupsenabled)) { // Automated backups aren't active, display a notification. // Not we don't stop because of this as perhaps scheduled backups are being run // automatically, or were enabled in the page. echo $OUTPUT->notification(get_string('automatedbackupsinactive', 'backup')); } echo html_writer::table($table); echo $OUTPUT->box_end(); echo $OUTPUT->footer(); PK}\-ƣ settings.phpnu[. /** * Settings for the backups report * * @package report * @subpackage backups * @copyright 2007 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die; $ADMIN->add('reports', new admin_externalpage('reportbackups', get_string('backups', 'admin'), "$CFG->wwwroot/report/backups/index.php",'moodle/backup:backupcourse')); // no report settings $settings = null;PK}\ly3lang/en/report_backups.phpnu[PK}\8 version.phpnu[PK}\b classes/privacy/provider.phpnu[PK}\DzJ5"" index.phpnu[PK}\-ƣ 3settings.phpnu[PK8