X-Git-Url: http://git.cyclocoop.org/ecrire?a=blobdiff_plain;f=maintenance%2FgetConfiguration.php;h=5a5eb58749391884c3abbe4e5b2616b35f06db08;hb=c38d687a3fe8e084f75472041f55818ac3424b01;hp=72e3f0605c2a995be3662b6314fac85d085f6303;hpb=50e7985d4d5e9f70bd27e61d84d43514004f23da;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/getConfiguration.php b/maintenance/getConfiguration.php index 72e3f0605c..5a5eb58749 100644 --- a/maintenance/getConfiguration.php +++ b/maintenance/getConfiguration.php @@ -1,6 +1,6 @@ */ -require_once( __DIR__ . '/Maintenance.php' ); +require_once __DIR__ . '/Maintenance.php'; /** * Print serialized output of MediaWiki config vars @@ -31,33 +31,123 @@ require_once( __DIR__ . '/Maintenance.php' ); * @ingroup Maintenance */ class GetConfiguration extends Maintenance { + + protected $regex = null; + + protected $settings_list = array(); + + /** + * List of format output internally supported. + * Each item MUST be lower case. + */ + protected static $outFormats = array( + 'json', + 'php', + 'serialize', + 'vardump', + ); + public function __construct() { parent::__construct(); $this->mDescription = "Get serialized MediaWiki site configuration"; - $this->addOption( 'settings', 'Space-separated list of wg* variables', true, true ); - $this->addOption( 'format', 'PHP or JSON', true, true ); - $this->addOption( 'wiki', 'Wiki ID', true, true ); + $this->addOption( 'regex', 'regex to filter variables with', false, true ); + $this->addOption( 'iregex', 'same as --regex but case insensitive', false, true ); + $this->addOption( 'settings', 'Space-separated list of wg* variables', false, true ); + $this->addOption( 'format', join( ', ', self::$outFormats ), false, true ); + } + + protected function validateParamsAndArgs() { + $error_out = false; + + # Get the format and make sure it is set to a valid default value + $format = strtolower( $this->getOption( 'format', 'PHP' ) ); + + $validFormat = in_array( $format, self::$outFormats ); + if ( ! $validFormat ) { + $this->error( "--format set to an unrecognized format", 0 ); + $error_out = true; + } + + if ( $this->getOption( 'regex' ) && $this->getOption( 'iregex' ) ) { + $this->error( "Can only use either --regex or --iregex" ); + $error_out = true; + } + + parent::validateParamsAndArgs(); + + if ( $error_out ) { + # Force help and quit + $this->maybeHelp( true ); + } + } + + /** + * finalSetup() since we need MWException + */ + public function finalSetup() { + parent::finalSetup(); + + $this->regex = $this->getOption( 'regex' ) ? : $this->getOption( 'iregex' ); + if ( $this->regex ) { + $this->regex = '/' . $this->regex . '/'; + if ( $this->hasOption( 'iregex' ) ) { + $this->regex .= 'i'; # case insensitive regex + } + } + + if ( $this->hasOption( 'settings' ) ) { + $this->settings_list = explode( ' ', $this->getOption( 'settings' ) ); + # Values validation + foreach ( $this->settings_list as $name ) { + if ( !preg_match( '/^wg[A-Z]/', $name ) ) { + throw new MWException( "Variable '$name' does start with 'wg'." ); + } elseif ( !isset( $GLOBALS[$name] ) ) { + throw new MWException( "Variable '$name' is not set." ); + } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) { + throw new MWException( "Variable '$name' includes non-array, non-scalar, items." ); + } + } + } } public function execute() { + // Settings we will display $res = array(); - foreach ( explode( ' ', $this->getOption( 'settings' ) ) as $name ) { - if ( !preg_match( '/^wg[A-Z]/', $name ) ) { - throw new MWException( "Variable '$name' does start with 'wg'." ); - } elseif ( !isset( $GLOBALS[$name] ) ) { - throw new MWException( "Variable '$name' is not set." ); - } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) { - throw new MWException( "Variable '$name' includes non-array, non-scalar, items." ); + + # Sane default: dump any wg / wmg variable + if ( ! $this->regex && ! $this->getOption( 'settings' ) ) { + $this->regex = '/^wm?g/'; + } + + # Filter out globals based on the regex + if ( $this->regex ) { + $res = array(); + foreach ( $GLOBALS as $name => $value ) { + if ( preg_match( $this->regex, $name ) ) { + $res[$name] = $value; + } } - $res[$name] = $GLOBALS[$name]; } + # Explicitly dumps a list of provided global names + if ( $this->settings_list ) { + foreach ( $this->settings_list as $name ) { + $res[$name] = $GLOBALS[$name]; + } + } + + ksort( $res ); + $out = null; - switch ( $this->getOption( 'format' ) ) { - case 'PHP': + switch ( strtolower( $this->getOption( 'format' ) ) ) { + case 'serialize': + case 'php': $out = serialize( $res ); break; - case 'JSON': + case 'vardump': + $out = $this->formatVarDump( $res ); + break; + case 'json': $out = FormatJson::encode( $res ); break; default: @@ -67,7 +157,22 @@ class GetConfiguration extends Maintenance { throw new MWException( "Failed to serialize the requested settings." ); } - $this->output( $out . "\n" ); + if ( $out ) { + $this->output( $out . "\n" ); + } + } + + protected function formatVarDump( $res ) { + $ret = ''; + foreach ( $res as $key => $value ) { + ob_start(); # intercept var_dump() output + print "\${$key} = "; + var_dump( $value ); + # grab var_dump() output and discard it from the output buffer + $ret .= trim( ob_get_clean() ) . ";\n"; + } + + return trim( $ret, "\n" ); } private function isAllowedVariable( $value ) {