[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Helper class for userOptions.php script. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup Maintenance 22 */ 23 24 // Options we will use 25 $options = array( 'list', 'nowarn', 'quiet', 'usage', 'dry' ); 26 $optionsWithArgs = array( 'old', 'new' ); 27 28 require_once __DIR__ . '/commandLine.inc'; 29 30 /** 31 * @ingroup Maintenance 32 */ 33 class UserOptions { 34 public $mQuick; 35 public $mQuiet; 36 public $mDry; 37 public $mAnOption; 38 public $mOldValue; 39 public $mNewValue; 40 41 private $mMode, $mReady; 42 43 /** 44 * Constructor. Will show usage and exit if script options are not correct 45 * @param array $opts 46 * @param array $args 47 */ 48 function __construct( $opts, $args ) { 49 if ( !$this->checkOpts( $opts, $args ) ) { 50 UserOptions::showUsageAndExit(); 51 } else { 52 $this->mReady = $this->initializeOpts( $opts, $args ); 53 } 54 } 55 56 /** 57 * This is used to check options. Only needed on construction 58 * 59 * @param array $opts 60 * @param array $args 61 * 62 * @return bool 63 */ 64 private function checkOpts( $opts, $args ) { 65 // The three possible ways to run the script: 66 $list = isset( $opts['list'] ); 67 $usage = isset( $opts['usage'] ) && ( count( $args ) <= 1 ); 68 $change = isset( $opts['old'] ) && isset( $opts['new'] ) && ( count( $args ) <= 1 ); 69 70 // We want only one of them 71 $isValid = ( ( $list + $usage + $change ) == 1 ); 72 73 return $isValid; 74 } 75 76 /** 77 * load script options in the object 78 * 79 * @param array $opts 80 * @param array $args 81 * 82 * @return bool 83 */ 84 private function initializeOpts( $opts, $args ) { 85 86 $this->mQuick = isset( $opts['nowarn'] ); 87 $this->mQuiet = isset( $opts['quiet'] ); 88 $this->mDry = isset( $opts['dry'] ); 89 90 // Set object properties, specially 'mMode' used by run() 91 if ( isset( $opts['list'] ) ) { 92 $this->mMode = 'LISTER'; 93 } elseif ( isset( $opts['usage'] ) ) { 94 $this->mMode = 'USAGER'; 95 $this->mAnOption = isset( $args[0] ) ? $args[0] : false; 96 } elseif ( isset( $opts['old'] ) && isset( $opts['new'] ) ) { 97 $this->mMode = 'CHANGER'; 98 $this->mOldValue = $opts['old']; 99 $this->mNewValue = $opts['new']; 100 $this->mAnOption = $args[0]; 101 } else { 102 die( "There is a bug in the software, this should never happen\n" ); 103 } 104 105 return true; 106 } 107 108 // Dumb stuff to run a mode. 109 public function run() { 110 if ( !$this->mReady ) { 111 return false; 112 } 113 114 $this->{$this->mMode}(); 115 116 return true; 117 } 118 119 # 120 # Modes. 121 # 122 123 /** List default options and their value */ 124 private function LISTER() { 125 $def = User::getDefaultOptions(); 126 ksort( $def ); 127 $maxOpt = 0; 128 foreach ( $def as $opt => $value ) { 129 $maxOpt = max( $maxOpt, strlen( $opt ) ); 130 } 131 foreach ( $def as $opt => $value ) { 132 printf( "%-{$maxOpt}s: %s\n", $opt, $value ); 133 } 134 } 135 136 /** List options usage */ 137 private function USAGER() { 138 $ret = array(); 139 $defaultOptions = User::getDefaultOptions(); 140 141 // We list user by user_id from one of the slave database 142 $dbr = wfGetDB( DB_SLAVE ); 143 $result = $dbr->select( 'user', 144 array( 'user_id' ), 145 array(), 146 __METHOD__ 147 ); 148 149 foreach ( $result as $id ) { 150 151 $user = User::newFromId( $id->user_id ); 152 153 // Get the options and update stats 154 if ( $this->mAnOption ) { 155 156 if ( !array_key_exists( $this->mAnOption, $defaultOptions ) ) { 157 print "Invalid user option. Use --list to see valid choices\n"; 158 exit; 159 } 160 161 $userValue = $user->getOption( $this->mAnOption ); 162 if ( $userValue <> $defaultOptions[$this->mAnOption] ) { 163 // @codingStandardsIgnoreStart Ignore silencing errors is discouraged warning 164 @$ret[$this->mAnOption][$userValue]++; 165 // @codingStandardsIgnoreEnd 166 } 167 } else { 168 169 foreach ( $defaultOptions as $name => $defaultValue ) { 170 $userValue = $user->getOption( $name ); 171 if ( $userValue <> $defaultValue ) { 172 // @codingStandardsIgnoreStart Ignore silencing errors is discouraged warning 173 @$ret[$name][$userValue]++; 174 // @codingStandardsIgnoreEnd 175 } 176 } 177 } 178 } 179 180 foreach ( $ret as $optionName => $usageStats ) { 181 print "Usage for <$optionName> (default: '{$defaultOptions[$optionName]}'):\n"; 182 foreach ( $usageStats as $value => $count ) { 183 print " $count user(s): '$value'\n"; 184 } 185 print "\n"; 186 } 187 } 188 189 /** Change our users options */ 190 private function CHANGER() { 191 $this->warn(); 192 193 // We list user by user_id from one of the slave database 194 $dbr = wfGetDB( DB_SLAVE ); 195 $result = $dbr->select( 'user', 196 array( 'user_id' ), 197 array(), 198 __METHOD__ 199 ); 200 201 foreach ( $result as $id ) { 202 203 $user = User::newFromId( $id->user_id ); 204 205 $curValue = $user->getOption( $this->mAnOption ); 206 $username = $user->getName(); 207 208 if ( $curValue == $this->mOldValue ) { 209 210 if ( !$this->mQuiet ) { 211 print "Setting {$this->mAnOption} for $username from '{$this->mOldValue}' " . 212 "to '{$this->mNewValue}'): "; 213 } 214 215 // Change value 216 $user->setOption( $this->mAnOption, $this->mNewValue ); 217 218 // Will not save the settings if run with --dry 219 if ( !$this->mDry ) { 220 $user->saveSettings(); 221 } 222 if ( !$this->mQuiet ) { 223 print " OK\n"; 224 } 225 } elseif ( !$this->mQuiet ) { 226 print "Not changing '$username' using <{$this->mAnOption}> = '$curValue'\n"; 227 } 228 } 229 } 230 231 /** 232 * Return an array of option names 233 * @return array 234 */ 235 public static function getDefaultOptionsNames() { 236 $def = User::getDefaultOptions(); 237 $ret = array(); 238 foreach ( $def as $optname => $defaultValue ) { 239 array_push( $ret, $optname ); 240 } 241 242 return $ret; 243 } 244 245 # 246 # Helper methods 247 # 248 249 public static function showUsageAndExit() { 250 print <<<USAGE 251 252 This script pass through all users and change one of their options. 253 The new option is NOT validated. 254 255 Usage: 256 php userOptions.php --list 257 php userOptions.php [user option] --usage 258 php userOptions.php [options] <user option> --old <old value> --new <new value> 259 260 Switchs: 261 --list : list available user options and their default value 262 263 --usage : report all options statistics or just one if you specify it. 264 265 --old <old value> : the value to look for 266 --new <new value> : new value to update users with 267 268 Options: 269 --nowarn: hides the 5 seconds warning 270 --quiet : do not print what is happening 271 --dry : do not save user settings back to database 272 273 USAGE; 274 exit( 0 ); 275 } 276 277 /** 278 * The warning message and countdown 279 * @return bool 280 */ 281 public function warn() { 282 283 if ( $this->mQuick ) { 284 return true; 285 } 286 287 print <<<WARN 288 The script is about to change the skin for ALL USERS in the database. 289 Users with option <$this->mAnOption> = '$this->mOldValue' will be made to use '$this->mNewValue'. 290 291 Abort with control-c in the next five seconds.... 292 WARN; 293 wfCountDown( 5 ); 294 295 return true; 296 } 297 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |