added addOnce command
[ZNCAdmin.git] / zncadmin.php
index 320405fa50c060087bfc572e3d406048ec32e491..11bf566f1f7d2a7070173612883a4f51df5bc9ea 100644 (file)
@@ -41,12 +41,18 @@ 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;
@@ -159,10 +165,10 @@ function zncadmin_search() {
     }
     $mask = preg_prepare($mask);
     $table = new Table(5);
-    $table->add("Server", "User", "Clients", "Server");
+    $table->add("Server", "User", "Clients", "Server", "");
     $count = 0;
     foreach($zncservers as $zncserver) {
-        $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
+        $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;
@@ -209,7 +215,13 @@ function zncadmin_search() {
             }
             if($skip) continue;
             if(preg_match("#^".$mask."$#i", $user['user'])) {
-                $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server']);
+                $extra = "";
+                if(isset($user['nick'])) {
+                    if($extra != "")
+                        $extra .= ", ";
+                    $extra .= "Nick: ".$user['nick'];
+                }
+                $table->add($zncserver['name'], $user['user'], $user['clients'], $user['server'], $extra);
                 $count++;
             }
         }
@@ -224,7 +236,7 @@ function zncadmin_search() {
     }
 }
 
-//SUBCOMMAND: search
+//SUBCOMMAND: seen
 function zncadmin_seen() {
     global $argv, $zncservers;
        $time = $argv[2];
@@ -247,7 +259,7 @@ function zncadmin_seen() {
     $table->add("Server", "User", "Seen", "Info");
     $found = false;
     foreach($zncservers as $zncserver) {
-        $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
+        $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))) {
@@ -277,7 +289,7 @@ function zncadmin_del() {
     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']);
+        $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) {
@@ -320,7 +332,7 @@ function zncadmin_add() {
             error("Access denied\n");
             return;
         }
-        $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
+        $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;
@@ -357,13 +369,95 @@ function zncadmin_add() {
     $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['other']);
+    $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 KryptonZNC\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";
         }
@@ -388,7 +482,7 @@ function zncadmin_resetpass() {
     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']);
+        $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) {
@@ -446,7 +540,7 @@ function zncadmin_simul() {
     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']);
+        $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) {
@@ -476,6 +570,114 @@ function zncadmin_simul() {
     }
 }
 
+//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;
@@ -489,7 +691,7 @@ function zncadmin_block() {
     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']);
+        $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) {
@@ -532,7 +734,7 @@ function zncadmin_unblock() {
     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']);
+        $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) {
@@ -572,7 +774,7 @@ function zncadmin_stats() {
         $total = 0;
         $connected = 0;
         $online = 0;
-        $zncserver['conn'] = new ZNCServer($zncserver['host'], $zncserver['port']);
+        $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++;