MediaWiki fundraising/REL1_35
getConfiguration.php
Go to the documentation of this file.
1<?php
26require_once __DIR__ . '/Maintenance.php';
27
34
35 protected $regex = null;
36
37 protected $settings_list = [];
38
43 protected static $outFormats = [
44 'json',
45 'php',
46 'serialize',
47 'vardump',
48 ];
49
50 public function __construct() {
51 parent::__construct();
52 $this->addDescription( 'Get serialized MediaWiki site configuration' );
53 $this->addOption( 'regex', 'regex to filter variables with', false, true );
54 $this->addOption( 'iregex', 'same as --regex but case insensitive', false, true );
55 $this->addOption( 'settings', 'Space-separated list of wg* variables', false, true );
56 $this->addOption( 'format', implode( ', ', self::$outFormats ), false, true );
57 }
58
59 public function validateParamsAndArgs() {
60 $error_out = false;
61
62 # Get the format and make sure it is set to a valid default value
63 $format = strtolower( $this->getOption( 'format', 'PHP' ) );
64
65 $validFormat = in_array( $format, self::$outFormats );
66 if ( !$validFormat ) {
67 $this->error( "--format set to an unrecognized format" );
68 $error_out = true;
69 }
70
71 if ( $this->getOption( 'regex' ) && $this->getOption( 'iregex' ) ) {
72 $this->error( "Can only use either --regex or --iregex" );
73 $error_out = true;
74 }
75
76 parent::validateParamsAndArgs();
77
78 if ( $error_out ) {
79 # Force help and quit
80 $this->maybeHelp( true );
81 }
82 }
83
87 public function finalSetup() {
88 parent::finalSetup();
89
90 $this->regex = $this->getOption( 'regex' ) ?: $this->getOption( 'iregex' );
91 if ( $this->regex ) {
92 $this->regex = '/' . $this->regex . '/';
93 if ( $this->hasOption( 'iregex' ) ) {
94 # case insensitive regex
95 $this->regex .= 'i';
96 }
97 }
98
99 if ( $this->hasOption( 'settings' ) ) {
100 $this->settings_list = explode( ' ', $this->getOption( 'settings' ) );
101 # Values validation
102 foreach ( $this->settings_list as $name ) {
103 if ( !preg_match( '/^wg[A-Z]/', $name ) ) {
104 throw new MWException( "Variable '$name' does start with 'wg'." );
105 } elseif ( !array_key_exists( $name, $GLOBALS ) ) {
106 throw new MWException( "Variable '$name' is not set." );
107 } elseif ( !$this->isAllowedVariable( $GLOBALS[$name] ) ) {
108 throw new MWException( "Variable '$name' includes non-array, non-scalar, items." );
109 }
110 }
111 }
112 }
113
114 public function execute() {
115 // Settings we will display
116 $res = [];
117
118 # Sane default: dump any wg / wmg variable
119 if ( !$this->regex && !$this->getOption( 'settings' ) ) {
120 $this->regex = '/^wm?g/';
121 }
122
123 # Filter out globals based on the regex
124 if ( $this->regex ) {
125 $res = [];
126 foreach ( $GLOBALS as $name => $value ) {
127 if ( preg_match( $this->regex, $name ) ) {
128 $res[$name] = $value;
129 }
130 }
131 }
132
133 # Explicitly dumps a list of provided global names
134 if ( $this->settings_list ) {
135 foreach ( $this->settings_list as $name ) {
136 $res[$name] = $GLOBALS[$name];
137 }
138 }
139
140 ksort( $res );
141
142 $out = null;
143 switch ( strtolower( $this->getOption( 'format' ) ) ) {
144 case 'serialize':
145 case 'php':
146 $out = serialize( $res );
147 break;
148 case 'vardump':
149 $out = $this->formatVarDump( $res );
150 break;
151 case 'json':
152 $out = FormatJson::encode( $res );
153 break;
154 default:
155 throw new MWException( "Invalid serialization format given." );
156 }
157 if ( !is_string( $out ) ) {
158 throw new MWException( "Failed to serialize the requested settings." );
159 }
160
161 if ( $out ) {
162 $this->output( $out . "\n" );
163 }
164 }
165
166 protected function formatVarDump( $res ) {
167 $ret = '';
168 foreach ( $res as $key => $value ) {
169 # intercept var_dump() output
170 ob_start();
171 print "\${$key} = ";
172 var_dump( $value );
173 # grab var_dump() output and discard it from the output buffer
174 $ret .= trim( ob_get_clean() ) . ";\n";
175 }
176
177 return trim( $ret, "\n" );
178 }
179
180 private function isAllowedVariable( $value ) {
181 if ( is_array( $value ) ) {
182 foreach ( $value as $k => $v ) {
183 if ( !$this->isAllowedVariable( $v ) ) {
184 return false;
185 }
186 }
187
188 return true;
189 } elseif ( is_scalar( $value ) || $value === null ) {
190 return true;
191 }
192
193 return false;
194 }
195}
196
197$maintClass = GetConfiguration::class;
198require_once RUN_MAINTENANCE_IF_MAIN;
serialize()
$GLOBALS['IP']
const RUN_MAINTENANCE_IF_MAIN
Print serialized output of MediaWiki config vars.
execute()
Do the actual work.
static $outFormats
List of format output internally supported.
finalSetup()
finalSetup() since we need MWException
__construct()
Default constructor.
validateParamsAndArgs()
Run some validation checks on the params, etc Stable for overriding.
MediaWiki exception.
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
error( $err, $die=0)
Throw an error to the user.
output( $out, $channel=null)
Throw some output to the user.
hasOption( $name)
Checks to see if a particular option was set.
addDescription( $text)
Set the description text.
maybeHelp( $force=false)
Maybe show the help.
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.
getOption( $name, $default=null)
Get an option, or return the default.
while(( $__line=Maintenance::readconsole()) !==false) print
Definition eval.php:64