added addOnce 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 "addonce":
45                 zncadmin_addOnce();
46                 break;
47     case "del":
48         zncadmin_del();
49         break;
50     case "search":
51         zncadmin_search();
52         break;
53         case "whois":
54                 zncadmin_whois();
55                 break;
56         case "seen":
57         zncadmin_seen();
58         break;
59     case "resetpass":
60         zncadmin_resetpass();
61         break;
62     case "simul":
63         zncadmin_simul();
64         break;
65     case "block":
66         zncadmin_block();
67         break;
68     case "unblock":
69         zncadmin_unblock();
70         break;
71     case "stats":
72         zncadmin_stats();
73         break;
74     default:
75         error("invalid subcommand '".$argv[1]."'");
76         break;
77 }
78
79 function preg_prepare($string,$wildcards = true,$pregstart = "#") {
80     $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart);
81     if(!$wildcards) array_push($in,"*");
82     $out = array();
83     foreach($in as $item) {
84         $out[] = "\\".$item;
85     }
86     if($wildcards) { 
87         array_push($in,"*");
88         array_push($out,"(.*)");
89     }
90     $string = str_replace($in,$out,$string);
91     return $string;
92 }
93
94 function generate_password() {
95     $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
96     $password_length = 10;
97     $password = 0;
98     srand();
99     for($i = 0; $i < $password_length; $i++) {
100         $password .= $password_chars[rand(0, strlen($password_chars))-1];
101     }
102     return $password;
103 }
104
105 function str2time($duration) {
106     $str="0";
107     $dur=0;
108     $mult=1;
109     for($i=0;$i<strlen($duration);$i++) {
110         if(is_numeric($duration[$i])) {
111             $str.=$duration[$i];
112         } else if($duration[$i] != " ") {
113             switch ($duration[$i]) {
114                 case "y":
115                     $mult=365*24*60*60;
116                     break;
117                 case "M":
118                     $mult=31*24*60*60;
119                     break;
120                 case "w":
121                     $mult=7*24*60*60;
122                     break;
123                 case "d":
124                     $mult=24*60*60;
125                     break;
126                 case "h":
127                     $mult=60*60;
128                     break;
129                 case "m":
130                     $mult=60;
131                     break;
132                 case "s":
133                     $mult=1;
134                     break;
135                 case "*":
136                     $mult=0;
137                     break;
138                 default:
139                     return null;
140                     break;
141             }
142             $dur=$dur+($str*$mult);
143             $str="0";
144         }
145     }
146     $dur=$dur+$str;
147     return $dur;
148 }
149
150 /***********************************************************
151  *                   ZNCAdmin SUBCOMMANDS                  *
152  ***********************************************************/
153
154 //SUBCOMMAND: search
155 function zncadmin_search() {
156     global $argv, $zncservers;
157     $mask = $argv[2];
158     if(!$mask) {
159         error("missing mask parameter");
160         return;
161     }
162     $extraflags = array();
163     if($argv[3]) {
164         $extraflags = explode(" ", $argv[3]);
165     }
166     $mask = preg_prepare($mask);
167     $table = new Table(5);
168     $table->add("Server", "User", "Clients", "Server", "");
169     $count = 0;
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) {
174             $skip = false;
175             foreach($extraflags as $flag) {
176                 //some additional flags ;)
177                 if($flag[0] == '-') {
178                     $flag = substr($flag, 1);
179                     $positive = false;
180                 } else if($flag[0] == '+') {
181                     $flag = substr($flag, 1);
182                     $positive = true;
183                 } else
184                     $positive = true;
185                 $flag = explode("=", $flag, 2);
186                 $flagval = $flag[1];
187                 switch (strtolower($flag[0])) {
188                     case "online":
189                         $skip = (($user['clients'] > 0) != $positive);
190                         break;
191                     case "connected":
192                         $skip = (($user['server'] == "-N/A-") == $positive);
193                         break;
194                     case "server":
195                         $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive);
196                         break;
197                     case "server_regex":
198                         $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive);
199                         break;
200                     case "nick":
201                         $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive);
202                         break;
203                     case "nick_regex":
204                         $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive);
205                         break;
206                     case "znc":
207                         $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive);
208                         break;
209                     default:
210                         
211                         break;
212                 }
213                 if($skip)
214                     break;
215             }
216             if($skip) continue;
217             if(preg_match("#^".$mask."$#i", $user['user'])) {
218                 $extra = "";
219                 if(isset($user['nick'])) {
220                     if($extra != "")
221                         $extra .= ", ";
222                     $extra .= "Nick: ".$user['nick'];
223                 }
224                 $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra);
225                 $count++;
226             }
227         }
228     }
229     if($count) {
230         foreach($table->end() as $line) {
231             echo$line."\n";
232         }
233         echo"Found \002".$count."\002 users.\n";
234     } else {
235         echo "no user matching \002".$argv[2]."\002 found.\n";
236     }
237 }
238
239 //SUBCOMMAND: seen
240 function zncadmin_seen() {
241     global $argv, $zncservers;
242         $time = $argv[2];
243         $over_time = true;
244         if($time[0] == '>' || $time[0] == '<') {
245                 if($time[0] == '<') $over_time = false;
246                 $time = substr($time, 1);
247         }
248         $time = time() - str2time($time);
249     $mask = $argv[3];
250     if(!$time) {
251         error("missing time parameter");
252         return;
253     }
254     if($mask)
255         $mask = preg_prepare($mask);
256     else
257         $mask = "(.*)";
258     $table = new Table(4);
259     $table->add("Server", "User", "Seen", "Info");
260     $found = false;
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']);
267                 $found = true;
268             }
269         }
270     }
271     if($found) {
272         foreach($table->end() as $line) {
273             echo$line."\n";
274         }
275     } else {
276         echo "no user matching \002".$argv[2]."\002 found.\n";
277     }
278 }
279
280 //SUBCOMMAND: del
281 function zncadmin_del() {
282     global $argv, $zncservers, $force;
283     $username = strtolower($argv[2]);
284     if(!$username) {
285         error("missing username");
286         return;
287     }
288     $delusers = array();
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);
297             }
298         }
299     }
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";
305         }
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");
310     } else {
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";
314         echo"/log\n";
315     }
316 }
317
318 //SUBCOMMAND: add
319 function zncadmin_add() {
320     global $argv, $zncservers, $add_settings, $force;
321     $username = strtolower($argv[2]);
322     if(!$username) {
323         error("missing username");
324         return;
325     }
326     $addserv = array();
327     $priority = 1;
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");
333             return;
334         }
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();
338         $existing = false;
339         foreach($zncserver['users'] as $user) {
340             if(strtolower($user['user']) == $username) $existing = true;
341         }
342         if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) {
343             if($zncserver['priority'] > $priority) {
344                 $priority = $zncserver['priority'];
345                 $addserv = array();
346             }
347             $addserv[] = $zncserver;
348         }
349     }
350     if(count($addserv) > 1) {
351         //select server with lowest user count
352         $usercount = count($addserv[0]['users']);
353         $selected = 0;
354         for($i = 1; $i < count($addserv); $i++) {
355             if(count($addserv[$i]['users']) < $usercount) {
356                 $usercount = count($addserv[$i]['users']);
357                 $selected = $i;
358             }
359         }
360         $addserv = $addserv[$selected];
361     } else if(count($addserv) == 0) {
362         error("Couldn't find a server the user could be added to.");
363         return;
364     } else {
365         $addserv = $addserv[0];
366     }
367     $password = generate_password();
368     $settings = array();
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']);
373     if($ret) {
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";
377         echo "[mIRC]\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";
381         }
382         echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
383         echo"/log\n";
384         foreach($add_settings["channel"] AS $channel) {
385             $addserv['conn']->addChan($argv[2], $channel);
386         }
387     } else
388         error("Error while adding user.");
389 }
390
391
392 function zncadmin_addOnce() {
393     global $argv, $zncservers, $add_settings, $force;
394     $username = strtolower($argv[2]);
395     if(!$username) {
396         error("missing username");
397         return;
398     }
399     $addserv = array();
400     $priority = 1;
401         $existing = false;
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");
407             return;
408         }
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) {
414                                 $existing = true;
415                                 break;
416                         }
417         }
418                 if($existing)
419                         break;
420         if(count($zncserver['users']) < $zncserver['maxznc']) {
421             if($zncserver['priority'] > $priority) {
422                 $priority = $zncserver['priority'];
423                 $addserv = array();
424             }
425             $addserv[] = $zncserver;
426         }
427     }
428         if($existing) {
429                 error("A User with username \002".$username."\002 already exists.");
430                 return;
431         }
432     if(count($addserv) > 1) {
433         //select server with lowest user count
434         $usercount = count($addserv[0]['users']);
435         $selected = 0;
436         for($i = 1; $i < count($addserv); $i++) {
437             if(count($addserv[$i]['users']) < $usercount) {
438                 $usercount = count($addserv[$i]['users']);
439                 $selected = $i;
440             }
441         }
442         $addserv = $addserv[$selected];
443     } else if(count($addserv) == 0) {
444         error("Couldn't find a server the user could be added to.");
445         return;
446     } else {
447         $addserv = $addserv[0];
448     }
449     $password = generate_password();
450     $settings = array();
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']);
455     if($ret) {
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";
459         echo "[mIRC]\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";
463         }
464         echo " /server -m ".$add_settings['mirccmds']['groupname']."\n";
465         echo"/log\n";
466         foreach($add_settings["channel"] AS $channel) {
467             $addserv['conn']->addChan($argv[2], $channel);
468         }
469     } else
470         error("Error while adding user.");
471 }
472
473 //SUBCOMMAND: resetpass
474 function zncadmin_resetpass() {
475     global $argv, $zncservers, $force;
476     $username = strtolower($argv[2]);
477     if(!$username) {
478         error("missing username");
479         return;
480     }
481     $delusers = array();
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);
490             }
491         }
492     }
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";
498         }
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");
503     } else {
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";
508         echo"/log\n";
509     }
510 }
511
512 //SUBCOMMAND: simul
513 function zncadmin_simul() {
514     global $argv, $zncservers, $force;
515     $username = strtolower($argv[2]);
516     $server = strtolower($argv[3]);
517     $raw = $argv[4];
518     if(!$username) {
519         error("missing username");
520         return;
521     }
522     if($server) {
523         $found = false;
524         foreach($zncservers as $zncserver) {
525             if(strtolower($server) == strtolower($zncserver['name'])) {
526                 $found = true;
527                 break;
528             }
529         }
530         if(!$found) {
531             $raw = $argv[3]." ".$raw;
532             $server = null;
533         }
534     }
535     if(!$raw) {
536         error("missing raw");
537         return;
538     }
539     $delusers = array();
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);
548             }
549         }
550     }
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";
556         }
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");
561     } else {
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']);
566         } else {
567             echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n";
568             echo"/log\n";
569         }
570     }
571 }
572
573 //SUBCOMMAND: whois
574 function zncadmin_whois() {
575     global $argv, $zncservers, $force;
576     $username = strtolower($argv[2]);
577     $server = strtolower($argv[3]);
578     if(!$username) {
579         error("missing username");
580         return;
581     }
582     if($server) {
583         $found = false;
584         foreach($zncservers as $zncserver) {
585             if(strtolower($server) == strtolower($zncserver['name'])) {
586                 $found = true;
587                 break;
588             }
589         }
590         if(!$found) {
591             $server = null;
592         }
593     }
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);
603             }
604         }
605     }
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";
611         }
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");
616     } else {
617         $founduser = $foundusers[0];
618         $info = $founduser['server']['conn']->getUserInfo($founduser['user']['user'], true);
619         if(!$info) {
620             error("failed getting infos for user ".$founduser['user']['user']." on ".$founduser['server']['name']);
621         } else {
622                         
623                         echo "User: ".$founduser['user']['user']." (".$founduser['server']['name'].") || Conected to IRC: ".$founduser['user']['server']." || Conected to ZNC: ".$founduser['user']['clients']."\n";
624                         
625                         $modulesstr = "User Modules: ";
626                         foreach($info['loadmod'] as $module) {
627                                 if(strlen($module) == 0) continue;
628                                 if($modulesstr == "")
629                                         $modulesstr = "  ";
630                                 $modulesstr .= $module." ";
631                                 if(strlen($modulesstr) >= 170) {
632                                         echo $modulesstr."\n";
633                                         $modulesstr = "";
634                                 }
635                         }
636                         if($modulesstr != "")
637                                 echo $modulesstr."\n";
638                         
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']);
643                                 echo "  Server:\n";
644                                 foreach(explode("\n", $servers) as $server) {
645                                         if(strlen($server) == 0) continue;
646                                         echo "    ".$server."\n";
647                                 }
648                                 $channelstr = "  Channel: ";
649                                 foreach($network['settings']['channel'] as $chan) {
650                                         if(strlen($chan) == 0) continue;
651                                         if($channelstr == "")
652                                                 $channelstr = "    ";
653                                         $channelstr .= $chan." ";
654                                         if(strlen($channelstr) >= 170) {
655                                                 echo $channelstr."\n";
656                                                 $channelstr = "";
657                                         }
658                                 }
659                                 if($channelstr != "")
660                                         echo $channelstr."\n";
661                                 
662                                 $modulesstr = "  Modules: ";
663                                 foreach($network['settings']['loadmod'] as $module) {
664                                         if(strlen($module) == 0) continue;
665                                         if($modulesstr == "")
666                                                 $modulesstr = "    ";
667                                         $modulesstr .= $module." ";
668                                         if(strlen($modulesstr) >= 170) {
669                                                 echo $modulesstr."\n";
670                                                 $modulesstr = "";
671                                         }
672                                 }
673                                 if($modulesstr != "")
674                                         echo $modulesstr."\n";
675                         }
676             
677         }
678     }
679 }
680
681 //SUBCOMMAND: block
682 function zncadmin_block() {
683     global $argv, $zncservers, $force;
684     $username = strtolower($argv[2]);
685     $server = strtolower($argv[3]);
686     if(!$username) {
687         error("missing username");
688         return;
689     }
690     $delusers = array();
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);
699             }
700         }
701     }
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";
707         }
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");
712     } else {
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']);
717         } else {
718             echo "Blocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
719             echo"/log\n";
720         }
721     }
722 }
723
724 //SUBCOMMAND: unblock
725 function zncadmin_unblock() {
726     global $argv, $zncservers, $force;
727     $username = strtolower($argv[2]);
728     $server = strtolower($argv[3]);
729     if(!$username) {
730         error("missing username");
731         return;
732     }
733     $delusers = array();
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);
742             }
743         }
744     }
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";
750         }
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");
755     } else {
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']);
760         } else {
761             echo "Unblocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n";
762             echo"/log\n";
763         }
764     }
765 }
766
767 //SUBCOMMAND: stats
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?");
772     $count = 0;
773     foreach($zncservers as $zncserver) {
774         $total = 0;
775         $connected = 0;
776         $online = 0;
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++;
782             $total++;
783         }
784         $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : ""));
785         $count++;
786     }
787     if($count) {
788         foreach($table->end() as $line) {
789             echo$line."\n";
790         }
791     } else {
792         echo "No Servers configured...\n";
793     }
794 }
795
796 ?>