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');
}
}
?>