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])) {
72 error("invalid subcommand '".$argv[1]."'");
76 function preg_prepare($string,$wildcards = true,$pregstart = "#") {
77 $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart);
78 if(!$wildcards) array_push($in,"*");
80 foreach($in as $item) {
85 array_push($out,"(.*)");
87 $string = str_replace($in,$out,$string);
91 function generate_password() {
92 $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
93 $password_length = 10;
96 for($i = 0; $i < $password_length; $i++) {
97 $password .= $password_chars[rand(0, strlen($password_chars))-1];
102 function str2time($duration) {
106 for($i=0;$i<strlen($duration);$i++) {
107 if(is_numeric($duration[$i])) {
109 } else if($duration[$i] != " ") {
110 switch ($duration[$i]) {
139 $dur=$dur+($str*$mult);
147 /***********************************************************
148 * ZNCAdmin SUBCOMMANDS *
149 ***********************************************************/
152 function zncadmin_search() {
153 global $argv, $zncservers;
156 error("missing mask parameter");
159 $extraflags = array();
161 $extraflags = explode(" ", $argv[3]);
163 $mask = preg_prepare($mask);
164 $table = new Table(5);
165 $table->add("Server", "User", "Clients", "Server", "");
167 foreach($zncservers as $zncserver) {
168 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
169 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
170 foreach($zncserver['conn']->getUserList() as $user) {
172 foreach($extraflags as $flag) {
173 //some additional flags ;)
174 if($flag[0] == '-') {
175 $flag = substr($flag, 1);
177 } else if($flag[0] == '+') {
178 $flag = substr($flag, 1);
182 $flag = explode("=", $flag, 2);
184 switch (strtolower($flag[0])) {
186 $skip = (($user['clients'] > 0) != $positive);
189 $skip = (($user['server'] == "-N/A-") == $positive);
192 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive);
195 $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive);
198 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive);
201 $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive);
204 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive);
214 if(preg_match("#^".$mask."$#i", $user['user'])) {
216 if(isset($user['nick'])) {
219 $extra .= "Nick: ".$user['nick'];
221 $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra);
227 foreach($table->end() as $line) {
230 echo"Found \002".$count."\002 users.\n";
232 echo "no user matching \002".$argv[2]."\002 found.\n";
237 function zncadmin_seen() {
238 global $argv, $zncservers;
241 if($time[0] == '>' || $time[0] == '<') {
242 if($time[0] == '<') $over_time = false;
243 $time = substr($time, 1);
245 $time = time() - str2time($time);
248 error("missing time parameter");
252 $mask = preg_prepare($mask);
255 $table = new Table(4);
256 $table->add("Server", "User", "Seen", "Info");
258 foreach($zncservers as $zncserver) {
259 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
260 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
261 foreach($zncserver['conn']->getSeenList() as $user) {
262 if(preg_match("#^".$mask."$#i", $user['user']) && (($over_time && $user['seen_unix'] < $time) || (!$over_time && $user['seen_unix'] > $time))) {
263 $table->add($zncserver['name'], $user['user'], $user['seen'], $user['info']);
269 foreach($table->end() as $line) {
273 echo "no user matching \002".$argv[2]."\002 found.\n";
278 function zncadmin_del() {
279 global $argv, $zncservers, $force;
280 $username = strtolower($argv[2]);
282 error("missing username");
286 foreach($zncservers as $zncserver) {
287 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
288 if($username == strtolower($zncserver['auser'])) continue;
289 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
290 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
291 foreach($zncserver['conn']->getUserList() as $user) {
292 if(strtolower($user['user']) == $username) {
293 $delusers[] = array("server" => $zncserver, "user" => $user);
297 if(count($delusers) > 1) {
298 error($argv[2]." exists on multiple servers! please add the server name, the user should be removed from.");
299 echo"Found User on following Servers:\n";
300 foreach($delusers as $server) {
301 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
303 } else if(count($delusers) == 0) {
304 error("Couldn't find an user called \002".$argv[2]."\002.");
305 } else if($delusers[0]['server']['protected'] && !$force) {
306 error("Access denied\n");
308 $deluser = $delusers[0];
309 $deluser['server']['conn']->delZNC($deluser['user']['user']);
310 echo "Deleted \002".$deluser['user']['user']."\002 from Server \002".$deluser['server']['name']."\002\n";
316 function zncadmin_add() {
317 global $argv, $zncservers, $add_settings, $force;
318 $username = strtolower($argv[2]);
320 error("missing username");
325 foreach($zncservers as $zncserver) {
326 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
327 if(!$argv[3] && $zncserver['priority'] < $priority) continue;
328 if($zncserver['protected'] === true && !$force) {
329 error("Access denied\n");
332 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
333 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
334 $zncserver['users'] = $zncserver['conn']->getUserList();
336 foreach($zncserver['users'] as $user) {
337 if(strtolower($user['user']) == $username) $existing = true;
339 if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) {
340 if($zncserver['priority'] > $priority) {
341 $priority = $zncserver['priority'];
344 $addserv[] = $zncserver;
347 if(count($addserv) > 1) {
348 //select server with lowest user count
349 $usercount = count($addserv[0]['users']);
351 for($i = 1; $i < count($addserv); $i++) {
352 if(count($addserv[$i]['users']) < $usercount) {
353 $usercount = count($addserv[$i]['users']);
357 $addserv = $addserv[$selected];
358 } else if(count($addserv) == 0) {
359 error("Couldn't find a server the user could be added to.");
362 $addserv = $addserv[0];
364 $password = generate_password();
366 $settings['nick'] = $argv[2];
367 $settings['altnick'] = $argv[2]."`";
368 $settings['ident'] = $username;
369 $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['netmodules'], $add_settings['other']);
371 echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n";
372 echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n";
373 echo " Password: ".$password."\n";
375 echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n";
376 foreach($add_settings['mirccmds']['hosts'] AS $host) {
377 echo " /AS addmask *@*.".$host."\n";
379 echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
381 foreach($add_settings["channel"] AS $channel) {
382 $addserv['conn']->addChan($argv[2], $channel);
385 error("Error while adding user.");
388 //SUBCOMMAND: resetpass
389 function zncadmin_resetpass() {
390 global $argv, $zncservers, $force;
391 $username = strtolower($argv[2]);
393 error("missing username");
397 foreach($zncservers as $zncserver) {
398 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
399 if($username == strtolower($zncserver['auser'])) continue;
400 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
401 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
402 foreach($zncserver['conn']->getUserList() as $user) {
403 if(strtolower($user['user']) == $username) {
404 $delusers[] = array("server" => $zncserver, "user" => $user);
408 if(count($delusers) > 1) {
409 error($argv[2]." exists on multiple servers! please add the server name the user, the password should be resetted, is on.");
410 echo"Found User on following Servers:\n";
411 foreach($delusers as $server) {
412 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
414 } else if(count($delusers) == 0) {
415 error("Couldn't find an user called \002".$argv[2]."\002.");
416 } else if($delusers[0]['server']['protected'] && !$force) {
417 error("Access denied\n");
419 $deluser = $delusers[0];
420 $password = generate_password();
421 $deluser['server']['conn']->editZNC($deluser['user']['user'], $password);
422 echo "Changed password of \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name']." to \002".$password."\002\n";
428 function zncadmin_simul() {
429 global $argv, $zncservers, $force;
430 $username = strtolower($argv[2]);
431 $server = strtolower($argv[3]);
434 error("missing username");
439 foreach($zncservers as $zncserver) {
440 if(strtolower($server) == strtolower($zncserver['name'])) {
446 $raw = $argv[3]." ".$raw;
451 error("missing raw");
455 foreach($zncservers as $zncserver) {
456 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
457 if($username == strtolower($zncserver['auser'])) continue;
458 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
459 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
460 foreach($zncserver['conn']->getUserList() as $user) {
461 if(strtolower($user['user']) == $username) {
462 $delusers[] = array("server" => $zncserver, "user" => $user);
466 if(count($delusers) > 1) {
467 error($argv[2]." exists on multiple servers! please add the server name the user should be simuled on.");
468 echo"Found User on following Servers:\n";
469 foreach($delusers as $server) {
470 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
472 } else if(count($delusers) == 0) {
473 error("Couldn't find an user called \002".$argv[2]."\002.");
474 } else if($delusers[0]['server']['protected'] && !$force) {
475 error("Access denied\n");
477 $deluser = $delusers[0];
478 $ret = $deluser['server']['conn']->simulZNC($deluser['user']['user'], $raw);
479 if($ret == ERR_MODULE_NOT_FOUND) {
480 error("send_raw module is not installed or not activated for user ".$deluser['server']['auser']." on ".$deluser['server']['name']);
482 echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n";
489 function zncadmin_whois() {
490 global $argv, $zncservers, $force;
491 $username = strtolower($argv[2]);
492 $server = strtolower($argv[3]);
494 error("missing username");
499 foreach($zncservers as $zncserver) {
500 if(strtolower($server) == strtolower($zncserver['name'])) {
509 $foundusers = array();
510 foreach($zncservers as $zncserver) {
511 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
512 if($username == strtolower($zncserver['auser'])) continue;
513 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
514 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
515 foreach($zncserver['conn']->getUserList() as $user) {
516 if(strtolower($user['user']) == $username) {
517 $foundusers[] = array("server" => $zncserver, "user" => $user);
521 if(count($foundusers) > 1) {
522 error($argv[2]." exists on multiple servers! please add the server name the user is on.");
523 echo"Found User on following Servers:\n";
524 foreach($foundusers as $server) {
525 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
527 } else if(count($foundusers) == 0) {
528 error("Couldn't find an user called \002".$argv[2]."\002.");
529 } else if($foundusers[0]['server']['protected'] && !$force) {
530 error("Access denied\n");
532 $founduser = $foundusers[0];
533 $info = $founduser['server']['conn']->getUserInfo($founduser['user']['user'], true);
535 error("failed getting infos for user ".$founduser['user']['user']." on ".$founduser['server']['name']);
538 echo "User: ".$founduser['user']['user']." (".$founduser['server']['name'].") || Conected to IRC: ".$founduser['user']['server']." || Conected to ZNC: ".$founduser['user']['clients']."\n";
540 $modulesstr = "User Modules: ";
541 foreach($info['loadmod'] as $module) {
542 if(strlen($module) == 0) continue;
543 if($modulesstr == "")
545 $modulesstr .= $module." ";
546 if(strlen($modulesstr) >= 170) {
547 echo $modulesstr."\n";
551 if($modulesstr != "")
552 echo $modulesstr."\n";
554 foreach($info['networks'] as $network) {
555 echo "Network \002".$network['name']."\002\n";
556 echo " Nickname: ".$network['nick']."\n";
557 $servers = str_replace(array("\r"), array(""), $network['settings']['servers']);
559 foreach(explode("\n", $servers) as $server) {
560 if(strlen($server) == 0) continue;
561 echo " ".$server."\n";
563 $channelstr = " Channel: ";
564 foreach($network['settings']['channel'] as $chan) {
565 if(strlen($chan) == 0) continue;
566 if($channelstr == "")
568 $channelstr .= $chan." ";
569 if(strlen($channelstr) >= 170) {
570 echo $channelstr."\n";
574 if($channelstr != "")
575 echo $channelstr."\n";
577 $modulesstr = " Modules: ";
578 foreach($network['settings']['loadmod'] as $module) {
579 if(strlen($module) == 0) continue;
580 if($modulesstr == "")
582 $modulesstr .= $module." ";
583 if(strlen($modulesstr) >= 170) {
584 echo $modulesstr."\n";
588 if($modulesstr != "")
589 echo $modulesstr."\n";
597 function zncadmin_block() {
598 global $argv, $zncservers, $force;
599 $username = strtolower($argv[2]);
600 $server = strtolower($argv[3]);
602 error("missing username");
606 foreach($zncservers as $zncserver) {
607 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
608 if($username == strtolower($zncserver['auser'])) continue;
609 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
610 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
611 foreach($zncserver['conn']->getUserList() as $user) {
612 if(strtolower($user['user']) == $username) {
613 $delusers[] = array("server" => $zncserver, "user" => $user);
617 if(count($delusers) > 1) {
618 error($argv[2]." exists on multiple servers! please add the server name the user should be blocked on.");
619 echo"Found User on following Servers:\n";
620 foreach($delusers as $server) {
621 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
623 } else if(count($delusers) == 0) {
624 error("Couldn't find an user called \002".$argv[2]."\002.");
625 } else if($delusers[0]['server']['protected'] && !$force) {
626 error("Access denied\n");
628 $deluser = $delusers[0];
629 $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], true);
630 if($ret == ERR_MODULE_NOT_FOUND) {
631 error("blockuser module is not installed or not activated on ".$deluser['server']['name']);
633 echo "Blocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
639 //SUBCOMMAND: unblock
640 function zncadmin_unblock() {
641 global $argv, $zncservers, $force;
642 $username = strtolower($argv[2]);
643 $server = strtolower($argv[3]);
645 error("missing username");
649 foreach($zncservers as $zncserver) {
650 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
651 if($username == strtolower($zncserver['auser'])) continue;
652 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
653 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
654 foreach($zncserver['conn']->getUserList() as $user) {
655 if(strtolower($user['user']) == $username) {
656 $delusers[] = array("server" => $zncserver, "user" => $user);
660 if(count($delusers) > 1) {
661 error($argv[2]." exists on multiple servers! please add the server name the user should be unblocked on.");
662 echo"Found User on following Servers:\n";
663 foreach($delusers as $server) {
664 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
666 } else if(count($delusers) == 0) {
667 error("Couldn't find an user called \002".$argv[2]."\002.");
668 } else if($delusers[0]['server']['protected'] && !$force) {
669 error("Access denied\n");
671 $deluser = $delusers[0];
672 $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], false);
673 if($ret == ERR_MODULE_NOT_FOUND) {
674 error("blockuser module is not installed or not activated on ".$deluser['server']['name']);
676 echo "Unblocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
683 function zncadmin_stats() {
684 global $argv, $zncservers;
685 $table = new Table(6);
686 $table->add("Server", "Port / SSL Port", "Total ZNC's", "Connected (IRC)", "Online (User)", "Protected?");
688 foreach($zncservers as $zncserver) {
692 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL));
693 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
694 foreach($zncserver['conn']->getUserList() as $user) {
695 if($user['server'] != "-N/A-") $connected++;
696 if($user['clients'] > 0) $online++;
699 $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : ""));
703 foreach($table->end() as $line) {
707 echo "No Servers configured...\n";