]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/mcc.php
MediaWiki 1.30.2-scripts
[autoinstalls/mediawiki.git] / maintenance / mcc.php
1 <?php
2 /**
3  * memcached diagnostic tool
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  * @todo document
22  * @ingroup Maintenance
23  */
24
25 $optionsWithArgs = [ 'cache' ];
26 $optionsWithoutArgs = [
27         'debug', 'help'
28 ];
29 require_once __DIR__ . '/commandLine.inc';
30
31 $debug = isset( $options['debug'] );
32 $help = isset( $options['help'] );
33 $cache = isset( $options['cache'] ) ? $options['cache'] : null;
34
35 if ( $help ) {
36         mccShowUsage();
37         exit( 0 );
38 }
39 $mcc = new MemcachedClient( [
40         'persistent' => true,
41         'debug' => $debug,
42 ] );
43
44 if ( $cache ) {
45         if ( !isset( $wgObjectCaches[$cache] ) ) {
46                 print "MediaWiki isn't configured with a cache named '$cache'";
47                 exit( 1 );
48         }
49         $servers = $wgObjectCaches[$cache]['servers'];
50 } elseif ( $wgMainCacheType === CACHE_MEMCACHED ) {
51         $mcc->set_servers( $wgMemCachedServers );
52 } elseif ( isset( $wgObjectCaches[$wgMainCacheType]['servers'] ) ) {
53         $mcc->set_servers( $wgObjectCaches[$wgMainCacheType]['servers'] );
54 } else {
55         print "MediaWiki isn't configured for Memcached usage\n";
56         exit( 1 );
57 }
58
59 /**
60  * Show this command line tool usage.
61  */
62 function mccShowUsage() {
63         echo <<<EOF
64 Usage:
65         mcc.php [--debug]
66         mcc.php --help
67
68 MemCached Command (mcc) is an interactive command tool that let you interact
69 with the MediaWiki memcached cache.
70
71 Options:
72         --debug Set debug mode on the memcached connection.
73         --help  This help screen.
74
75 Interactive commands:
76
77 EOF;
78         print "\t";
79         print str_replace( "\n", "\n\t", mccGetHelp( false ) );
80         print "\n";
81 }
82
83 function mccGetHelp( $command ) {
84         $output = '';
85         $commandList = [
86                 'get' => 'grabs something',
87                 'getsock' => 'lists sockets',
88                 'set' => 'changes something',
89                 'delete' => 'deletes something',
90                 'history' => 'show command line history',
91                 'server' => 'show current memcached server',
92                 'dumpmcc' => 'shows the whole thing',
93                 'exit' => 'exit mcc',
94                 'quit' => 'exit mcc',
95                 'help' => 'help about a command',
96         ];
97         if ( !$command ) {
98                 $command = 'fullhelp';
99         }
100         if ( $command === 'fullhelp' ) {
101                 $max_cmd_len = max( array_map( 'strlen', array_keys( $commandList ) ) );
102                 foreach ( $commandList as $cmd => $desc ) {
103                         $output .= sprintf( "%-{$max_cmd_len}s: %s\n", $cmd, $desc );
104                 }
105         } elseif ( isset( $commandList[$command] ) ) {
106                 $output .= "$command: $commandList[$command]\n";
107         } else {
108                 $output .= "$command: command does not exist or no help for it\n";
109         }
110
111         return $output;
112 }
113
114 do {
115         $bad = false;
116         $showhelp = false;
117         $quit = false;
118
119         $line = Maintenance::readconsole();
120         if ( $line === false ) {
121                 exit;
122         }
123
124         $args = explode( ' ', $line );
125         $command = array_shift( $args );
126
127         // process command
128         switch ( $command ) {
129                 case 'help':
130                         // show an help message
131                         print mccGetHelp( array_shift( $args ) );
132                         break;
133
134                 case 'get':
135                         $sub = '';
136                         if ( array_key_exists( 1, $args ) ) {
137                                 $sub = $args[1];
138                         }
139                         print "Getting {$args[0]}[$sub]\n";
140                         $res = $mcc->get( $args[0] );
141                         if ( array_key_exists( 1, $args ) ) {
142                                 $res = $res[$args[1]];
143                         }
144                         if ( $res === false ) {
145                                 # print 'Error: ' . $mcc->error_string() . "\n";
146                                 print "MemCached error\n";
147                         } elseif ( is_string( $res ) ) {
148                                 print "$res\n";
149                         } else {
150                                 var_dump( $res );
151                         }
152                         break;
153
154                 case 'getsock':
155                         $res = $mcc->get( $args[0] );
156                         $sock = $mcc->get_sock( $args[0] );
157                         var_dump( $sock );
158                         break;
159
160                 case 'server':
161                         if ( $mcc->_single_sock !== null ) {
162                                 print $mcc->_single_sock . "\n";
163                                 break;
164                         }
165                         $res = $mcc->get( $args[0] );
166                         $hv = $mcc->_hashfunc( $args[0] );
167                         for ( $i = 0; $i < 3; $i++ ) {
168                                 print $mcc->_buckets[$hv % $mcc->_bucketcount] . "\n";
169                                 $hv += $mcc->_hashfunc( $i . $args[0] );
170                         }
171                         break;
172
173                 case 'set':
174                         $key = array_shift( $args );
175                         if ( $args[0] == "#" && is_numeric( $args[1] ) ) {
176                                 $value = str_repeat( '*', $args[1] );
177                         } else {
178                                 $value = implode( ' ', $args );
179                         }
180                         if ( !$mcc->set( $key, $value, 0 ) ) {
181                                 # print 'Error: ' . $mcc->error_string() . "\n";
182                                 print "MemCached error\n";
183                         }
184                         break;
185
186                 case 'delete':
187                         $key = implode( ' ', $args );
188                         if ( !$mcc->delete( $key ) ) {
189                                 # print 'Error: ' . $mcc->error_string() . "\n";
190                                 print "MemCached error\n";
191                         }
192                         break;
193
194                 case 'history':
195                         if ( function_exists( 'readline_list_history' ) ) {
196                                 foreach ( readline_list_history() as $num => $line ) {
197                                         print "$num: $line\n";
198                                 }
199                         } else {
200                                 print "readline_list_history() not available\n";
201                         }
202                         break;
203
204                 case 'dumpmcc':
205                         var_dump( $mcc );
206                         break;
207
208                 case 'quit':
209                 case 'exit':
210                         $quit = true;
211                         break;
212
213                 default:
214                         $bad = true;
215         } // switch() end
216
217         if ( $bad ) {
218                 if ( $command ) {
219                         print "Bad command\n";
220                 }
221         } else {
222                 if ( function_exists( 'readline_add_history' ) ) {
223                         readline_add_history( $line );
224                 }
225         }
226 } while ( !$quit );