. */ error_reporting(E_ALL & ~E_NOTICE); require_once("zncadmin/HTTPConnector.class.php"); require_once("zncadmin/ZNCServer.class.php"); require_once("zncadmin/Table.class.php"); require_once("config.inc.php"); /* $argv[1] subcommand */ function error($msg) { echo"\00304ZNCAdmin error:\003 ".$msg."\n"; } if(strtolower($argv[1]) == "force") { $argv = array_slice($argv, 1); $force = true; } else $force = false; switch(strtolower($argv[1])) { case "add": zncadmin_add(); break; case "addonce": zncadmin_addOnce(); break; case "del": zncadmin_del(); break; case "search": zncadmin_search(); break; case "whois": zncadmin_whois(); break; case "seen": zncadmin_seen(); break; case "resetpass": zncadmin_resetpass(); break; case "simul": zncadmin_simul(); break; case "block": zncadmin_block(); break; case "unblock": zncadmin_unblock(); break; case "stats": zncadmin_stats(); break; default: error("invalid subcommand '".$argv[1]."'"); break; } function preg_prepare($string,$wildcards = true,$pregstart = "#") { $in = array("\\","^",".","$","|","(",")","[","]","+","?","{","}",",",$pregstart); if(!$wildcards) array_push($in,"*"); $out = array(); foreach($in as $item) { $out[] = "\\".$item; } if($wildcards) { array_push($in,"*"); array_push($out,"(.*)"); } $string = str_replace($in,$out,$string); return $string; } function generate_password() { $password_chars = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $password_length = 10; $password = 0; srand(); for($i = 0; $i < $password_length; $i++) { $password .= $password_chars[rand(0, strlen($password_chars))-1]; } return $password; } function str2time($duration) { $str="0"; $dur=0; $mult=1; for($i=0;$iadd("Server", "User", "Clients", "Server", ""); $count = 0; foreach($zncservers as $zncserver) { $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { $skip = false; foreach($extraflags as $flag) { //some additional flags ;) if($flag[0] == '-') { $flag = substr($flag, 1); $positive = false; } else if($flag[0] == '+') { $flag = substr($flag, 1); $positive = true; } else $positive = true; $flag = explode("=", $flag, 2); $flagval = $flag[1]; switch (strtolower($flag[0])) { case "online": $skip = (($user['clients'] > 0) != $positive); break; case "connected": $skip = (($user['server'] == "-N/A-") == $positive); break; case "server": $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['server']) != $positive); break; case "server_regex": $skip = (preg_match("#^".$flagval."$#i", $user['server']) != $positive); break; case "nick": $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $user['nick']) != $positive); break; case "nick_regex": $skip = (preg_match("#^".$flagval."$#i", $user['nick']) != $positive); break; case "znc": $skip = (preg_match("#^".preg_prepare($flagval)."$#i", $zncserver['name']) != $positive); break; default: break; } if($skip) break; } if($skip) continue; if(preg_match("#^".$mask."$#i", $user['user'])) { $extra = ""; if(isset($user['nick'])) { if($extra != "") $extra .= ", "; $extra .= "Nick: ".$user['nick']; } $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra); $count++; } } } if($count) { foreach($table->end() as $line) { echo$line."\n"; } echo"Found \002".$count."\002 users.\n"; } else { echo "no user matching \002".$argv[2]."\002 found.\n"; } } //SUBCOMMAND: seen function zncadmin_seen() { global $argv, $zncservers; $time = $argv[2]; $over_time = true; if($time[0] == '>' || $time[0] == '<') { if($time[0] == '<') $over_time = false; $time = substr($time, 1); } $time = time() - str2time($time); $mask = $argv[3]; if(!$time) { error("missing time parameter"); return; } if($mask) $mask = preg_prepare($mask); else $mask = "(.*)"; $table = new Table(4); $table->add("Server", "User", "Seen", "Info"); $found = false; foreach($zncservers as $zncserver) { $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getSeenList() as $user) { if(preg_match("#^".$mask."$#i", $user['user']) && (($over_time && $user['seen_unix'] < $time) || (!$over_time && $user['seen_unix'] > $time))) { $table->add($zncserver['name'], $user['user'], $user['seen'], $user['info']); $found = true; } } } if($found) { foreach($table->end() as $line) { echo$line."\n"; } } else { echo "no user matching \002".$argv[2]."\002 found.\n"; } } //SUBCOMMAND: del function zncadmin_del() { global $argv, $zncservers, $force; $username = strtolower($argv[2]); if(!$username) { error("missing username"); return; } $delusers = array(); foreach($zncservers as $zncserver) { if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue; if($username == strtolower($zncserver['auser'])) continue; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if(strtolower($user['user']) == $username) { $delusers[] = array("server" => $zncserver, "user" => $user); } } } if(count($delusers) > 1) { error($argv[2]." exists on multiple servers! please add the server name, the user should be removed from."); echo"Found User on following Servers:\n"; foreach($delusers as $server) { echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n"; } } else if(count($delusers) == 0) { error("Couldn't find an user called \002".$argv[2]."\002."); } else if($delusers[0]['server']['protected'] && !$force) { error("Access denied\n"); } else { $deluser = $delusers[0]; $deluser['server']['conn']->delZNC($deluser['user']['user']); echo "Deleted \002".$deluser['user']['user']."\002 from Server \002".$deluser['server']['name']."\002\n"; echo"/log\n"; } } //SUBCOMMAND: add function zncadmin_add() { global $argv, $zncservers, $add_settings, $force; $username = strtolower($argv[2]); if(!$username) { error("missing username"); return; } $addserv = array(); $priority = 1; foreach($zncservers as $zncserver) { if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue; if(!$argv[3] && $zncserver['priority'] < $priority) continue; if($zncserver['protected'] === true && !$force) { error("Access denied\n"); return; } $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); $zncserver['users'] = $zncserver['conn']->getUserList(); $existing = false; foreach($zncserver['users'] as $user) { if(strtolower($user['user']) == $username) $existing = true; } if(!$existing && count($zncserver['users']) < $zncserver['maxznc']) { if($zncserver['priority'] > $priority) { $priority = $zncserver['priority']; $addserv = array(); } $addserv[] = $zncserver; } } if(count($addserv) > 1) { //select server with lowest user count $usercount = count($addserv[0]['users']); $selected = 0; for($i = 1; $i < count($addserv); $i++) { if(count($addserv[$i]['users']) < $usercount) { $usercount = count($addserv[$i]['users']); $selected = $i; } } $addserv = $addserv[$selected]; } else if(count($addserv) == 0) { error("Couldn't find a server the user could be added to."); return; } else { $addserv = $addserv[0]; } $password = generate_password(); $settings = array(); $settings['nick'] = $argv[2]; $settings['altnick'] = $argv[2]."`"; $settings['ident'] = $username; $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['netmodules'], $add_settings['other']); if($ret) { echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n"; echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n"; echo " Password: ".$password."\n"; echo "[mIRC]\n"; echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n"; foreach($add_settings['mirccmds']['hosts'] AS $host) { echo " /AS addmask *@*.".$host."\n"; } echo " /server -m ".$add_settings['mirccmds']['groupname']."\n"; echo"/log\n"; foreach($add_settings["channel"] AS $channel) { $addserv['conn']->addChan($argv[2], $channel); } } else error("Error while adding user."); } function zncadmin_addOnce() { global $argv, $zncservers, $add_settings, $force; $username = strtolower($argv[2]); if(!$username) { error("missing username"); return; } $addserv = array(); $priority = 1; $existing = false; foreach($zncservers as $zncserver) { if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue; if(!$argv[3] && $zncserver['priority'] < $priority) continue; if($zncserver['protected'] === true && !$force) { error("Access denied\n"); return; } $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); $zncserver['users'] = $zncserver['conn']->getUserList(); foreach($zncserver['users'] as $user) { if(strtolower($user['user']) == $username) { $existing = true; break; } } if($existing) break; if(count($zncserver['users']) < $zncserver['maxznc']) { if($zncserver['priority'] > $priority) { $priority = $zncserver['priority']; $addserv = array(); } $addserv[] = $zncserver; } } if($existing) { error("A User with username \002".$username."\002 already exists."); return; } if(count($addserv) > 1) { //select server with lowest user count $usercount = count($addserv[0]['users']); $selected = 0; for($i = 1; $i < count($addserv); $i++) { if(count($addserv[$i]['users']) < $usercount) { $usercount = count($addserv[$i]['users']); $selected = $i; } } $addserv = $addserv[$selected]; } else if(count($addserv) == 0) { error("Couldn't find a server the user could be added to."); return; } else { $addserv = $addserv[0]; } $password = generate_password(); $settings = array(); $settings['nick'] = $argv[2]; $settings['altnick'] = $argv[2]."`"; $settings['ident'] = $username; $ret = $addserv['conn']->addZNC($argv[2], $password, $settings, $add_settings['servers'], $add_settings['modules'], $add_settings['netmodules'], $add_settings['other']); if($ret) { echo "Added user ".$argv[2]." to Server ".$addserv['name'].".\n"; echo " Server Host: ".$addserv['public']." Port: ".$addserv['port']." SSL Port: ".$addserv['sslport']."\n"; echo " Password: ".$password."\n"; echo "[mIRC]\n"; echo " /server -a ".$addserv['public']." -p ".$addserv['port']." -g ".$add_settings['mirccmds']['groupname']." -w ".$argv[2].":".$password." -d ".$add_settings['mirccmds']['groupname']."\n"; foreach($add_settings['mirccmds']['hosts'] AS $host) { echo " /AS addmask *@*.".$host."\n"; } echo " /server -m ".$add_settings['mirccmds']['groupname']."\n"; echo"/log\n"; foreach($add_settings["channel"] AS $channel) { $addserv['conn']->addChan($argv[2], $channel); } } else error("Error while adding user."); } //SUBCOMMAND: resetpass function zncadmin_resetpass() { global $argv, $zncservers, $force; $username = strtolower($argv[2]); if(!$username) { error("missing username"); return; } $delusers = array(); foreach($zncservers as $zncserver) { if($argv[3] && (strtolower($argv[3]) != strtolower($zncserver['name']))) continue; if($username == strtolower($zncserver['auser'])) continue; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if(strtolower($user['user']) == $username) { $delusers[] = array("server" => $zncserver, "user" => $user); } } } if(count($delusers) > 1) { error($argv[2]." exists on multiple servers! please add the server name the user, the password should be resetted, is on."); echo"Found User on following Servers:\n"; foreach($delusers as $server) { echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n"; } } else if(count($delusers) == 0) { error("Couldn't find an user called \002".$argv[2]."\002."); } else if($delusers[0]['server']['protected'] && !$force) { error("Access denied\n"); } else { $deluser = $delusers[0]; $password = generate_password(); $deluser['server']['conn']->editZNC($deluser['user']['user'], $password); echo "Changed password of \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name']." to \002".$password."\002\n"; echo"/log\n"; } } //SUBCOMMAND: simul function zncadmin_simul() { global $argv, $zncservers, $force; $username = strtolower($argv[2]); $server = strtolower($argv[3]); $raw = $argv[4]; if(!$username) { error("missing username"); return; } if($server) { $found = false; foreach($zncservers as $zncserver) { if(strtolower($server) == strtolower($zncserver['name'])) { $found = true; break; } } if(!$found) { $raw = $argv[3]." ".$raw; $server = null; } } if(!$raw) { error("missing raw"); return; } $delusers = array(); foreach($zncservers as $zncserver) { if($server && (strtolower($server) != strtolower($zncserver['name']))) continue; if($username == strtolower($zncserver['auser'])) continue; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if(strtolower($user['user']) == $username) { $delusers[] = array("server" => $zncserver, "user" => $user); } } } if(count($delusers) > 1) { error($argv[2]." exists on multiple servers! please add the server name the user should be simuled on."); echo"Found User on following Servers:\n"; foreach($delusers as $server) { echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n"; } } else if(count($delusers) == 0) { error("Couldn't find an user called \002".$argv[2]."\002."); } else if($delusers[0]['server']['protected'] && !$force) { error("Access denied\n"); } else { $deluser = $delusers[0]; $ret = $deluser['server']['conn']->simulZNC($deluser['user']['user'], $raw); if($ret == ERR_MODULE_NOT_FOUND) { error("send_raw module is not installed or not activated for user ".$deluser['server']['auser']." on ".$deluser['server']['name']); } else { echo "Simuled \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].": ".$raw."\n"; echo"/log\n"; } } } //SUBCOMMAND: whois function zncadmin_whois() { global $argv, $zncservers, $force; $username = strtolower($argv[2]); $server = strtolower($argv[3]); if(!$username) { error("missing username"); return; } if($server) { $found = false; foreach($zncservers as $zncserver) { if(strtolower($server) == strtolower($zncserver['name'])) { $found = true; break; } } if(!$found) { $server = null; } } $foundusers = array(); foreach($zncservers as $zncserver) { if($server && (strtolower($server) != strtolower($zncserver['name']))) continue; if($username == strtolower($zncserver['auser'])) continue; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if(strtolower($user['user']) == $username) { $foundusers[] = array("server" => $zncserver, "user" => $user); } } } if(count($foundusers) > 1) { error($argv[2]." exists on multiple servers! please add the server name the user is on."); echo"Found User on following Servers:\n"; foreach($foundusers as $server) { echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n"; } } else if(count($foundusers) == 0) { error("Couldn't find an user called \002".$argv[2]."\002."); } else if($foundusers[0]['server']['protected'] && !$force) { error("Access denied\n"); } else { $founduser = $foundusers[0]; $info = $founduser['server']['conn']->getUserInfo($founduser['user']['user'], true); if(!$info) { error("failed getting infos for user ".$founduser['user']['user']." on ".$founduser['server']['name']); } else { echo "User: ".$founduser['user']['user']." (".$founduser['server']['name'].") || Conected to IRC: ".$founduser['user']['server']." || Conected to ZNC: ".$founduser['user']['clients']."\n"; $modulesstr = "User Modules: "; foreach($info['loadmod'] as $module) { if(strlen($module) == 0) continue; if($modulesstr == "") $modulesstr = " "; $modulesstr .= $module." "; if(strlen($modulesstr) >= 170) { echo $modulesstr."\n"; $modulesstr = ""; } } if($modulesstr != "") echo $modulesstr."\n"; foreach($info['networks'] as $network) { echo "Network \002".$network['name']."\002\n"; echo " Nickname: ".$network['nick']."\n"; $servers = str_replace(array("\r"), array(""), $network['settings']['servers']); echo " Server:\n"; foreach(explode("\n", $servers) as $server) { if(strlen($server) == 0) continue; echo " ".$server."\n"; } $channelstr = " Channel: "; foreach($network['settings']['channel'] as $chan) { if(strlen($chan) == 0) continue; if($channelstr == "") $channelstr = " "; $channelstr .= $chan." "; if(strlen($channelstr) >= 170) { echo $channelstr."\n"; $channelstr = ""; } } if($channelstr != "") echo $channelstr."\n"; $modulesstr = " Modules: "; foreach($network['settings']['loadmod'] as $module) { if(strlen($module) == 0) continue; if($modulesstr == "") $modulesstr = " "; $modulesstr .= $module." "; if(strlen($modulesstr) >= 170) { echo $modulesstr."\n"; $modulesstr = ""; } } if($modulesstr != "") echo $modulesstr."\n"; } } } } //SUBCOMMAND: block function zncadmin_block() { global $argv, $zncservers, $force; $username = strtolower($argv[2]); $server = strtolower($argv[3]); if(!$username) { error("missing username"); return; } $delusers = array(); foreach($zncservers as $zncserver) { if($server && (strtolower($server) != strtolower($zncserver['name']))) continue; if($username == strtolower($zncserver['auser'])) continue; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if(strtolower($user['user']) == $username) { $delusers[] = array("server" => $zncserver, "user" => $user); } } } if(count($delusers) > 1) { error($argv[2]." exists on multiple servers! please add the server name the user should be blocked on."); echo"Found User on following Servers:\n"; foreach($delusers as $server) { echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n"; } } else if(count($delusers) == 0) { error("Couldn't find an user called \002".$argv[2]."\002."); } else if($delusers[0]['server']['protected'] && !$force) { error("Access denied\n"); } else { $deluser = $delusers[0]; $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], true); if($ret == ERR_MODULE_NOT_FOUND) { error("blockuser module is not installed or not activated on ".$deluser['server']['name']); } else { echo "Blocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n"; echo"/log\n"; } } } //SUBCOMMAND: unblock function zncadmin_unblock() { global $argv, $zncservers, $force; $username = strtolower($argv[2]); $server = strtolower($argv[3]); if(!$username) { error("missing username"); return; } $delusers = array(); foreach($zncservers as $zncserver) { if($server && (strtolower($server) != strtolower($zncserver['name']))) continue; if($username == strtolower($zncserver['auser'])) continue; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if(strtolower($user['user']) == $username) { $delusers[] = array("server" => $zncserver, "user" => $user); } } } if(count($delusers) > 1) { error($argv[2]." exists on multiple servers! please add the server name the user should be unblocked on."); echo"Found User on following Servers:\n"; foreach($delusers as $server) { echo "\002".$server['server']['name']."\002 Server: ".$server['user']['server']." Nick: ".$server['user']['nick']." Clients: ".$server['user']['clients']."\n"; } } else if(count($delusers) == 0) { error("Couldn't find an user called \002".$argv[2]."\002."); } else if($delusers[0]['server']['protected'] && !$force) { error("Access denied\n"); } else { $deluser = $delusers[0]; $ret = $deluser['server']['conn']->blockZNC($deluser['user']['user'], false); if($ret == ERR_MODULE_NOT_FOUND) { error("blockuser module is not installed or not activated on ".$deluser['server']['name']); } else { echo "Unblocked \002".$deluser['user']['user']."\002 on Server ".$deluser['server']['name'].".\n"; echo"/log\n"; } } } //SUBCOMMAND: stats function zncadmin_stats() { global $argv, $zncservers; $table = new Table(6); $table->add("Server", "Port / SSL Port", "Total ZNC's", "Connected (IRC)", "Online (User)", "Protected?"); $count = 0; foreach($zncservers as $zncserver) { $total = 0; $connected = 0; $online = 0; $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port'], (isset($zncserver['version']) ? $zncserver['version'] : NULL)); $zncserver['conn']->login($zncserver['auser'], $zncserver['apass']); foreach($zncserver['conn']->getUserList() as $user) { if($user['server'] != "-N/A-") $connected++; if($user['clients'] > 0) $online++; $total++; } $table->add($zncserver['name'], $zncserver['port'].($zncserver['sslport'] ? "/".$zncserver['sslport'] : ""), $total.($zncserver['maxznc'] ? "/".$zncserver['maxznc'] : ""), $connected, $online, ($zncserver['protected'] === true ? "X" : "")); $count++; } if($count) { foreach($table->end() as $line) { echo$line."\n"; } } else { echo "No Servers configured...\n"; } } ?>