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])) {
75 error("invalid subcommand '".$argv[1]."'");
79 function preg_prepare($string,$wildcards = true,$pregstart = "#") {
80 $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart);
81 if(!$wildcards) array_push($in,"*");
83 foreach($in as $item) {
88 array_push($out,"(.*)");
90 $string = str_replace($in,$out,$string);
94 function generate_password() {
95 $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
96 $password_length = 10;
99 for($i = 0; $i < $password_length; $i++) {
100 $password .= $password_chars[rand(0, strlen($password_chars))-1];
105 function str2time($duration) {
109 for($i=0;$i<strlen($duration);$i++) {
110 if(is_numeric($duration[$i])) {
112 } else if($duration[$i] != " ") {
113 switch ($duration[$i]) {
142 $dur=$dur+($str*$mult);
150 /***********************************************************
151 * ZNCAdmin SUBCOMMANDS *
152 ***********************************************************/
155 function zncadmin_search() {
156 global $argv, $zncservers;
159 error("missing mask parameter");
162 $extraflags = array();
164 $extraflags = explode(" ", $argv[3]);
166 $mask = preg_prepare($mask);
167 $table = new Table(5);
168 $table->add("Server", "User", "Clients", "Server", "");
170 foreach($zncservers as $zncserver) {
171 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
172 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
173 foreach($zncserver['conn']->getUserList() as $user) {
175 foreach($extraflags as $flag) {
176 //some additional flags ;)
177 if($flag[0] == '-') {
178 $flag = substr($flag, 1);
180 } else if($flag[0] == '+') {
181 $flag = substr($flag, 1);
185 $flag = explode("=", $flag, 2);
187 switch (strtolower($flag[0])) {
189 $skip = (($user['clients'] > 0) != $positive);
192 $skip = (($user['server'] == "-N/A-") == $positive);
195 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive);
198 $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive);
201 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive);
204 $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive);
207 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive);
217 if(preg_match("#^".$mask."$#i", $user['user'])) {
219 if(isset($user['nick'])) {
222 $extra .= "Nick: ".$user['nick'];
224 $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra);
230 foreach($table->end() as $line) {
233 echo"Found \002".$count."\002 users.\n";
235 echo "no user matching \002".$argv[2]."\002 found.\n";
240 function zncadmin_seen() {
241 global $argv, $zncservers;
244 if($time[0] == '>' || $time[0] == '<') {
245 if($time[0] == '<') $over_time = false;
246 $time = substr($time, 1);
248 $time = time() - str2time($time);
251 error("missing time parameter");
255 $mask = preg_prepare($mask);
258 $table = new Table(4);
259 $table->add("Server", "User", "Seen", "Info");
261 foreach($zncservers as $zncserver) {
262 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
263 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
264 foreach($zncserver['conn']->getSeenList() as $user) {
265 if(preg_match("#^".$mask."$#i", $user['user']) && (($over_time && $user['seen_unix'] < $time) || (!$over_time && $user['seen_unix'] > $time))) {
266 $table->add($zncserver['name'], $user['user'], $user['seen'], $user['info']);
272 foreach($table->end() as $line) {
276 echo "no user matching \002".$argv[2]."\002 found.\n";
281 function zncadmin_del() {
282 global $argv, $zncservers, $force;
283 $username = strtolower($argv[2]);
285 error("missing username");
289 foreach($zncservers as $zncserver) {
290 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
291 if($username == strtolower($zncserver['auser'])) continue;
292 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
293 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
294 foreach($zncserver['conn']->getUserList() as $user) {
295 if(strtolower($user['user']) == $username) {
296 $delusers[] = array("server" => $zncserver, "user" => $user);
300 if(count($delusers) > 1) {
301 error($argv[2]." exists on multiple servers! please add the server name, the user should be removed from.");
302 echo"Found User on following Servers:\n";
303 foreach($delusers as $server) {
304 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
306 } else if(count($delusers) == 0) {
307 error("Couldn't find an user called \002".$argv[2]."\002.");
308 } else if($delusers[0]['server']['protected'] && !$force) {
309 error("Access denied\n");
311 $deluser = $delusers[0];
312 $deluser['server']['conn']->delZNC($deluser['user']['user']);
313 echo "Deleted \002".$deluser['user']['user']."\002 from Server \002".$deluser['server']['name']."\002\n";
319 function zncadmin_add() {
320 global $argv, $zncservers, $add_settings, $force;
321 $username = strtolower($argv[2]);
323 error("missing username");
328 foreach($zncservers as $zncserver) {
329 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
330 if(!$argv[3] && $zncserver['priority'] < $priority) continue;
331 if($zncserver['protected'] === true && !$force) {
332 error("Access denied\n");
335 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
336 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
337 $zncserver['users'] = $zncserver['conn']->getUserList();
339 foreach($zncserver['users'] as $user) {
340 if(strtolower($user['user']) == $username) $existing = true;
342 if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) {
343 if($zncserver['priority'] > $priority) {
344 $priority = $zncserver['priority'];
347 $addserv[] = $zncserver;
350 if(count($addserv) > 1) {
351 //select server with lowest user count
352 $usercount = count($addserv[0]['users']);
354 for($i = 1; $i < count($addserv); $i++) {
355 if(count($addserv[$i]['users']) < $usercount) {
356 $usercount = count($addserv[$i]['users']);
360 $addserv = $addserv[$selected];
361 } else if(count($addserv) == 0) {
362 error("Couldn't find a server the user could be added to.");
365 $addserv = $addserv[0];
367 $password = generate_password();
369 $settings['nick'] = $argv[2];
370 $settings['altnick'] = $argv[2]."`";
371 $settings['ident'] = $username;
372 $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['netmodules'], $add_settings['other']);
374 echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n";
375 echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n";
376 echo " Password: ".$password."\n";
378 echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n";
379 foreach($add_settings['mirccmds']['hosts'] AS $host) {
380 echo " /AS addmask *@*.".$host."\n";
382 echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
384 foreach($add_settings["channel"] AS $channel) {
385 $addserv['conn']->addChan($argv[2], $channel);
388 error("Error while adding user.");
392 function zncadmin_addOnce() {
393 global $argv, $zncservers, $add_settings, $force;
394 $username = strtolower($argv[2]);
396 error("missing username");
402 foreach($zncservers as $zncserver) {
403 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
404 if(!$argv[3] && $zncserver['priority'] < $priority) continue;
405 if($zncserver['protected'] === true && !$force) {
406 error("Access denied\n");
409 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
410 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
411 $zncserver['users'] = $zncserver['conn']->getUserList();
412 foreach($zncserver['users'] as $user) {
413 if(strtolower($user['user']) == $username) {
420 if(count($zncserver['users']) < $zncserver['maxznc']) {
421 if($zncserver['priority'] > $priority) {
422 $priority = $zncserver['priority'];
425 $addserv[] = $zncserver;
429 error("A User with username \002".$username."\002 already exists.");
432 if(count($addserv) > 1) {
433 //select server with lowest user count
434 $usercount = count($addserv[0]['users']);
436 for($i = 1; $i < count($addserv); $i++) {
437 if(count($addserv[$i]['users']) < $usercount) {
438 $usercount = count($addserv[$i]['users']);
442 $addserv = $addserv[$selected];
443 } else if(count($addserv) == 0) {
444 error("Couldn't find a server the user could be added to.");
447 $addserv = $addserv[0];
449 $password = generate_password();
451 $settings['nick'] = $argv[2];
452 $settings['altnick'] = $argv[2]."`";
453 $settings['ident'] = $username;
454 $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['netmodules'], $add_settings['other']);
456 echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n";
457 echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n";
458 echo " Password: ".$password."\n";
460 echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n";
461 foreach($add_settings['mirccmds']['hosts'] AS $host) {
462 echo " /AS addmask *@*.".$host."\n";
464 echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
466 foreach($add_settings["channel"] AS $channel) {
467 $addserv['conn']->addChan($argv[2], $channel);
470 error("Error while adding user.");
473 //SUBCOMMAND: resetpass
474 function zncadmin_resetpass() {
475 global $argv, $zncservers, $force;
476 $username = strtolower($argv[2]);
478 error("missing username");
482 foreach($zncservers as $zncserver) {
483 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
484 if($username == strtolower($zncserver['auser'])) continue;
485 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
486 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
487 foreach($zncserver['conn']->getUserList() as $user) {
488 if(strtolower($user['user']) == $username) {
489 $delusers[] = array("server" => $zncserver, "user" => $user);
493 if(count($delusers) > 1) {
494 error($argv[2]." exists on multiple servers! please add the server name the user, the password should be resetted, is on.");
495 echo"Found User on following Servers:\n";
496 foreach($delusers as $server) {
497 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
499 } else if(count($delusers) == 0) {
500 error("Couldn't find an user called \002".$argv[2]."\002.");
501 } else if($delusers[0]['server']['protected'] && !$force) {
502 error("Access denied\n");
504 $deluser = $delusers[0];
505 $password = generate_password();
506 $deluser['server']['conn']->editZNC($deluser['user']['user'], $password);
507 echo "Changed password of \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name']." to \002".$password."\002\n";
513 function zncadmin_simul() {
514 global $argv, $zncservers, $force;
515 $username = strtolower($argv[2]);
516 $server = strtolower($argv[3]);
519 error("missing username");
524 foreach($zncservers as $zncserver) {
525 if(strtolower($server) == strtolower($zncserver['name'])) {
531 $raw = $argv[3]." ".$raw;
536 error("missing raw");
540 foreach($zncservers as $zncserver) {
541 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
542 if($username == strtolower($zncserver['auser'])) continue;
543 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
544 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
545 foreach($zncserver['conn']->getUserList() as $user) {
546 if(strtolower($user['user']) == $username) {
547 $delusers[] = array("server" => $zncserver, "user" => $user);
551 if(count($delusers) > 1) {
552 error($argv[2]." exists on multiple servers! please add the server name the user should be simuled on.");
553 echo"Found User on following Servers:\n";
554 foreach($delusers as $server) {
555 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
557 } else if(count($delusers) == 0) {
558 error("Couldn't find an user called \002".$argv[2]."\002.");
559 } else if($delusers[0]['server']['protected'] && !$force) {
560 error("Access denied\n");
562 $deluser = $delusers[0];
563 $ret = $deluser['server']['conn']->simulZNC($deluser['user']['user'], $raw);
564 if($ret == ERR_MODULE_NOT_FOUND) {
565 error("send_raw module is not installed or not activated for user ".$deluser['server']['auser']." on ".$deluser['server']['name']);
567 echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n";
574 function zncadmin_whois() {
575 global $argv, $zncservers, $force;
576 $username = strtolower($argv[2]);
577 $server = strtolower($argv[3]);
579 error("missing username");
584 foreach($zncservers as $zncserver) {
585 if(strtolower($server) == strtolower($zncserver['name'])) {
594 $foundusers = array();
595 foreach($zncservers as $zncserver) {
596 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
597 if($username == strtolower($zncserver['auser'])) continue;
598 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
599 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
600 foreach($zncserver['conn']->getUserList() as $user) {
601 if(strtolower($user['user']) == $username) {
602 $foundusers[] = array("server" => $zncserver, "user" => $user);
606 if(count($foundusers) > 1) {
607 error($argv[2]." exists on multiple servers! please add the server name the user is on.");
608 echo"Found User on following Servers:\n";
609 foreach($foundusers as $server) {
610 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
612 } else if(count($foundusers) == 0) {
613 error("Couldn't find an user called \002".$argv[2]."\002.");
614 } else if($foundusers[0]['server']['protected'] && !$force) {
615 error("Access denied\n");
617 $founduser = $foundusers[0];
618 $info = $founduser['server']['conn']->getUserInfo($founduser['user']['user'], true);
620 error("failed getting infos for user ".$founduser['user']['user']." on ".$founduser['server']['name']);
623 echo "User: ".$founduser['user']['user']." (".$founduser['server']['name'].") || Conected to IRC: ".$founduser['user']['server']." || Conected to ZNC: ".$founduser['user']['clients']."\n";
625 $modulesstr = "User Modules: ";
626 foreach($info['loadmod'] as $module) {
627 if(strlen($module) == 0) continue;
628 if($modulesstr == "")
630 $modulesstr .= $module." ";
631 if(strlen($modulesstr) >= 170) {
632 echo $modulesstr."\n";
636 if($modulesstr != "")
637 echo $modulesstr."\n";
639 foreach($info['networks'] as $network) {
640 echo "Network \002".$network['name']."\002\n";
641 echo " Nickname: ".$network['nick']."\n";
642 $servers = str_replace(array("\r"), array(""), $network['settings']['servers']);
644 foreach(explode("\n", $servers) as $server) {
645 if(strlen($server) == 0) continue;
646 echo " ".$server."\n";
648 $channelstr = " Channel: ";
649 foreach($network['settings']['channel'] as $chan) {
650 if(strlen($chan) == 0) continue;
651 if($channelstr == "")
653 $channelstr .= $chan." ";
654 if(strlen($channelstr) >= 170) {
655 echo $channelstr."\n";
659 if($channelstr != "")
660 echo $channelstr."\n";
662 $modulesstr = " Modules: ";
663 foreach($network['settings']['loadmod'] as $module) {
664 if(strlen($module) == 0) continue;
665 if($modulesstr == "")
667 $modulesstr .= $module." ";
668 if(strlen($modulesstr) >= 170) {
669 echo $modulesstr."\n";
673 if($modulesstr != "")
674 echo $modulesstr."\n";
682 function zncadmin_block() {
683 global $argv, $zncservers, $force;
684 $username = strtolower($argv[2]);
685 $server = strtolower($argv[3]);
687 error("missing username");
691 foreach($zncservers as $zncserver) {
692 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
693 if($username == strtolower($zncserver['auser'])) continue;
694 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
695 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
696 foreach($zncserver['conn']->getUserList() as $user) {
697 if(strtolower($user['user']) == $username) {
698 $delusers[] = array("server" => $zncserver, "user" => $user);
702 if(count($delusers) > 1) {
703 error($argv[2]." exists on multiple servers! please add the server name the user should be blocked on.");
704 echo"Found User on following Servers:\n";
705 foreach($delusers as $server) {
706 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
708 } else if(count($delusers) == 0) {
709 error("Couldn't find an user called \002".$argv[2]."\002.");
710 } else if($delusers[0]['server']['protected'] && !$force) {
711 error("Access denied\n");
713 $deluser = $delusers[0];
714 $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], true);
715 if($ret == ERR_MODULE_NOT_FOUND) {
716 error("blockuser module is not installed or not activated on ".$deluser['server']['name']);
718 echo "Blocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
724 //SUBCOMMAND: unblock
725 function zncadmin_unblock() {
726 global $argv, $zncservers, $force;
727 $username = strtolower($argv[2]);
728 $server = strtolower($argv[3]);
730 error("missing username");
734 foreach($zncservers as $zncserver) {
735 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
736 if($username == strtolower($zncserver['auser'])) continue;
737 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
738 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
739 foreach($zncserver['conn']->getUserList() as $user) {
740 if(strtolower($user['user']) == $username) {
741 $delusers[] = array("server" => $zncserver, "user" => $user);
745 if(count($delusers) > 1) {
746 error($argv[2]." exists on multiple servers! please add the server name the user should be unblocked on.");
747 echo"Found User on following Servers:\n";
748 foreach($delusers as $server) {
749 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
751 } else if(count($delusers) == 0) {
752 error("Couldn't find an user called \002".$argv[2]."\002.");
753 } else if($delusers[0]['server']['protected'] && !$force) {
754 error("Access denied\n");
756 $deluser = $delusers[0];
757 $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], false);
758 if($ret == ERR_MODULE_NOT_FOUND) {
759 error("blockuser module is not installed or not activated on ".$deluser['server']['name']);
761 echo "Unblocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
768 function zncadmin_stats() {
769 global $argv, $zncservers;
770 $table = new Table(6);
771 $table->add("Server", "Port / SSL Port", "Total ZNC's", "Connected (IRC)", "Online (User)", "Protected?");
773 foreach($zncservers as $zncserver) {
777 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
778 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
779 foreach($zncserver['conn']->getUserList() as $user) {
780 if($user['server'] != "-N/A-") $connected++;
781 if($user['clients'] > 0) $online++;
784 $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : ""));
788 foreach($table->end() as $line) {
792 echo "No Servers configured...\n";