diff --git a/admin/settings/courses.php b/admin/settings/courses.php index f9afd0a382c..9e379a4c83c 100644 --- a/admin/settings/courses.php +++ b/admin/settings/courses.php @@ -221,7 +221,7 @@ if ($hassiteconfig or has_any_capability($capabilities, $systemcontext)) { 2 => new lang_string('storagecourseandexternal', 'backup') ); $temp->add(new admin_setting_configselect('backup/backup_auto_storage', new lang_string('automatedstorage', 'backup'), new lang_string('automatedstoragehelp', 'backup'), 0, $storageoptions)); - $temp->add(new admin_setting_configdirectory('backup/backup_auto_destination', new lang_string('saveto'), new lang_string('backupsavetohelp'), '')); + $temp->add(new admin_setting_special_backup_auto_destination()); $keepoptoins = array( 0 => new lang_string('all'), 1 => '1', 2 => '2', diff --git a/backup/util/helper/backup_cron_helper.class.php b/backup/util/helper/backup_cron_helper.class.php index 671a8b51501..21bebe89a71 100644 --- a/backup/util/helper/backup_cron_helper.class.php +++ b/backup/util/helper/backup_cron_helper.class.php @@ -397,16 +397,11 @@ abstract class backup_cron_automated_helper { $outcome = self::outcome_from_results($results); $file = $results['backup_destination']; // May be empty if file already moved to target location. - if (empty($dir) && $storage !== 0) { - // This is intentionally left as a warning instead of an error because of the current behaviour of backup settings. - // See MDL-48266 for details. - $bc->log('No directory specified for automated backups', - backup::LOG_WARNING); - $outcome = self::BACKUP_STATUS_WARNING; - } else if ($storage !== 0 && (!file_exists($dir) || !is_dir($dir) || !is_writable($dir))) { - // If we need to copy the backup file to an external dir and it is not writable, change status to error. - $bc->log('Specified backup directory is not writable - ', - backup::LOG_ERROR, $dir); + // If we need to copy the backup file to an external dir and it is not writable, change status to error. + // This is a feature to prevent moodledata to be filled up and break a site when the admin misconfigured + // the automated backups storage type and destination directory. + if ($storage !== 0 && (empty($dir) || !file_exists($dir) || !is_dir($dir) || !is_writable($dir))) { + $bc->log('Specified backup directory is not writable - ', backup::LOG_ERROR, $dir); $dir = null; $outcome = self::BACKUP_STATUS_ERROR; } diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 1701cbb5317..529a654e970 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -177,6 +177,7 @@ $string['backupdatenew'] = '  {$a->TAG} is now {$a->weekday}, {$a->mday} {$ $string['backupdateold'] = '{$a->TAG} was {$a->weekday}, {$a->mday} {$a->month} {$a->year}'; $string['backupdaterecordtype'] = '
{$a->recordtype} - {$a->recordname}
'; $string['backupdetails'] = 'Backup details'; +$string['backuperrorinvaliddestination'] = 'The backup destination folder does not exist or is not writable.'; $string['backupexecuteathelp'] = 'Choose what time automated backups should run at.'; $string['backupfailed'] = 'Some of your courses weren\'t saved!!'; $string['backupfilename'] = 'backup'; @@ -194,7 +195,7 @@ $string['backupnonisowarning'] = 'Warning: this backup is from a non-Unicode ver $string['backupnotyetrun'] = 'Automated backup pending'; $string['backuporiginalname'] = 'Backup name'; $string['backuproleassignments'] = 'Backup role assignments for these roles'; -$string['backupsavetohelp'] = 'Full path to the directory where you want to save the backup files
(leave blank to save in its course default dir)'; +$string['backupsavetohelp'] = 'Full path to the directory where you want to save the backup files'; $string['backupsitefileshelp'] = 'If enabled then site files used in courses will be included in automated backups'; $string['backuptakealook'] = 'Please take a look at your backup logs in: {$a}'; diff --git a/lib/adminlib.php b/lib/adminlib.php index 19ca8849ead..a921eaa0143 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -4390,6 +4390,44 @@ class admin_setting_special_backupdays extends admin_setting_configmulticheckbox } } +/** + * Special setting for backup auto destination. + * + * @package core + * @subpackage admin + * @copyright 2014 Frédéric Massart - FMCorz.net + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class admin_setting_special_backup_auto_destination extends admin_setting_configdirectory { + + /** + * Calls parent::__construct with specific arguments. + */ + public function __construct() { + parent::__construct('backup/backup_auto_destination', new lang_string('saveto'), new lang_string('backupsavetohelp'), ''); + } + + /** + * Check if the directory must be set, depending on backup/backup_auto_storage. + * + * Note: backup/backup_auto_storage must be specified BEFORE this setting otherwise + * there will be conflicts if this validation happens before the other one. + * + * @param string $data Form data. + * @return string Empty when no errors. + */ + public function write_setting($data) { + $storage = (int) get_config('backup', 'backup_auto_storage'); + if ($storage !== 0) { + if (empty($data) || !file_exists($data) || !is_dir($data) || !is_writable($data) ) { + // The directory must exist and be writable. + return get_string('backuperrorinvaliddestination'); + } + } + return parent::write_setting($data); + } +} + /** * Special debug setting diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 70a96d10d57..5c628bf1517 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -4121,6 +4121,23 @@ function xmldb_main_upgrade($oldversion) { // Main savepoint reached. upgrade_main_savepoint(true, 2015010800.01); + + } + + if ($oldversion < 2015011501.02) { + + // If the site is using internal and external storage, or just external + // storage, and the external path specified is empty we change the setting + // to internal only. That is how the backup code is handling this + // misconfiguration. + $storage = (int) get_config('backup_auto_storage', 'backup'); + $folder = get_config('backup_auto_destination', 'backup'); + if ($storage !== 0 && empty($folder)) { + set_config('backup_auto_storage', 0, 'backup'); + } + + // Main savepoint reached. + upgrade_main_savepoint(true, 2015011501.02); } return true; diff --git a/version.php b/version.php index 3499cfbbc37..eced7165e55 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2015012300.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2015012600.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes.