From 5cb4a51d7eee716c108e7071e0de392b4c512a57 Mon Sep 17 00:00:00 2001 From: pk910 Date: Thu, 28 Jul 2011 02:38:41 +0200 Subject: [PATCH] added PHPGod.class.php (PHP Module) --- Bots/PHPGod.class.php | 178 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 Bots/PHPGod.class.php diff --git a/Bots/PHPGod.class.php b/Bots/PHPGod.class.php new file mode 100644 index 0000000..5fc4b87 --- /dev/null +++ b/Bots/PHPGod.class.php @@ -0,0 +1,178 @@ +uplink = $uplink; + if(!$old) { + $nick = "PHP"; + $ident = "php"; + $host = "Services.WebGamesNet.net"; + $ip = "0::0"; + $realname = "PHP PHP PHP PHP PHP"; + $modes = "ioknISD"; + $this->php = $this->uplink->addUser($nick,$ident,$host,$ip,$modes,$realname); + if(is_a($this->php, "P10_User")) { + $this->uplink->join($this->php, "#php", (P10_Channel::USERPRIV_OPED | P10_Channel::USERPRIV_VOICE)); + $this->uplink->join($this->php, "#dev", P10_Channel::USERPRIV_VOICE); + } + } else { + $this->php = $old; + } + + ModCMD::bind($this, BIND_CHANMSG, "recive_privmsg"); + ModCMD::bind($this, BIND_QUIT, "recive_quit"); + } + + public function unload($rehash = false) { + foreach($this->phpcache as $id => &$php) { + fclose($php['pipes'][1]); + fclose($php['pipes'][2]); + proc_terminate($php['proc'],9); + } + $this->phpcache = array(); + if($rehash) { + return $this->php; + } else { + $this->uplink->delUser($this->php, "Bye."); + } + } + + public function loop() { + foreach($this->phpcache as $id => &$php) { + if(!$this->checkstate(&$php)) { + unset($this->phpcache[$id]); + } + } + } + + function recive_privmsg($user, $channel, $message) { + $opOnPHPChannel = false; + $PHPChannel = P10_Channel::getChannelByName("#PHP"); + if($PHPChannel) { + $privs = $PHPChannel->getUserPrivs($user); + $opOnPHPChannel = ($privs & P10_Channel::USERPRIV_OPED); + } + if(!$user->getModes()->hasMode('o') && !$opOnPHPChannel) return 0; + $exp=explode(" ",$message); + switch (strtolower($exp[0])) { + case "~php": + if(count($this->phpcache) > 5) { + $this->uplink->notice($this->php, $user, "too many running php processes at the moment!"); + return; + } + $entry=array(); + $entry['channel'] = $channel; + $descriptor = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w")); + $entry['proc'] = proc_open('php', $descriptor, $entry['pipes']); + if(!is_resource($entry['proc'])) { + $this->uplink->notice($this->php, $user, "error while loading php!"); + return; + } + $entry['time'] = time(); + fwrite($entry['pipes'][0], "<"."?php ".$exp[1]." ?".">"); + fclose($entry['pipes'][0]); + $this->phpcache[] = $entry; + break; + } + } + + function recive_quit($user, $reason) { + if($user === $this->modman) { + $this->load($this->uplink); + } + } + + function checkstate($php) { + $data = proc_get_status($php['proc']); + if(!$data['running']) { + $out=""; + while(!feof($php['pipes'][1])) { + $out .= fgets($php['pipes'][1], 128); + } + $eout=""; + while(!feof($php['pipes'][2])) { + $eout .= fgets($php['pipes'][2], 128); + } + if($out != "") { + $out=str_replace("\r","",$out); + $lines=explode("\n",$out); + $i=0; + foreach($lines as $line) { + $i++; + if($i>1000) { + $this->uplink->privmsg($this->php, $php['channel'], "too many lines!"); + break; + } + $this->uplink->privmsg($this->php, $php['channel'], $line); + } + } + if($eout != "") { + $eout=str_replace("\r","",$eout); + $lines=explode("\n",$eout); + $i=0; + foreach($lines as $line) { + $i++; + if($i>1000) { + $this->uplink->privmsg($this->php, $php['channel'], "too many lines!"); + break; + } + $this->uplink->privmsg($this->php, $php['channel'], "4".$line.""); + } + } + fclose($php['pipes'][1]); + fclose($php['pipes'][2]); + proc_close($php['proc']); + return false; + } else { + if($php['time']+10 > time()) { + return true; + } else { + //TIMEOUT + if($php['term']) { + fclose($php['pipes'][1]); + fclose($php['pipes'][2]); + proc_terminate($php['proc'],9); + $this->uplink->privmsg($this->php, $php['channel'], "php hard timeout. sending SIGKILL"); + return false; + } else { + proc_terminate($php['proc']); + $php['term']=true; + $this->uplink->privmsg($this->php, $php['channel'], "php timeout. (maximum of 10 seconds exceeded) sending SIGTERM"); + return true; + } + } + } + } + +} + +?> \ No newline at end of file -- 2.20.1