2 /* czncadmin.php - main script - ZNCAdmin
3 * Copyright (C) 2011-2012 Philipp Kreil (pk910)
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 3 of the License, or
8 * (at your option) any later version.
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.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 error_reporting(E_ALL & ~E_NOTICE);
20 require_once("zncadmin/HTTPConnector.class.php");
21 require_once("zncadmin/ZNCServer.class.php");
22 require_once("zncadmin/Table.class.php");
24 require_once("config.inc.php");
30 function error($msg) {
31 echo"\00304ZNCAdmin error:\003 ".$msg."\n";
34 if(strtolower($argv[1]) == "force") {
35 $argv = array_slice($argv, 1);
40 switch(strtolower($argv[1])) {
69 error("invalid subcommand '".$argv[1]."'");
73 function preg_prepare($string,$wildcards = true,$pregstart = "#") {
74 $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart);
75 if(!$wildcards) array_push($in,"*");
77 foreach($in as $item) {
82 array_push($out,"(.*)");
84 $string = str_replace($in,$out,$string);
88 function generate_password() {
89 $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
90 $password_length = 10;
93 for($i = 0; $i < $password_length; $i++) {
94 $password .= $password_chars[rand(0, strlen($password_chars))-1];
99 function str2time($duration) {
103 for($i=0;$i<strlen($duration);$i++) {
104 if(is_numeric($duration[$i])) {
106 } else if($duration[$i] != " ") {
107 switch ($duration[$i]) {
136 $dur=$dur+($str*$mult);
144 /***********************************************************
145 * ZNCAdmin SUBCOMMANDS *
146 ***********************************************************/
149 function zncadmin_search() {
150 global $argv, $zncservers;
153 error("missing mask parameter");
156 $extraflags = array();
158 $extraflags = explode(" ", $argv[3]);
160 $mask = preg_prepare($mask);
161 $table = new Table(5);
162 $table->add("Server", "User", "Clients", "Server", "");
164 foreach($zncservers as $zncserver) {
165 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
166 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
167 foreach($zncserver['conn']->getUserList() as $user) {
169 foreach($extraflags as $flag) {
170 //some additional flags ;)
171 if($flag[0] == '-') {
172 $flag = substr($flag, 1);
174 } else if($flag[0] == '+') {
175 $flag = substr($flag, 1);
179 $flag = explode("=", $flag, 2);
181 switch (strtolower($flag[0])) {
183 $skip = (($user['clients'] > 0) != $positive);
186 $skip = (($user['server'] == "-N/A-") == $positive);
189 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive);
192 $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive);
195 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive);
198 $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive);
201 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive);
211 if(preg_match("#^".$mask."$#i", $user['user'])) {
213 if(isset($user['nick'])) {
216 $extra .= "Nick: ".$user['nick'];
218 $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra);
224 foreach($table->end() as $line) {
227 echo"Found \002".$count."\002 users.\n";
229 echo "no user matching \002".$argv[2]."\002 found.\n";
234 function zncadmin_seen() {
235 global $argv, $zncservers;
238 if($time[0] == '>' || $time[0] == '<') {
239 if($time[0] == '<') $over_time = false;
240 $time = substr($time, 1);
242 $time = time() - str2time($time);
245 error("missing time parameter");
249 $mask = preg_prepare($mask);
252 $table = new Table(4);
253 $table->add("Server", "User", "Seen", "Info");
255 foreach($zncservers as $zncserver) {
256 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
257 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
258 foreach($zncserver['conn']->getSeenList() as $user) {
259 if(preg_match("#^".$mask."$#i", $user['user']) && (($over_time && $user['seen_unix'] < $time) || (!$over_time && $user['seen_unix'] > $time))) {
260 $table->add($zncserver['name'], $user['user'], $user['seen'], $user['info']);
266 foreach($table->end() as $line) {
270 echo "no user matching \002".$argv[2]."\002 found.\n";
275 function zncadmin_del() {
276 global $argv, $zncservers, $force;
277 $username = strtolower($argv[2]);
279 error("missing username");
283 foreach($zncservers as $zncserver) {
284 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
285 if($username == strtolower($zncserver['auser'])) continue;
286 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
287 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
288 foreach($zncserver['conn']->getUserList() as $user) {
289 if(strtolower($user['user']) == $username) {
290 $delusers[] = array("server" => $zncserver, "user" => $user);
294 if(count($delusers) > 1) {
295 error($argv[2]." exists on multiple servers! please add the server name, the user should be removed from.");
296 echo"Found User on following Servers:\n";
297 foreach($delusers as $server) {
298 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
300 } else if(count($delusers) == 0) {
301 error("Couldn't find an user called \002".$argv[2]."\002.");
302 } else if($delusers[0]['server']['protected'] && !$force) {
303 error("Access denied\n");
305 $deluser = $delusers[0];
306 $deluser['server']['conn']->delZNC($deluser['user']['user']);
307 echo "Deleted \002".$deluser['user']['user']."\002 from Server \002".$deluser['server']['name']."\002\n";
313 function zncadmin_add() {
314 global $argv, $zncservers, $add_settings, $force;
315 $username = strtolower($argv[2]);
317 error("missing username");
322 foreach($zncservers as $zncserver) {
323 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
324 if(!$argv[3] && $zncserver['priority'] < $priority) continue;
325 if($zncserver['protected'] === true && !$force) {
326 error("Access denied\n");
329 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
330 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
331 $zncserver['users'] = $zncserver['conn']->getUserList();
333 foreach($zncserver['users'] as $user) {
334 if(strtolower($user['user']) == $username) $existing = true;
336 if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) {
337 if($zncserver['priority'] > $priority) {
338 $priority = $zncserver['priority'];
341 $addserv[] = $zncserver;
344 if(count($addserv) > 1) {
345 //select server with lowest user count
346 $usercount = count($addserv[0]['users']);
348 for($i = 1; $i < count($addserv); $i++) {
349 if(count($addserv[$i]['users']) < $usercount) {
350 $usercount = count($addserv[$i]['users']);
354 $addserv = $addserv[$selected];
355 } else if(count($addserv) == 0) {
356 error("Couldn't find a server the user could be added to.");
359 $addserv = $addserv[0];
361 $password = generate_password();
363 $settings['nick'] = $argv[2];
364 $settings['altnick'] = $argv[2]."`";
365 $settings['ident'] = $username;
366 $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['netmodules'], $add_settings['other']);
368 echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n";
369 echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n";
370 echo " Password: ".$password."\n";
372 echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n";
373 foreach($add_settings['mirccmds']['hosts'] AS $host) {
374 echo " /AS addmask *@*.".$host."\n";
376 echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
378 foreach($add_settings["channel"] AS $channel) {
379 $addserv['conn']->addChan($argv[2], $channel);
382 error("Error while adding user.");
385 //SUBCOMMAND: resetpass
386 function zncadmin_resetpass() {
387 global $argv, $zncservers, $force;
388 $username = strtolower($argv[2]);
390 error("missing username");
394 foreach($zncservers as $zncserver) {
395 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
396 if($username == strtolower($zncserver['auser'])) continue;
397 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
398 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
399 foreach($zncserver['conn']->getUserList() as $user) {
400 if(strtolower($user['user']) == $username) {
401 $delusers[] = array("server" => $zncserver, "user" => $user);
405 if(count($delusers) > 1) {
406 error($argv[2]." exists on multiple servers! please add the server name the user, the password should be resetted, is on.");
407 echo"Found User on following Servers:\n";
408 foreach($delusers as $server) {
409 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
411 } else if(count($delusers) == 0) {
412 error("Couldn't find an user called \002".$argv[2]."\002.");
413 } else if($delusers[0]['server']['protected'] && !$force) {
414 error("Access denied\n");
416 $deluser = $delusers[0];
417 $password = generate_password();
418 $deluser['server']['conn']->editZNC($deluser['user']['user'], $password);
419 echo "Changed password of \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name']." to \002".$password."\002\n";
425 function zncadmin_simul() {
426 global $argv, $zncservers, $force;
427 $username = strtolower($argv[2]);
428 $server = strtolower($argv[3]);
431 error("missing username");
436 foreach($zncservers as $zncserver) {
437 if(strtolower($server) == strtolower($zncserver['name'])) {
443 $raw = $argv[3]." ".$raw;
448 error("missing raw");
452 foreach($zncservers as $zncserver) {
453 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
454 if($username == strtolower($zncserver['auser'])) continue;
455 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
456 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
457 foreach($zncserver['conn']->getUserList() as $user) {
458 if(strtolower($user['user']) == $username) {
459 $delusers[] = array("server" => $zncserver, "user" => $user);
463 if(count($delusers) > 1) {
464 error($argv[2]." exists on multiple servers! please add the server name the user should be simuled on.");
465 echo"Found User on following Servers:\n";
466 foreach($delusers as $server) {
467 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
469 } else if(count($delusers) == 0) {
470 error("Couldn't find an user called \002".$argv[2]."\002.");
471 } else if($delusers[0]['server']['protected'] && !$force) {
472 error("Access denied\n");
474 $deluser = $delusers[0];
475 $ret = $deluser['server']['conn']->simulZNC($deluser['user']['user'], $raw);
476 if($ret == ERR_MODULE_NOT_FOUND) {
477 error("send_raw module is not installed or not activated for user ".$deluser['server']['auser']." on ".$deluser['server']['name']);
479 echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n";
486 function zncadmin_block() {
487 global $argv, $zncservers, $force;
488 $username = strtolower($argv[2]);
489 $server = strtolower($argv[3]);
491 error("missing username");
495 foreach($zncservers as $zncserver) {
496 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
497 if($username == strtolower($zncserver['auser'])) continue;
498 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
499 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
500 foreach($zncserver['conn']->getUserList() as $user) {
501 if(strtolower($user['user']) == $username) {
502 $delusers[] = array("server" => $zncserver, "user" => $user);
506 if(count($delusers) > 1) {
507 error($argv[2]." exists on multiple servers! please add the server name the user should be blocked on.");
508 echo"Found User on following Servers:\n";
509 foreach($delusers as $server) {
510 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
512 } else if(count($delusers) == 0) {
513 error("Couldn't find an user called \002".$argv[2]."\002.");
514 } else if($delusers[0]['server']['protected'] && !$force) {
515 error("Access denied\n");
517 $deluser = $delusers[0];
518 $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], true);
519 if($ret == ERR_MODULE_NOT_FOUND) {
520 error("blockuser module is not installed or not activated on ".$deluser['server']['name']);
522 echo "Blocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
528 //SUBCOMMAND: unblock
529 function zncadmin_unblock() {
530 global $argv, $zncservers, $force;
531 $username = strtolower($argv[2]);
532 $server = strtolower($argv[3]);
534 error("missing username");
538 foreach($zncservers as $zncserver) {
539 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
540 if($username == strtolower($zncserver['auser'])) continue;
541 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
542 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
543 foreach($zncserver['conn']->getUserList() as $user) {
544 if(strtolower($user['user']) == $username) {
545 $delusers[] = array("server" => $zncserver, "user" => $user);
549 if(count($delusers) > 1) {
550 error($argv[2]." exists on multiple servers! please add the server name the user should be unblocked on.");
551 echo"Found User on following Servers:\n";
552 foreach($delusers as $server) {
553 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
555 } else if(count($delusers) == 0) {
556 error("Couldn't find an user called \002".$argv[2]."\002.");
557 } else if($delusers[0]['server']['protected'] && !$force) {
558 error("Access denied\n");
560 $deluser = $delusers[0];
561 $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], false);
562 if($ret == ERR_MODULE_NOT_FOUND) {
563 error("blockuser module is not installed or not activated on ".$deluser['server']['name']);
565 echo "Unblocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
572 function zncadmin_stats() {
573 global $argv, $zncservers;
574 $table = new Table(6);
575 $table->add("Server", "Port / SSL Port", "Total ZNC's", "Connected (IRC)", "Online (User)", "Protected?");
577 foreach($zncservers as $zncserver) {
581 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
582 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
583 foreach($zncserver['conn']->getUserList() as $user) {
584 if($user['server'] != "-N/A-") $connected++;
585 if($user['clients'] > 0) $online++;
588 $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : ""));
592 foreach($table->end() as $line) {
596 echo "No Servers configured...\n";