mirrored from git://git.moodle.org/moodle.git
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-8605 New script (web and CLI) for restoring user profile pictures…
… that failed to move to the new folder during upgrade.
- Loading branch information
nicolasconnault
committed
May 12, 2009
1 parent
ca49f63
commit 0b547d9
Showing
1 changed file
with
275 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,275 @@ | ||
<?php | ||
|
||
require_once('../config.php'); | ||
/** | ||
* SCRIPT CONFIGURATION | ||
*/ | ||
$starttimer = time()+microtime(); | ||
|
||
$settings = array(); | ||
$settings['verbose'] = false; | ||
$settings['username'] = null; | ||
$settings['password'] = null; | ||
$settings['eolchar'] = '<br />'; // Character used to break lines | ||
|
||
// Argument arrays: 0=>short name, 1=>long name | ||
$arguments = array( | ||
array('short'=>'u', 'long'=>'username', 'help' => 'Your moodle username', 'type'=>'STRING', 'default' => ''), | ||
array('short'=>'pw', 'long'=>'password', 'help' => 'Your moodle password', 'type'=>'STRING', 'default' => ''), | ||
array('short'=>'v', 'long' => 'verbose', 'help' => 'Display extra information about the process') | ||
); | ||
|
||
// Building the USAGE output of the command line version | ||
if (isset($argv) && isset($argc)) { | ||
$help = "Moodle User Pix Fix. Restores user profile images that were not properly moved during 1.8.2 upgrade to newer versions.\n\n" | ||
. "Usage: {$argv[0]}; [OPTION] ...\n" | ||
. "Options:\n" | ||
. " -h, -?, -help, --help This output\n"; | ||
|
||
foreach ($arguments as $arg_array) { | ||
$equal = ''; | ||
if (!empty($arg_array['type'])) { | ||
$equal = "={$arg_array['type']}"; | ||
} | ||
|
||
$padding1 = 5 - strlen($arg_array['short']); | ||
$padding2 = 30 - (strlen($arg_array['long']) + strlen($equal)); | ||
$paddingstr1 = ''; | ||
for ($i = 0; $i < $padding1; $i++) { | ||
$paddingstr1 .= ' '; | ||
} | ||
$paddingstr2 = ''; | ||
for ($i = 0; $i < $padding2; $i++) { | ||
$paddingstr2 .= ' '; | ||
} | ||
|
||
$help .= " -{$arg_array['short']},$paddingstr1--{$arg_array['long']}$equal$paddingstr2{$arg_array['help']}\n"; | ||
} | ||
|
||
$help .= "\nEmail nicolasconnault@gmail.com for any suggestions or bug reports.\n"; | ||
|
||
if ($argc == 1 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) { | ||
echo $help; | ||
die(); | ||
|
||
} else { | ||
|
||
$settings['eolchar'] = "\n"; | ||
$argv = arguments($argv); | ||
$argscount = 0; | ||
|
||
foreach ($arguments as $arg_array) { | ||
$value = null; | ||
if (in_array($arg_array['short'], array_keys($argv))) { | ||
$value = $argv[$arg_array['short']]; | ||
unset($argv[$arg_array['short']]); | ||
} elseif (in_array($arg_array['long'], array_keys($argv))) { | ||
$value = $argv[$arg_array['long']]; | ||
unset($argv[$arg_array['long']]); | ||
} | ||
if (!is_null($value)) { | ||
$settings[$arg_array['long']] = $value; | ||
$argscount++; | ||
} | ||
} | ||
|
||
// If some params are left in argv, it means they are not supported | ||
if ($argscount == 0 || count($argv) > 0) { | ||
echo $help; | ||
die(); | ||
} | ||
} | ||
} | ||
|
||
/** | ||
* SCRIPT SETUP | ||
*/ | ||
require_once($CFG->libdir . '/formslib.php'); | ||
require_once($CFG->dirroot .'/course/lib.php'); | ||
verbose("Loading libraries..."); | ||
$systemcontext = get_context_instance(CONTEXT_SYSTEM); | ||
|
||
/** | ||
* WEB INTERFACE FORM | ||
*/ | ||
|
||
class pixfix_form extends moodleform { | ||
function definition() { | ||
global $arguments; | ||
$mform =& $this->_form; | ||
|
||
foreach ($arguments as $arg_array) { | ||
$type = 'advcheckbox'; | ||
|
||
$label = ucfirst(str_replace('-', ' ', $arg_array['long'])); | ||
if (!empty($arg_array['type'])) { | ||
$type = 'text'; | ||
} | ||
|
||
if ($arg_array['long'] == 'password' || $arg_array['long'] == 'username') { | ||
continue; | ||
} | ||
|
||
$mform->addElement($type, $arg_array['long'], $label); | ||
|
||
if (isset($arg_array['default'])) { | ||
$mform->setDefault($arg_array['long'], $arg_array['default']); | ||
} | ||
} | ||
$this->add_action_buttons(false, 'Restore Images'); | ||
} | ||
|
||
function definition_after_data() { | ||
|
||
} | ||
} | ||
|
||
$run_script = true; | ||
$web_interface = false; | ||
|
||
// If eolchar is still <br />, load the web interface | ||
if ($settings['eolchar'] == '<br />') { | ||
print_header("User Pix-Fix"); | ||
print_heading("User Pix-Fix"); | ||
$mform = new pixfix_form(); | ||
|
||
if ($data = $mform->get_data(false)) { | ||
foreach ($arguments as $arg_array) { | ||
if (!empty($data->{$arg_array['long']})) { | ||
$settings[$arg_array['long']] = $data->{$arg_array['long']}; | ||
} | ||
} | ||
} else { | ||
$run_script = false; | ||
} | ||
|
||
if (!has_capability('moodle/site:doanything', $systemcontext)) { | ||
// If not logged in, give link to login page for current site | ||
notify("You must be logged in as administrator before using this script."); | ||
require_login(); | ||
} else { | ||
$mform->display(); | ||
} | ||
|
||
$web_interface = true; | ||
} | ||
|
||
if ($run_script) { | ||
|
||
// User authentication | ||
if (!$web_interface) { | ||
if (empty($settings['username'])) { | ||
echo "You must enter a valid username for a moodle administrator account on this site.{$settings['eolchar']}"; | ||
die(); | ||
} elseif (empty($settings['password'])) { | ||
echo "You must enter a valid password for a moodle administrator account on this site.{$settings['eolchar']}"; | ||
die(); | ||
} else { | ||
if (!$user = authenticate_user_login($settings['username'], $settings['password'])) { | ||
echo "Invalid username or password!{$settings['eolchar']}"; | ||
die(); | ||
} | ||
$USER = complete_user_login($user); | ||
if (!has_capability('moodle/site:doanything', $systemcontext)) { | ||
echo "You do not have administration privileges on this Moodle site. These are required for running the restore script.{$settings['eolchar']}"; | ||
die(); | ||
} | ||
} | ||
} | ||
|
||
// Script code here | ||
|
||
// Look for old moodledata/users directory | ||
$oldusersdir = $CFG->dataroot . '/users'; | ||
|
||
if (!file_exists($oldusersdir)) { | ||
notify('The old directory for user profile images ('.$oldusersdir.') does not exist. Pictures cannot be restored!'); | ||
} else { | ||
// Find user profile images that are not yet in the new directory | ||
$folders = get_directory_list($oldusersdir, '', false, true, false); | ||
|
||
$restored_count = 0; | ||
|
||
foreach ($folders as $userid) { | ||
$olddir = $oldusersdir . '/' . $userid; | ||
$files = get_directory_list($olddir); | ||
|
||
if (empty($files)) { | ||
continue; | ||
} | ||
|
||
// Create new user directory | ||
if (!$newdir = make_user_directory($userid)) { | ||
// some weird directory - do not stop the upgrade, just ignore it | ||
continue; | ||
} | ||
|
||
// Move contents of old directory to new one | ||
if (file_exists($olddir) && file_exists($newdir)) { | ||
$restored = false; | ||
|
||
foreach ($files as $file) { | ||
if (!file_exists($newdir . '/' . $file)) { | ||
copy($olddir . '/' . $file, $newdir . '/' . $file); | ||
verbose("Moved $olddir/$file into $newdir/$file"); | ||
$restored = true; | ||
} | ||
} | ||
|
||
if ($restored) { | ||
$restored_count++; | ||
} | ||
} else { | ||
notify("Could not move the contents of $olddir into $newdir!"); | ||
$result = false; | ||
break; | ||
} | ||
} | ||
|
||
if ($settings['eolchar'] == '<br />') { | ||
print_box_start('generalbox centerpara'); | ||
} | ||
if ($restored_count > 0) { | ||
echo "Successfully restored profile images for $restored_count users!" . $settings['eolchar']; | ||
} else { | ||
echo "Did not find any user profile images in need of restoring." . $settings['eolchar']; | ||
} | ||
if ($settings['eolchar'] == '<br />') { | ||
print_box_end(); | ||
} | ||
} | ||
} | ||
|
||
if ($settings['eolchar'] == '<br />') { | ||
print_footer(); | ||
} | ||
|
||
/** | ||
* Converts the standard $argv into an associative array taking var=val arguments into account | ||
* @param array $argv | ||
* @return array $_ARG | ||
*/ | ||
function arguments($argv) { | ||
$_ARG = array(); | ||
foreach ($argv as $arg) { | ||
if (ereg('--?([^=]+)=(.*)',$arg,$reg)) { | ||
$_ARG[$reg[1]] = $reg[2]; | ||
} elseif(ereg('-([a-zA-Z0-9]+)',$arg,$reg)) { | ||
$_ARG[$reg[1]] = 'true'; | ||
} | ||
} | ||
return $_ARG; | ||
} | ||
|
||
/** | ||
* If verbose is switched on, prints a string terminated by the global eolchar string. | ||
* @param string $string The string to STDOUT | ||
*/ | ||
function verbose($string) { | ||
global $settings; | ||
if ($settings['verbose'] && !$settings['quiet']) { | ||
echo $string . $settings['eolchar']; | ||
} | ||
} | ||
|
||
?> |