get_parms( 'binpath', 'host', 'port', 'base', 'user', 'password', 'socket', 'use_sbas', 'nolog', 'clng', 'winsvc_run', 'charset' ); $dom = new DOMDocument(); $dom->formatOutput = true; if( $dom->loadXML($oldxml) ) { $xmlchanged = false; foreach(array("str:binpath", "str:host", "str:port", "str:base", "str:user", "str:password", "str:socket", "boo:use_sbas", "boo:nolog", "str:clng", "boo:winsvc_run", "str:charset") as $pname) { $ptype = substr($pname, 0, 3); $pname = substr($pname, 4); $pvalue = $parm2[$pname]; if( $ns = $dom->getElementsByTagName($pname)->item(0) ) { // le champ existait dans le xml, on supprime son ancienne valeur (tout le contenu) while( ($n = $ns->firstChild) ) $ns->removeChild($n); } else { // le champ n'existait pas dans le xml, on le cr�e $ns = $dom->documentElement->appendChild($dom->createElement($pname)); } // on fixe sa valeur switch($ptype) { case "str": $ns->appendChild($dom->createTextNode($pvalue)); break; case "boo": $ns->appendChild($dom->createTextNode($pvalue ? '1':'0')); break; } $xmlchanged = true; } } return($dom->saveXML()); } // ==================================================================== // xml2graphic : must fill the grapic form (using js) from xml // ==================================================================== public function xml2graphic($xml, $form) { if( ($sxml = simplexml_load_string($xml)) ) // in fact XML IS always valid here... { ?> system == 'WINDOWS') $appname .= '.exe'; ?> system == 'WINDOWS') $appname .= '.exe'; ?>

 :   / 
 : 
 : 
 : 
 : 
 : 

 : 

 
 : 

 
 : 



 :
 

cmd
taskid ; if($rs = $conn->query($sql)) { if($row = $conn->fetch_assoc($rs)) $sxsettings = simplexml_load_string($row['settings']); $conn->free_result($rs); } if(!$sxsettings) return; // $cmd = p4string::addEndSlash($sxsettings->binpath) . 'phraseanet_indexer'; $cmd = 'phraseanet_indexer'; if($this->system == 'WINDOWS') { $cmd .= '.exe'; $nulfile = 'nul'; } else { $nulfile = '/dev/null'; } if(!file_exists(p4string::addEndSlash($sxsettings->binpath) . $cmd)) { $this->log(sprintf(_('task::cindexer:file \'%s\' does not exists'), p4string::addEndSlash($sxsettings->binpath).$cmd)); return; } if((string)($sxsettings->host) != '') $cmd .= " -h=" . $sxsettings->host; if((string)($sxsettings->port) != '') $cmd .= " -P=" . $sxsettings->port; if((string)($sxsettings->base) != '') $cmd .= " -b=" . $sxsettings->base; if((string)($sxsettings->user) != '') $cmd .= " -u=" . $sxsettings->user; if((string)($sxsettings->password) != '') $cmd .= " -p=" . $sxsettings->password; if((string)($sxsettings->socket) != '') $cmd .= " --socket=" . $sxsettings->socket; if(p4field::isyes((string)($sxsettings->use_sbas))) $cmd .= " -o"; if((string)($sxsettings->charset) != '') $cmd .= " --default-character-set=" . $sxsettings->charset; if(p4field::isyes((string)($sxsettings->nolog))) $cmd .= " -n"; if(p4field::isyes((string)($sxsettings->winsvc_run))) $cmd .= " --run"; $logdir = p4string::addEndSlash(GV_RootPath.'logs'); $syslog = false; if(!is_dir($logdir)) { $logdir = null; } $descriptors = array(); if($logdir) { $descriptors[1] = array("file", $logdir . "/phraseanet_indexer_".$this->taskid.".log", "a+"); $descriptors[2] = array("file", $logdir . "/phraseanet_indexer_".$this->taskid.".error.log", "a+"); } else { $descriptors[1] = array("file", $nulfile, "a+"); $descriptors[2] = array("file", $nulfile, "a+"); } $pipes = array(); if($this->system == 'WINDOWS') $cmd = '' . p4string::addEndSlash($sxsettings->binpath) . $cmd; else $cmd = '' . p4string::addEndSlash($sxsettings->binpath) . $cmd; $this->log(sprintf('cmd=\'%s\'', $cmd)); $process = proc_open($cmd, $descriptors, $pipes, $sxsettings->binpath, null, array('bypass_shell'=>true) ); $pid = NULL; if(is_resource($process)) { $proc_status = proc_get_status($process); if($proc_status['running']) $pid = $proc_status['pid']; } $running = true; $qsent = ''; $timetokill = NULL; $sock = NULL; while($running) { $sql = "SELECT status FROM task2 WHERE status='tostop' AND task_id=" . $this->taskid ; if($rs = $conn->query($sql)) { if($row = $conn->fetch_assoc($rs)) { // must quit task, so send 'Q' to cindexer $socket = 0 + ((string)($sxsettings->socket)); if($socket > 0) { // must quit task, so send 'Q' to port 127.0.0.1:XXXX to cindexer if(!$qsent && (($sock = @socket_create(AF_INET, SOCK_STREAM, 0)) !== false)) { if(@socket_connect($sock, '127.0.0.1', $socket) === true) { socket_write($sock, 'Q', 1); socket_write($sock, "\r\n", strlen("\r\n")); sleep(5); $qsent = 'Q'; $timetokill = time()+10; } else { @socket_close($sock); $sock = NULL; } } } } $conn->free_result($rs); } $proc_status = proc_get_status($process); if(!$proc_status['running']) { // the cindexer died if($qsent == 'Q') $this->log(_('task::cindexer:the cindexer clean-quit')); elseif($qsent == 'K') $this->log(_('task::cindexer:the cindexer has been killed')); else $this->log(_('task::cindexer:the cindexer crashed')); $running = false; } else { if($qsent == 'Q') { if(time() > $timetokill) { // must kill cindexer $this->log(_('task::cindexer:killing the cindexer')); $qsent = 'K'; proc_terminate($process); // sigint } } } sleep(5); } if($sock) { @socket_close($sock); $sock = NULL; } @fclose($pipes[1]); @fclose($pipes[2]); proc_close($process); return('stopped'); } } ?>