added whois command
[ZNCAdmin.git] / zncadmin.php
1 <?php
2 /* czncadmin.php - main script - ZNCAdmin
3  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
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 3 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 
16  * along with this program. If not, see <http://www.gnu.org/licenses/>. 
17  */
18
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");
23
24 require_once("config.inc.php");
25
26 /*
27 $argv[1]   subcommand
28 */
29
30 function error($msg) {
31     echo"\00304ZNCAdmin error:\003 ".$msg."\n";
32 }
33
34 if(strtolower($argv[1]) == "force") {
35     $argv = array_slice($argv, 1);
36     $force = true;
37 } else
38     $force = false;
39
40 switch(strtolower($argv[1])) {
41     case "add":
42         zncadmin_add();
43         break;
44     case "del":
45         zncadmin_del();
46         break;
47     case "search":
48         zncadmin_search();
49         break;
50         case "whois":
51                 zncadmin_whois();
52                 break;
53         case "seen":
54         zncadmin_seen();
55         break;
56     case "resetpass":
57         zncadmin_resetpass();
58         break;
59     case "simul":
60         zncadmin_simul();
61         break;
62     case "block":
63         zncadmin_block();
64         break;
65     case "unblock":
66         zncadmin_unblock();
67         break;
68     case "stats":
69         zncadmin_stats();
70         break;
71     default:
72         error("invalid subcommand '".$argv[1]."'");
73         break;
74 }
75
76 function preg_prepare($string,$wildcards = true,$pregstart = "#") {
77     $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart);
78     if(!$wildcards) array_push($in,"*");
79     $out = array();
80     foreach($in as $item) {
81         $out[] = "\\".$item;
82     }
83     if($wildcards) { 
84         array_push($in,"*");
85         array_push($out,"(.*)");
86     }
87     $string = str_replace($in,$out,$string);
88     return $string;
89 }
90
91 function generate_password() {
92     $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
93     $password_length = 10;
94     $password = 0;
95     srand();
96     for($i = 0; $i < $password_length; $i++) {
97         $password .= $password_chars[rand(0, strlen($password_chars))-1];
98     }
99     return $password;
100 }
101
102 function str2time($duration) {
103     $str="0";
104     $dur=0;
105     $mult=1;
106     for($i=0;$i<strlen($duration);$i++) {
107         if(is_numeric($duration[$i])) {
108             $str.=$duration[$i];
109         } else if($duration[$i] != " ") {
110             switch ($duration[$i]) {
111                 case "y":
112                     $mult=365*24*60*60;
113                     break;
114                 case "M":
115                     $mult=31*24*60*60;
116                     break;
117                 case "w":
118                     $mult=7*24*60*60;
119                     break;
120                 case "d":
121                     $mult=24*60*60;
122                     break;
123                 case "h":
124                     $mult=60*60;
125                     break;
126                 case "m":
127                     $mult=60;
128                     break;
129                 case "s":
130                     $mult=1;
131                     break;
132                 case "*":
133                     $mult=0;
134                     break;
135                 default:
136                     return null;
137                     break;
138             }
139             $dur=$dur+($str*$mult);
140             $str="0";
141         }
142     }
143     $dur=$dur+$str;
144     return $dur;
145 }
146
147 /***********************************************************
148  *                   ZNCAdmin SUBCOMMANDS                  *
149  ***********************************************************/
150
151 //SUBCOMMAND: search
152 function zncadmin_search() {
153     global $argv, $zncservers;
154     $mask = $argv[2];
155     if(!$mask) {
156         error("missing mask parameter");
157         return;
158     }
159     $extraflags = array();
160     if($argv[3]) {
161         $extraflags = explode(" ", $argv[3]);
162     }
163     $mask = preg_prepare($mask);
164     $table = new Table(5);
165     $table->add("Server", "User", "Clients", "Server", "");
166     $count = 0;
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) {
171             $skip = false;
172             foreach($extraflags as $flag) {
173                 //some additional flags ;)
174                 if($flag[0] == '-') {
175                     $flag = substr($flag, 1);
176                     $positive = false;
177                 } else if($flag[0] == '+') {
178                     $flag = substr($flag, 1);
179                     $positive = true;
180                 } else
181                     $positive = true;
182                 $flag = explode("=", $flag, 2);
183                 $flagval = $flag[1];
184                 switch (strtolower($flag[0])) {
185                     case "online":
186                         $skip = (($user['clients'] > 0) != $positive);
187                         break;
188                     case "connected":
189                         $skip = (($user['server'] == "-N/A-") == $positive);
190                         break;
191                     case "server":
192                         $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive);
193                         break;
194                     case "server_regex":
195                         $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive);
196                         break;
197                     case "nick":
198                         $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive);
199                         break;
200                     case "nick_regex":
201                         $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive);
202                         break;
203                     case "znc":
204                         $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive);
205                         break;
206                     default:
207                         
208                         break;
209                 }
210                 if($skip)
211                     break;
212             }
213             if($skip) continue;
214             if(preg_match("#^".$mask."$#i", $user['user'])) {
215                 $extra = "";
216                 if(isset($user['nick'])) {
217                     if($extra != "")
218                         $extra .= ", ";
219                     $extra .= "Nick: ".$user['nick'];
220                 }
221                 $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra);
222                 $count++;
223             }
224         }
225     }
226     if($count) {
227         foreach($table->end() as $line) {
228             echo$line."\n";
229         }
230         echo"Found \002".$count."\002 users.\n";
231     } else {
232         echo "no user matching \002".$argv[2]."\002 found.\n";
233     }
234 }
235
236 //SUBCOMMAND: seen
237 function zncadmin_seen() {
238     global $argv, $zncservers;
239         $time = $argv[2];
240         $over_time = true;
241         if($time[0] == '>' || $time[0] == '<') {
242                 if($time[0] == '<') $over_time = false;
243                 $time = substr($time, 1);
244         }
245         $time = time() - str2time($time);
246     $mask = $argv[3];
247     if(!$time) {
248         error("missing time parameter");
249         return;
250     }
251     if($mask)
252         $mask = preg_prepare($mask);
253     else
254         $mask = "(.*)";
255     $table = new Table(4);
256     $table->add("Server", "User", "Seen", "Info");
257     $found = false;
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']);
264                 $found = true;
265             }
266         }
267     }
268     if($found) {
269         foreach($table->end() as $line) {
270             echo$line."\n";
271         }
272     } else {
273         echo "no user matching \002".$argv[2]."\002 found.\n";
274     }
275 }
276
277 //SUBCOMMAND: del
278 function zncadmin_del() {
279     global $argv, $zncservers, $force;
280     $username = strtolower($argv[2]);
281     if(!$username) {
282         error("missing username");
283         return;
284     }
285     $delusers = array();
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);
294             }
295         }
296     }
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";
302         }
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");
307     } else {
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";
311         echo"/log\n";
312     }
313 }
314
315 //SUBCOMMAND: add
316 function zncadmin_add() {
317     global $argv, $zncservers, $add_settings, $force;
318     $username = strtolower($argv[2]);
319     if(!$username) {
320         error("missing username");
321         return;
322     }
323     $addserv = array();
324     $priority = 1;
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");
330             return;
331         }
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();
335         $existing = false;
336         foreach($zncserver['users'] as $user) {
337             if(strtolower($user['user']) == $username) $existing = true;
338         }
339         if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) {
340             if($zncserver['priority'] > $priority) {
341                 $priority = $zncserver['priority'];
342                 $addserv = array();
343             }
344             $addserv[] = $zncserver;
345         }
346     }
347     if(count($addserv) > 1) {
348         //select server with lowest user count
349         $usercount = count($addserv[0]['users']);
350         $selected = 0;
351         for($i = 1; $i < count($addserv); $i++) {
352             if(count($addserv[$i]['users']) < $usercount) {
353                 $usercount = count($addserv[$i]['users']);
354                 $selected = $i;
355             }
356         }
357         $addserv = $addserv[$selected];
358     } else if(count($addserv) == 0) {
359         error("Couldn't find a server the user could be added to.");
360         return;
361     } else {
362         $addserv = $addserv[0];
363     }
364     $password = generate_password();
365     $settings = array();
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']);
370     if($ret) {
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";
374         echo "[mIRC]\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";
378         }
379         echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
380         echo"/log\n";
381         foreach($add_settings["channel"] AS $channel) {
382             $addserv['conn']->addChan($argv[2], $channel);
383         }
384     } else
385         error("Error while adding user.");
386 }
387
388 //SUBCOMMAND: resetpass
389 function zncadmin_resetpass() {
390     global $argv, $zncservers, $force;
391     $username = strtolower($argv[2]);
392     if(!$username) {
393         error("missing username");
394         return;
395     }
396     $delusers = array();
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);
405             }
406         }
407     }
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";
413         }
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");
418     } else {
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";
423         echo"/log\n";
424     }
425 }
426
427 //SUBCOMMAND: simul
428 function zncadmin_simul() {
429     global $argv, $zncservers, $force;
430     $username = strtolower($argv[2]);
431     $server = strtolower($argv[3]);
432     $raw = $argv[4];
433     if(!$username) {
434         error("missing username");
435         return;
436     }
437     if($server) {
438         $found = false;
439         foreach($zncservers as $zncserver) {
440             if(strtolower($server) == strtolower($zncserver['name'])) {
441                 $found = true;
442                 break;
443             }
444         }
445         if(!$found) {
446             $raw = $argv[3]." ".$raw;
447             $server = null;
448         }
449     }
450     if(!$raw) {
451         error("missing raw");
452         return;
453     }
454     $delusers = array();
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);
463             }
464         }
465     }
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";
471         }
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");
476     } else {
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']);
481         } else {
482             echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n";
483             echo"/log\n";
484         }
485     }
486 }
487
488 //SUBCOMMAND: whois
489 function zncadmin_whois() {
490     global $argv, $zncservers, $force;
491     $username = strtolower($argv[2]);
492     $server = strtolower($argv[3]);
493     if(!$username) {
494         error("missing username");
495         return;
496     }
497     if($server) {
498         $found = false;
499         foreach($zncservers as $zncserver) {
500             if(strtolower($server) == strtolower($zncserver['name'])) {
501                 $found = true;
502                 break;
503             }
504         }
505         if(!$found) {
506             $server = null;
507         }
508     }
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);
518             }
519         }
520     }
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";
526         }
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");
531     } else {
532         $founduser = $foundusers[0];
533         $info = $founduser['server']['conn']->getUserInfo($founduser['user']['user'], true);
534         if(!$info) {
535             error("failed getting infos for user ".$founduser['user']['user']." on ".$founduser['server']['name']);
536         } else {
537                         
538                         echo "User: ".$founduser['user']['user']." (".$founduser['server']['name'].") || Conected to IRC: ".$founduser['user']['server']." || Conected to ZNC: ".$founduser['user']['clients']."\n";
539                         
540                         $modulesstr = "User Modules: ";
541                         foreach($info['loadmod'] as $module) {
542                                 if(strlen($module) == 0) continue;
543                                 if($modulesstr == "")
544                                         $modulesstr = "  ";
545                                 $modulesstr .= $module." ";
546                                 if(strlen($modulesstr) >= 170) {
547                                         echo $modulesstr."\n";
548                                         $modulesstr = "";
549                                 }
550                         }
551                         if($modulesstr != "")
552                                 echo $modulesstr."\n";
553                         
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']);
558                                 echo "  Server:\n";
559                                 foreach(explode("\n", $servers) as $server) {
560                                         if(strlen($server) == 0) continue;
561                                         echo "    ".$server."\n";
562                                 }
563                                 $channelstr = "  Channel: ";
564                                 foreach($network['settings']['channel'] as $chan) {
565                                         if(strlen($chan) == 0) continue;
566                                         if($channelstr == "")
567                                                 $channelstr = "    ";
568                                         $channelstr .= $chan." ";
569                                         if(strlen($channelstr) >= 170) {
570                                                 echo $channelstr."\n";
571                                                 $channelstr = "";
572                                         }
573                                 }
574                                 if($channelstr != "")
575                                         echo $channelstr."\n";
576                                 
577                                 $modulesstr = "  Modules: ";
578                                 foreach($network['settings']['loadmod'] as $module) {
579                                         if(strlen($module) == 0) continue;
580                                         if($modulesstr == "")
581                                                 $modulesstr = "    ";
582                                         $modulesstr .= $module." ";
583                                         if(strlen($modulesstr) >= 170) {
584                                                 echo $modulesstr."\n";
585                                                 $modulesstr = "";
586                                         }
587                                 }
588                                 if($modulesstr != "")
589                                         echo $modulesstr."\n";
590                         }
591             
592         }
593     }
594 }
595
596 //SUBCOMMAND: block
597 function zncadmin_block() {
598     global $argv, $zncservers, $force;
599     $username = strtolower($argv[2]);
600     $server = strtolower($argv[3]);
601     if(!$username) {
602         error("missing username");
603         return;
604     }
605     $delusers = array();
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);
614             }
615         }
616     }
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";
622         }
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");
627     } else {
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']);
632         } else {
633             echo "Blocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
634             echo"/log\n";
635         }
636     }
637 }
638
639 //SUBCOMMAND: unblock
640 function zncadmin_unblock() {
641     global $argv, $zncservers, $force;
642     $username = strtolower($argv[2]);
643     $server = strtolower($argv[3]);
644     if(!$username) {
645         error("missing username");
646         return;
647     }
648     $delusers = array();
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);
657             }
658         }
659     }
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";
665         }
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");
670     } else {
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']);
675         } else {
676             echo "Unblocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
677             echo"/log\n";
678         }
679     }
680 }
681
682 //SUBCOMMAND: stats
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?");
687     $count = 0;
688     foreach($zncservers as $zncserver) {
689         $total = 0;
690         $connected = 0;
691         $online = 0;
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++;
697             $total++;
698         }
699         $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : ""));
700         $count++;
701     }
702     if($count) {
703         foreach($table->end() as $line) {
704             echo$line."\n";
705         }
706     } else {
707         echo "No Servers configured...\n";
708     }
709 }
710
711 ?>