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])) {
60 error("invalid subcommand '".$argv[1]."'");
64 function preg_prepare($string,$wildcards = true,$pregstart = "#") {
65 $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart);
66 if(!$wildcards) array_push($in,"*");
68 foreach($in as $item) {
73 array_push($out,"(.*)");
75 $string = str_replace($in,$out,$string);
79 function generate_password() {
80 $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
81 $password_length = 10;
84 for($i = 0; $i < $password_length; $i++) {
85 $password .= $password_chars[rand(0, strlen($password_chars))-1];
90 function str2time($duration) {
94 for($i=0;$i<strlen($duration);$i++) {
95 if(is_numeric($duration[$i])) {
97 } else if($duration[$i] != " ") {
98 switch ($duration[$i]) {
127 $dur=$dur+($str*$mult);
135 /***********************************************************
136 * ZNCAdmin SUBCOMMANDS *
137 ***********************************************************/
140 function zncadmin_search() {
141 global $argv, $zncservers;
144 error("missing mask parameter");
147 $extraflags = array();
149 $extraflags = explode(" ", $argv[3]);
151 $mask = preg_prepare($mask);
152 $table = new Table(5);
153 $table->add("Server", "User", "Clients", "Server", "Nick");
155 foreach($zncservers as $zncserver) {
156 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
157 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
158 foreach($zncserver['conn']->getUserList() as $user) {
160 foreach($extraflags as $flag) {
161 //some additional flags ;)
162 if($flag[0] == '-') {
163 $flag = substr($flag, 1);
165 } else if($flag[0] == '+') {
166 $flag = substr($flag, 1);
170 $flag = explode("=", $flag, 2);
172 switch (strtolower($flag[0])) {
174 $skip = (($user['clients'] > 0) != $positive);
177 $skip = (($user['server'] == "-N/A-") == $positive);
180 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive);
183 $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive);
186 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive);
189 $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive);
192 $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive);
202 if(preg_match("#^".$mask."$#i", $user['user'])) {
203 $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $user['nick']);
209 foreach($table->end() as $line) {
212 echo"Found \002".$count."\002 users.\n";
214 echo "no user matching \002".$argv[2]."\002 found.\n";
219 function zncadmin_seen() {
220 global $argv, $zncservers;
223 if($time[0] == '>' || $time[0] == '<') {
224 if($time[0] == '<') $over_time = false;
225 $time = substr($time, 1);
227 $time = time() - str2time($time);
230 error("missing time parameter");
234 $mask = preg_prepare($mask);
237 $table = new Table(4);
238 $table->add("Server", "User", "Seen", "Info");
240 foreach($zncservers as $zncserver) {
241 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
242 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
243 foreach($zncserver['conn']->getSeenList() as $user) {
244 if(preg_match("#^".$mask."$#i", $user['user']) && (($over_time && $user['seen_unix'] < $time) || (!$over_time && $user['seen_unix'] > $time))) {
245 $table->add($zncserver['name'], $user['user'], $user['seen'], $user['info']);
251 foreach($table->end() as $line) {
255 echo "no user matching \002".$argv[2]."\002 found.\n";
260 function zncadmin_del() {
261 global $argv, $zncservers, $force;
262 $username = strtolower($argv[2]);
264 error("missing username");
268 foreach($zncservers as $zncserver) {
269 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
270 if($username == strtolower($zncserver['auser'])) continue;
271 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
272 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
273 foreach($zncserver['conn']->getUserList() as $user) {
274 if(strtolower($user['user']) == $username) {
275 $delusers[] = array("server" => $zncserver, "user" => $user);
279 if(count($delusers) > 1) {
280 error($argv[2]." exists on multiple servers! please add the server name, the user should be removed from.");
281 echo"Found User on following Servers:\n";
282 foreach($delusers as $server) {
283 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
285 } else if(count($delusers) == 0) {
286 error("Couldn't find an user called \002".$argv[2]."\002.");
287 } else if($delusers[0]['server']['protected'] && !$force) {
288 error("Access denied\n");
290 $deluser = $delusers[0];
291 $deluser['server']['conn']->delZNC($deluser['user']['user']);
292 echo "Deleted \002".$deluser['user']['user']."\002 from Server \002".$deluser['server']['name']."\002\n";
298 function zncadmin_add() {
299 global $argv, $zncservers, $add_settings, $force;
300 $username = strtolower($argv[2]);
302 error("missing username");
307 foreach($zncservers as $zncserver) {
308 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
309 if(!$argv[3] && $zncserver['priority'] < $priority) continue;
310 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
311 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
312 $zncserver['users'] = $zncserver['conn']->getUserList();
314 foreach($zncserver['users'] as $user) {
315 if(strtolower($user['user']) == $username) $existing = true;
317 if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) {
318 if($zncserver['priority'] > $priority) {
319 $priority = $zncserver['priority'];
322 $addserv[] = $zncserver;
325 if(count($addserv) > 1) {
326 //select server with lowest user count
327 $usercount = count($addserv[0]['users']);
329 for($i = 1; $i < count($addserv); $i++) {
330 if(count($addserv[$i]['users']) < $usercount) {
331 $usercount = count($addserv[$i]['users']);
335 $addserv = $addserv[$selected];
336 } else if(count($addserv) == 0) {
337 error("Couldn't find a server the user could be added to.");
340 $addserv = $addserv[0];
342 $password = generate_password();
344 $settings['nick'] = $argv[2];
345 $settings['altnick'] = $argv[2]."`";
346 $settings['ident'] = $username;
347 $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['other']);
349 echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n";
350 echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n";
351 echo " Password: ".$password."\n";
353 echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g KryptonZNC -w ".$argv[2].":".$password." -d KryptonZNC\n";
354 echo " /AS addmask *@*.free-bnc.de\n";
355 echo " /AS addmask *@*.krypton-bouncer.de\n";
356 echo " /server -m KryptonZNC\n";
358 $addserv['conn']->addChan($argv[2], "#Krypton");
360 error("Error while adding user.");
363 //SUBCOMMAND: resetpass
364 function zncadmin_resetpass() {
365 global $argv, $zncservers, $force;
366 $username = strtolower($argv[2]);
368 error("missing username");
372 foreach($zncservers as $zncserver) {
373 if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue;
374 if($username == strtolower($zncserver['auser'])) continue;
375 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
376 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
377 foreach($zncserver['conn']->getUserList() as $user) {
378 if(strtolower($user['user']) == $username) {
379 $delusers[] = array("server" => $zncserver, "user" => $user);
383 if(count($delusers) > 1) {
384 error($argv[2]." exists on multiple servers! please add the server name the user, the password should be resetted, is on.");
385 echo"Found User on following Servers:\n";
386 foreach($delusers as $server) {
387 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
389 } else if(count($delusers) == 0) {
390 error("Couldn't find an user called \002".$argv[2]."\002.");
391 } else if($delusers[0]['server']['protected'] && !$force) {
392 error("Access denied\n");
394 $deluser = $delusers[0];
395 $password = generate_password();
396 $deluser['server']['conn']->editZNC($deluser['user']['user'], $password);
397 echo "Changed password of \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name']." to \002".$password."\002\n";
403 function zncadmin_simul() {
404 global $argv, $zncservers, $force;
405 $username = strtolower($argv[2]);
406 $server = strtolower($argv[3]);
409 error("missing username");
414 foreach($zncservers as $zncserver) {
415 if(strtolower($server) == strtolower($zncserver['name'])) {
421 $raw = $argv[3]." ".$raw;
426 error("missing raw");
430 foreach($zncservers as $zncserver) {
431 if($server && (strtolower($server) != strtolower($zncserver['name']))) continue;
432 if($username == strtolower($zncserver['auser'])) continue;
433 $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
434 $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']);
435 foreach($zncserver['conn']->getUserList() as $user) {
436 if(strtolower($user['user']) == $username) {
437 $delusers[] = array("server" => $zncserver, "user" => $user);
441 if(count($delusers) > 1) {
442 error($argv[2]." exists on multiple servers! please add the server name the user should be simuled on.");
443 echo"Found User on following Servers:\n";
444 foreach($delusers as $server) {
445 echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n";
447 } else if(count($delusers) == 0) {
448 error("Couldn't find an user called \002".$argv[2]."\002.");
449 } else if($delusers[0]['server']['protected'] && !$force) {
450 error("Access denied\n");
452 $deluser = $delusers[0];
453 $deluser['server']['conn']->simulZNC($deluser['user']['user'], $raw);
454 echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n";