From 45c8df45743442f285fed466a2d6e26b61ec37d8 Mon Sep 17 00:00:00 2001 From: Antoine Musso Date: Wed, 17 Jul 2013 18:22:17 +0200 Subject: [PATCH] getConfiguration.php now supports regex Let us dump global settings based on regex. * --regex and --iregex to filter globals in $GLOBALS * validation of --format * format is now case insensitive * vardump format Change-Id: I3a1ddc8ab3c9e41a47b55f412e7f2b018e99b647 --- maintenance/getConfiguration.php | 139 +++++++++++++++++++++++++++---- 1 file changed, 122 insertions(+), 17 deletions(-) diff --git a/maintenance/getConfiguration.php b/maintenance/getConfiguration.php index 57ff08349e..d9ed95678f 100644 --- a/maintenance/getConfiguration.php +++ b/maintenance/getConfiguration.php @@ -1,6 +1,6 @@ */ require_once __DIR__ . '/Maintenance.php'; @@ -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 ) { -- 2.20.1