mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-13 21:13:26 +00:00
-
This commit is contained in:
@@ -29,6 +29,20 @@ class module_console_schedulerStart extends Command
|
||||
parent::__construct($name);
|
||||
|
||||
$this->setDescription('Start the scheduler');
|
||||
$this->addOption(
|
||||
'nolog'
|
||||
, NULL
|
||||
, 1 | InputOption::VALUE_NONE
|
||||
, 'do not log (scheduler) to logfile'
|
||||
, NULL
|
||||
);
|
||||
$this->addOption(
|
||||
'notasklog'
|
||||
, NULL
|
||||
, 1 | InputOption::VALUE_NONE
|
||||
, 'do not log (tasks) to logfiles'
|
||||
, NULL
|
||||
);
|
||||
$this->setHelp(
|
||||
"You should use launch the command and finish it with `&`"
|
||||
. " to return to the console\n\n"
|
||||
@@ -38,7 +52,7 @@ class module_console_schedulerStart extends Command
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
public function execute(InputInterface $zinput, OutputInterface $output)
|
||||
{
|
||||
if(!setup::is_installed())
|
||||
{
|
||||
@@ -48,7 +62,7 @@ class module_console_schedulerStart extends Command
|
||||
require_once dirname(__FILE__) . '/../../../../lib/bootstrap.php';
|
||||
|
||||
$scheduler = new task_Scheduler();
|
||||
$scheduler->run($output, true);
|
||||
$scheduler->run($zinput, $output); //, !$input->getOption('nolog'), !$input->getOption('notasklog'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
@@ -43,11 +43,28 @@ class module_console_taskrun extends Command
|
||||
, 'The name of the runner (manual, scheduler...)'
|
||||
, task_abstract::RUNNER_MANUAL
|
||||
);
|
||||
$this->addOption(
|
||||
'nolog'
|
||||
, NULL
|
||||
, 1 | InputOption::VALUE_NONE
|
||||
, 'do not log to logfile'
|
||||
, NULL
|
||||
);
|
||||
$this->setDescription('Run task');
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
function sig_handler($signo)
|
||||
{
|
||||
if($this->task)
|
||||
{
|
||||
$this->task->log(sprintf("signal %s received", $signo));
|
||||
if($signo == SIGTERM)
|
||||
$this->task->set_running(false);
|
||||
}
|
||||
}
|
||||
|
||||
public function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
if(!setup::is_installed())
|
||||
@@ -81,9 +98,12 @@ class module_console_taskrun extends Command
|
||||
|
||||
register_tick_function(array($this, 'tick_handler'), true);
|
||||
declare(ticks=1);
|
||||
pcntl_signal(SIGTERM, array($this, 'sig_handler'));
|
||||
|
||||
$this->task->run($runner, $input, $output);
|
||||
|
||||
$this->task->log(sprintf("%s [%d] taskrun : returned from 'run()', get_status()=%s \n", __FILE__, __LINE__, $this->task->get_status()));
|
||||
|
||||
$this->task->run($runner);
|
||||
printf("TASK QUIT\n");
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
@@ -26,6 +26,7 @@ class task_Scheduler
|
||||
const METHOD_PROC_OPEN = 'METHOD_PROC_OPEN';
|
||||
|
||||
private $method;
|
||||
private $input;
|
||||
protected $output;
|
||||
|
||||
protected function log($message)
|
||||
@@ -33,18 +34,21 @@ class task_Scheduler
|
||||
$registry = registry::get_instance();
|
||||
$logdir = $registry->get('GV_RootPath') . 'logs/';
|
||||
|
||||
logs::rotate($logdir . "scheduler.log");
|
||||
logs::rotate($logdir . "scheduler_l.log");
|
||||
logs::rotate($logdir . "scheduler_o.log");
|
||||
logs::rotate($logdir . "scheduler_e.log");
|
||||
|
||||
$date_obj = new DateTime();
|
||||
$message = sprintf("%s\t%s", $date_obj->format(DATE_ATOM), $message);
|
||||
|
||||
if($this->output instanceof OutputInterface)
|
||||
{
|
||||
$this->output->writeln($message);
|
||||
// $this->output->writeln($message);
|
||||
}
|
||||
// else
|
||||
// $this->output->writeln($this->input->getOption('nolog'));
|
||||
if($this->input && !($this->input->getOption('nolog')))
|
||||
{
|
||||
file_put_contents($logdir . "scheduler.log", $message."\n", FILE_APPEND);
|
||||
file_put_contents($logdir . "scheduler_l.log", $message . "\n", FILE_APPEND);
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
@@ -52,20 +56,32 @@ class task_Scheduler
|
||||
protected static function get_connection()
|
||||
{
|
||||
require dirname(__FILE__) . '/../../../config/connexion.inc';
|
||||
|
||||
return new connection_pdo('appbox', $hostname, $port, $user, $password, $dbname);
|
||||
return(appbox::get_instance()->get_connection());
|
||||
}
|
||||
|
||||
public function run(OutputInterface $output = null, $log_tasks = true)
|
||||
public function run($input=null, OutputInterface $output = null) //, $log = true, $log_tasks = true)
|
||||
{
|
||||
$this->method = self::METHOD_FORK;
|
||||
|
||||
require_once dirname(__FILE__) . '/../../bootstrap.php';
|
||||
$this->input = $input;
|
||||
$this->output = $output;
|
||||
$appbox = appbox::get_instance();
|
||||
$registry = $appbox->get_registry();
|
||||
|
||||
$nullfile = '';
|
||||
$system = system_server::get_platform();
|
||||
switch($system)
|
||||
{
|
||||
case "WINDOWS":
|
||||
$nullfile = 'NUL';
|
||||
break;
|
||||
default:
|
||||
case "DARWIN":
|
||||
case "LINUX":
|
||||
$nullfile = '/dev/null';
|
||||
break;
|
||||
}
|
||||
|
||||
$lockdir = $registry->get('GV_RootPath') . 'tmp/locks/';
|
||||
|
||||
@@ -101,13 +117,12 @@ class task_Scheduler
|
||||
|
||||
$this->log(sprintf("running scheduler with method %s", $this->method));
|
||||
|
||||
|
||||
if($this->method == self::METHOD_FORK)
|
||||
pcntl_signal(SIGCHLD, SIG_IGN);
|
||||
|
||||
$logdir = $registry->get('GV_RootPath') . 'logs/';
|
||||
|
||||
$conn = self::get_connection();
|
||||
$conn = appbox::get_instance()->get_connection();
|
||||
|
||||
$taskPoll = array(); // the poll of tasks
|
||||
|
||||
@@ -146,15 +161,36 @@ class task_Scheduler
|
||||
|
||||
while($schedstatus == 'started' || $runningtask > 0)
|
||||
{
|
||||
while(!$conn->ping())
|
||||
while(1)
|
||||
{
|
||||
try
|
||||
{
|
||||
assert(is_object($conn));
|
||||
$ping = @$conn->ping();
|
||||
}
|
||||
catch(ErrorException $e)
|
||||
{
|
||||
$ping = false;
|
||||
}
|
||||
if($ping)
|
||||
break;
|
||||
|
||||
unset($conn);
|
||||
if(!$connwaslost)
|
||||
{
|
||||
$this->log(sprintf("Warning : abox connection lost, restarting in 10 min."));
|
||||
}
|
||||
sleep(60 * 10);
|
||||
$conn = self::get_connection();
|
||||
for($i = 0; $i < 60 * 10; $i++)
|
||||
sleep(1);
|
||||
try
|
||||
{
|
||||
$conn = appbox::get_instance()->get_connection();
|
||||
}
|
||||
catch(ErrorException $e)
|
||||
{
|
||||
$ping = false;
|
||||
}
|
||||
|
||||
$connwaslost = true;
|
||||
}
|
||||
if($connwaslost)
|
||||
@@ -168,13 +204,21 @@ class task_Scheduler
|
||||
|
||||
$connwaslost = false;
|
||||
}
|
||||
|
||||
// printf("%d \n", __LINE__);
|
||||
$schedstatus = '';
|
||||
$row = NULL;
|
||||
try
|
||||
{
|
||||
$sql = "SELECT schedstatus FROM sitepreff";
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
}
|
||||
catch(ErrorException $e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if($row)
|
||||
{
|
||||
@@ -193,14 +237,14 @@ class task_Scheduler
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute();
|
||||
$stmt->closeCursor();
|
||||
|
||||
$this->log("schedstatus == 'stopping', waiting tasks to end");
|
||||
}
|
||||
|
||||
logs::rotate($logdir . "scheduler.log");
|
||||
logs::rotate($logdir . "scheduler.error.log");
|
||||
|
||||
logs::rotate($logdir . "scheduler_t.log");
|
||||
logs::rotate($logdir . "scheduler_o.log");
|
||||
logs::rotate($logdir . "scheduler_e.log");
|
||||
|
||||
// printf("%d \n", __LINE__);
|
||||
// initialy, all tasks are supposed to be removed from the poll
|
||||
foreach($taskPoll as $tkey => $task)
|
||||
$taskPoll[$tkey]["todel"] = true;
|
||||
@@ -208,32 +252,41 @@ class task_Scheduler
|
||||
foreach($task_manager->get_tasks(true) as $task)
|
||||
{
|
||||
$tkey = "t_" . $task->get_task_id();
|
||||
$status = $task->get_status();
|
||||
|
||||
logs::rotate($logdir . "task_$tkey.log");
|
||||
logs::rotate($logdir . "task_$tkey.error.log");
|
||||
logs::rotate($logdir . "task_t_" . $task->get_task_id() . ".log");
|
||||
logs::rotate($logdir . "task_o_" . $task->get_task_id() . ".log");
|
||||
logs::rotate($logdir . "task_e_" . $task->get_task_id() . ".log");
|
||||
|
||||
if(!isset($taskPoll[$tkey]))
|
||||
{
|
||||
// the task is not in the poll, add it
|
||||
$phpcli = $registry->get('GV_cli');
|
||||
|
||||
switch($system)
|
||||
{
|
||||
case "WINDOWS":
|
||||
$cmd = $phpcli;
|
||||
$args = array('-f', $registry->get('GV_RootPath') . 'bin/console', '--', '-q', 'task:run', $task->get_task_id(), '--runner=scheduler');
|
||||
if($this->input && ($this->input->getOption('notasklog')))
|
||||
$args[] = 'notasklog';
|
||||
break;
|
||||
default:
|
||||
case "DARWIN":
|
||||
case "WINDOWS":
|
||||
case "LINUX":
|
||||
$cmd = $phpcli;
|
||||
$args = array('-f', $registry->get('GV_RootPath') . 'bin/console', 'task:run', $task->get_task_id(), '--runner=scheduler');
|
||||
$args = array('-f', $registry->get('GV_RootPath') . 'bin/console', '--', '-q', 'task:run', $task->get_task_id(), '--runner=scheduler');
|
||||
if($this->input && ($this->input->getOption('notasklog')))
|
||||
$args[] = 'notasklog';
|
||||
break;
|
||||
}
|
||||
|
||||
$taskPoll[$tkey] = array(
|
||||
"task" => $task,
|
||||
"current_status" => $task->get_status(),
|
||||
"current_status" => $status,
|
||||
"cmd" => $cmd,
|
||||
"args" => $args,
|
||||
"killat" => null
|
||||
"killat" => null,
|
||||
"sigterm_sent" => false
|
||||
);
|
||||
if($this->method == self::METHOD_PROC_OPEN)
|
||||
{
|
||||
@@ -245,24 +298,24 @@ class task_Scheduler
|
||||
sprintf(
|
||||
"new Task %s, status=%s"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $task->get_status()
|
||||
, $status
|
||||
)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
// the task is already in the poll, update its status
|
||||
if($taskPoll[$tkey]["current_status"] != $task->get_status())
|
||||
if($taskPoll[$tkey]["current_status"] != $status)
|
||||
{
|
||||
$this->log(
|
||||
sprintf(
|
||||
"Task %s, oldstatus=%s, newstatus=%s"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $taskPoll[$tkey]["current_status"]
|
||||
, $task->get_status()
|
||||
, $status
|
||||
)
|
||||
);
|
||||
$taskPoll[$tkey]["current_status"] = $task->get_status();
|
||||
$taskPoll[$tkey]["current_status"] = $status;
|
||||
}
|
||||
// update the whole task object
|
||||
unset($taskPoll[$tkey]["task"]);
|
||||
@@ -284,18 +337,16 @@ class task_Scheduler
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Launch task that are not yet launched
|
||||
*/
|
||||
// Launch task that are not yet launched
|
||||
$runningtask = 0;
|
||||
|
||||
foreach($taskPoll as $tkey => $tv)
|
||||
{
|
||||
switch($tv['task']->get_status())
|
||||
$status = $tv['task']->get_status();
|
||||
switch($status)
|
||||
{
|
||||
default:
|
||||
$this->log(sprintf('Unknow status `%s`', $tv['task']->get_status()));
|
||||
$this->log(sprintf('Unknow status `%s`', $status));
|
||||
break;
|
||||
|
||||
case task_abstract::RETURNSTATUS_TORESTART:
|
||||
@@ -332,24 +383,8 @@ class task_Scheduler
|
||||
{
|
||||
if(!$taskPoll[$tkey]["process"])
|
||||
{
|
||||
$descriptors = array(
|
||||
1 => array("pipe", "w"),
|
||||
2 => array("pipe", "w")
|
||||
);
|
||||
|
||||
if($log_tasks === true)
|
||||
{
|
||||
$descriptors[1] = array(
|
||||
"file"
|
||||
, $logdir . "task_$tkey.log"
|
||||
, "a+"
|
||||
);
|
||||
$descriptors[2] = array(
|
||||
"file"
|
||||
, $logdir . "task_$tkey.error.log"
|
||||
, "a+"
|
||||
);
|
||||
}
|
||||
$descriptors[1] = array('file', $logdir . "task_o_" . $task->get_task_id() . ".log", 'a+');
|
||||
$descriptors[2] = array('file', $logdir . "task_e_" . $task->get_task_id() . ".log", 'a+');
|
||||
|
||||
$taskPoll[$tkey]["process"] = proc_open(
|
||||
$taskPoll[$tkey]["cmd"] . ' ' . implode(' ', $taskPoll[$tkey]["args"])
|
||||
@@ -415,27 +450,25 @@ class task_Scheduler
|
||||
// child
|
||||
// printf("hello i am child pid=%d\n", getmypid());
|
||||
// printf("%s %s \n", $taskPoll[$tkey]["cmd"], implode(' ', $taskPoll[$tkey]["args"]));
|
||||
// ;
|
||||
umask(0);
|
||||
openlog('MyLog', LOG_PID | LOG_PERROR, LOG_LOCAL0);
|
||||
if(posix_setsid() < 0)
|
||||
die("Forked process could not detach from terminal\n");
|
||||
//chdir(dirname(__FILE__));
|
||||
|
||||
fclose(STDIN);
|
||||
fclose(STDOUT);
|
||||
fclose(STDERR);
|
||||
$fdIN = fopen('/dev/null', 'r');
|
||||
$fdOUT = fopen($logdir . "task_$tkey.log", 'a+');
|
||||
$fdERR = fopen($logdir . "task_$tkey.error.log", 'a+');
|
||||
$fdIN = fopen($nullfile, 'r');
|
||||
$fdOUT = fopen($logdir . "task_o_" . $taskPoll[$tkey]["task"]->get_task_id() . ".log", 'a+');
|
||||
$fdERR = fopen($logdir . "task_e_" . $taskPoll[$tkey]["task"]->get_task_id() . ".log", 'a+');
|
||||
|
||||
$this->log(sprintf("exec('%s %s')", $taskPoll[$tkey]["cmd"], implode(' ', $taskPoll[$tkey]["args"])));
|
||||
pcntl_exec($taskPoll[$tkey]["cmd"], $taskPoll[$tkey]["args"]);
|
||||
|
||||
sleep(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
// parent
|
||||
// printf("hello i am parent pid=%d\n", getmypid());
|
||||
// sleep(2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -506,33 +539,30 @@ class task_Scheduler
|
||||
if($taskPoll[$tkey]["killat"] === NULL)
|
||||
$taskPoll[$tkey]["killat"] = time() + self::TASKDELAYTOQUIT;
|
||||
|
||||
$tpid = $taskPoll[$tkey]['task']->get_pid();
|
||||
if($tpid)
|
||||
$pid = $taskPoll[$tkey]['task']->get_pid();
|
||||
if($pid)
|
||||
{
|
||||
if(!$taskPoll[$tkey]['sigterm_sent'])
|
||||
{
|
||||
posix_kill($pid, SIGTERM);
|
||||
$this->log(
|
||||
sprintf(
|
||||
"SIGTERM sent to task %s (pid=%s)"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $pid
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if(($dt = $taskPoll[$tkey]["killat"] - time()) < 0)
|
||||
{
|
||||
if($this->method == self::METHOD_PROC_OPEN)
|
||||
{
|
||||
$pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid $tpid`);
|
||||
foreach($pids as $pid)
|
||||
{
|
||||
if(is_numeric($pid))
|
||||
{
|
||||
$this->log("Killing pid %d", $pid);
|
||||
posix_kill($pid, 9);
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif($this->method == self::METHOD_FORK)
|
||||
{
|
||||
posix_kill($tpid, 9);
|
||||
}
|
||||
|
||||
$this->log(
|
||||
sprintf(
|
||||
"SIGKILL sent to task %s (pid=%s)"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $tpid
|
||||
, $pid
|
||||
)
|
||||
);
|
||||
|
||||
@@ -569,6 +599,7 @@ class task_Scheduler
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
)
|
||||
);
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::RETURNSTATUS_STOPPED);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -590,290 +621,8 @@ class task_Scheduler
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
||||
$common_status = array(
|
||||
task_abstract::STATUS_STARTED
|
||||
, task_abstract::RETURNSTATUS_STOPPED
|
||||
);
|
||||
|
||||
|
||||
foreach($taskPoll as $tkey => $tv)
|
||||
{
|
||||
// if (!in_array($taskPoll[$tkey]["task"]->get_status(), $common_status))
|
||||
// {
|
||||
// $this->log(
|
||||
// sprintf(
|
||||
// 'task %s has status %s'
|
||||
// , $taskPoll[$tkey]["task"]->get_task_id()
|
||||
// , $taskPoll[$tkey]["task"]->get_status()
|
||||
// )
|
||||
// );
|
||||
// }
|
||||
switch($tv['task']->get_status())
|
||||
{
|
||||
default:
|
||||
$this->log(sprintf('Unknow status `%s`', $tv['task']->get_status()));
|
||||
break;
|
||||
|
||||
case task_abstract::RETURNSTATUS_TORESTART:
|
||||
if(!$taskPoll[$tkey]['task']->get_pid())
|
||||
{
|
||||
@fclose($taskPoll[$tkey]["pipes"][1]);
|
||||
@fclose($taskPoll[$tkey]["pipes"][2]);
|
||||
@proc_close($taskPoll[$tkey]["process"]);
|
||||
|
||||
$taskPoll[$tkey]["process"] = null;
|
||||
if($schedstatus == 'started')
|
||||
{
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::STATUS_TOSTART);
|
||||
}
|
||||
// trick to start the task immediatly : DON'T break if ending with 'tostart'
|
||||
// so it will continue with 'tostart' case !
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
case task_abstract::STATUS_TOSTART:
|
||||
// if scheduler is 'tostop', don't launch a new task !
|
||||
if($schedstatus != 'started')
|
||||
break;
|
||||
|
||||
$taskPoll[$tkey]["killat"] = NULL;
|
||||
if(!$taskPoll[$tkey]["process"])
|
||||
{
|
||||
$descriptors = array(
|
||||
1 => array("pipe", "w"),
|
||||
2 => array("pipe", "w")
|
||||
);
|
||||
|
||||
if($log_tasks === true)
|
||||
{
|
||||
$descriptors[1] = array(
|
||||
"file"
|
||||
, $logdir . "task_$tkey.log"
|
||||
, "a+"
|
||||
);
|
||||
$descriptors[2] = array(
|
||||
"file"
|
||||
, $logdir . "task_$tkey.error.log"
|
||||
, "a+"
|
||||
);
|
||||
}
|
||||
|
||||
$taskPoll[$tkey]["process"] = proc_open(
|
||||
$taskPoll[$tkey]["cmd"].' '.implode(' ', $taskPoll[$tkey]["args"])
|
||||
, $descriptors
|
||||
, $taskPoll[$tkey]["pipes"]
|
||||
, $registry->get('GV_RootPath') . "bin/"
|
||||
, null
|
||||
, array('bypass_shell' => true)
|
||||
);
|
||||
|
||||
if(is_resource($taskPoll[$tkey]["process"]))
|
||||
{
|
||||
sleep(2); // let the process lock and write it's pid
|
||||
}
|
||||
|
||||
if(is_resource($taskPoll[$tkey]["process"]) && $taskPoll[$tkey]['task']->get_pid() !== null)
|
||||
{
|
||||
|
||||
// ************************************************
|
||||
// file_put_contents("/tmp/scheduler2.log", sprintf("%s [%d] : RUNNING ? : pid=%s \n", __FILE__, __LINE__, $taskPoll[$tkey]['task']->get_pid()), FILE_APPEND);
|
||||
|
||||
$this->log(
|
||||
sprintf(
|
||||
"Task %s '%s' started (pid=%s)"
|
||||
, $taskPoll[$tkey]['task']->get_task_id()
|
||||
, $taskPoll[$tkey]["cmd"]
|
||||
, $taskPoll[$tkey]['task']->get_pid()
|
||||
)
|
||||
);
|
||||
$runningtask++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ************************************************
|
||||
// file_put_contents("/tmp/scheduler2.log", sprintf("%s [%d] : NOT RUNNING ? : pid=%s \n", __FILE__, __LINE__, $taskPoll[$tkey]['task']->get_pid()), FILE_APPEND);
|
||||
$taskPoll[$tkey]["task"]->increment_crash_counter();
|
||||
|
||||
@fclose($taskPoll[$tkey]["pipes"][1]);
|
||||
@fclose($taskPoll[$tkey]["pipes"][2]);
|
||||
@proc_close($taskPoll[$tkey]["process"]);
|
||||
$taskPoll[$tkey]["process"] = null;
|
||||
|
||||
$this->log(
|
||||
sprintf(
|
||||
"Task %s '%s' failed to start %d times"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $taskPoll[$tkey]["cmd"]
|
||||
, $taskPoll[$tkey]["task"]->get_crash_counter()
|
||||
)
|
||||
);
|
||||
|
||||
if($taskPoll[$tkey]["task"]->get_crash_counter() > 5)
|
||||
{
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::RETURNSTATUS_STOPPED);
|
||||
}
|
||||
else
|
||||
{
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::STATUS_TOSTART);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case task_abstract::STATUS_STARTED:
|
||||
$crashed = false;
|
||||
// If no process, the task is probably manually ran
|
||||
if($taskPoll[$tkey]["process"])
|
||||
{
|
||||
$taskPoll[$tkey]["killat"] = NULL;
|
||||
|
||||
// if(is_resource($taskPoll[$tkey]["process"]))
|
||||
// {
|
||||
// $proc_status = proc_get_status($taskPoll[$tkey]["process"]);
|
||||
// if($proc_status['running'])
|
||||
// $runningtask++;
|
||||
// else
|
||||
// $crashed = true;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// $crashed = true;
|
||||
// }
|
||||
|
||||
if($taskPoll[$tkey]['task']->get_pid())
|
||||
$runningtask++;
|
||||
else
|
||||
$crashed = true;
|
||||
}
|
||||
|
||||
if($crashed === true && $taskPoll[$tkey]["task"]->get_status() === task_abstract::RETURNSTATUS_TORESTART)
|
||||
{
|
||||
$crashed = false;
|
||||
}
|
||||
if($crashed)
|
||||
{
|
||||
$taskPoll[$tkey]["task"]->increment_crash_counter();
|
||||
|
||||
@fclose($taskPoll[$tkey]["pipes"][1]);
|
||||
@fclose($taskPoll[$tkey]["pipes"][2]);
|
||||
@proc_close($taskPoll[$tkey]["process"]);
|
||||
$taskPoll[$tkey]["process"] = null;
|
||||
|
||||
$this->log(
|
||||
sprintf(
|
||||
"Task %s crashed %d times"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $taskPoll[$tkey]["task"]->get_crash_counter()
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
if($taskPoll[$tkey]["task"]->get_crash_counter() > 5)
|
||||
{
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::RETURNSTATUS_STOPPED);
|
||||
}
|
||||
else
|
||||
{
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::STATUS_TOSTART);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case task_abstract::STATUS_TOSTOP:
|
||||
if($taskPoll[$tkey]["process"])
|
||||
{
|
||||
if($taskPoll[$tkey]["killat"] === NULL)
|
||||
$taskPoll[$tkey]["killat"] = time() + self::TASKDELAYTOQUIT;
|
||||
|
||||
if(($dt = $taskPoll[$tkey]["killat"] - time()) < 0)
|
||||
{
|
||||
$ppid = $taskPoll[$tkey]['task']->get_pid();
|
||||
$pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid $ppid`);
|
||||
foreach($pids as $pid)
|
||||
{
|
||||
if(is_numeric($pid))
|
||||
{
|
||||
$this->log("Killing pid %d", $pid);
|
||||
posix_kill($pid, 9);
|
||||
}
|
||||
}
|
||||
|
||||
$this->log(
|
||||
sprintf(
|
||||
"SIGKILL sent to task %s (pid=%s)"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $taskPoll[$tkey]["task"]->get_pid()
|
||||
)
|
||||
);
|
||||
|
||||
proc_terminate($taskPoll[$tkey]["process"], 9);
|
||||
@fclose($taskPoll[$tkey]["pipes"][1]);
|
||||
@fclose($taskPoll[$tkey]["pipes"][2]);
|
||||
proc_close($taskPoll[$tkey]["process"]);
|
||||
unlink($lockdir . 'task_' . $taskPoll[$tkey]['task']->get_task_id() . '.lock');
|
||||
|
||||
$taskPoll[$tkey]["task"]->increment_crash_counter();
|
||||
// $taskPoll[$tkey]["task"]->set_pid(null);
|
||||
$taskPoll[$tkey]["task"]->set_status(task_abstract::RETURNSTATUS_STOPPED);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->log(
|
||||
sprintf(
|
||||
"waiting task %s to quit (kill in %d seconds)"
|
||||
, $taskPoll[$tkey]["task"]->get_task_id()
|
||||
, $dt
|
||||
)
|
||||
);
|
||||
$runningtask++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case task_abstract::RETURNSTATUS_STOPPED:
|
||||
case task_abstract::RETURNSTATUS_TODELETE:
|
||||
if($taskPoll[$tkey]["process"])
|
||||
{
|
||||
@fclose($taskPoll[$tkey]["pipes"][1]);
|
||||
@fclose($taskPoll[$tkey]["pipes"][2]);
|
||||
@proc_close($taskPoll[$tkey]["process"]);
|
||||
|
||||
$taskPoll[$tkey]["process"] = null;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$to_reopen = false;
|
||||
if($conn->ping())
|
||||
{
|
||||
$conn->close();
|
||||
unset($conn);
|
||||
$to_reopen = true;
|
||||
}
|
||||
sleep($sleeptime);
|
||||
if($to_reopen)
|
||||
{
|
||||
$conn = self::get_connection();
|
||||
}
|
||||
for($i=0; $i<$sleeptime; $i++)
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
$sql = "UPDATE sitepreff SET schedstatus='stopped', schedpid='0'";
|
||||
|
@@ -90,6 +90,9 @@ abstract class task_abstract
|
||||
protected $return_value;
|
||||
protected $runner;
|
||||
|
||||
private $input;
|
||||
private $output;
|
||||
|
||||
/**
|
||||
* delay between two loops
|
||||
*
|
||||
@@ -104,7 +107,15 @@ abstract class task_abstract
|
||||
|
||||
public function get_status()
|
||||
{
|
||||
return $this->task_status;
|
||||
$conn = connection::getPDOConnection();
|
||||
$sql = 'SELECT status FROM task2 WHERE task_id = :taskid';
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute(array(':taskid' => $this->taskid));
|
||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
if(!$row)
|
||||
throw new Exception('Unknown task id');
|
||||
return $row['status'];
|
||||
}
|
||||
|
||||
public function printInterfaceHEAD()
|
||||
@@ -141,7 +152,7 @@ abstract class task_abstract
|
||||
$stmt = $conn->prepare($sql);
|
||||
$stmt->execute(array(':status' => $status, ':taskid' => $this->get_task_id()));
|
||||
$stmt->closeCursor();
|
||||
|
||||
$this->log(sprintf("task %d <- %s", $this->get_task_id(), $status));
|
||||
$this->task_status = $status;
|
||||
|
||||
return $this->task_status;
|
||||
@@ -265,6 +276,7 @@ abstract class task_abstract
|
||||
function __construct($taskid)
|
||||
{
|
||||
$this->taskid = $taskid;
|
||||
|
||||
phrasea::use_i18n(Session_Handler::get_locale());
|
||||
|
||||
$this->system = system_server::get_platform();
|
||||
@@ -296,7 +308,7 @@ abstract class task_abstract
|
||||
$this->log($e->getMessage());
|
||||
$this->log(("Warning : abox connection lost, restarting in 10 min."));
|
||||
|
||||
for($t = 60 * 10; $t > 0; $t--) // DON'T do sleep(600) because it prevents ticks !
|
||||
for($t = 60 * 10; $this->running && $t > 0; $t--) // DON'T do sleep(600) because it prevents ticks !
|
||||
sleep(1);
|
||||
|
||||
$this->running = false;
|
||||
@@ -353,6 +365,8 @@ abstract class task_abstract
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
if(!$this->get_pid()) // do not delete a running task
|
||||
{
|
||||
$conn = connection::getPDOConnection();
|
||||
$registry = registry::get_instance();
|
||||
@@ -362,10 +376,8 @@ abstract class task_abstract
|
||||
$stmt->closeCursor();
|
||||
|
||||
$lock_file = $registry->get('GV_RootPath') . 'tmp/locks/task_' . $this->get_task_id() . '.lock';
|
||||
if(is_writable($lock_file))
|
||||
unlink($lock_file);
|
||||
|
||||
return;
|
||||
@unlink($lock_file);
|
||||
}
|
||||
}
|
||||
|
||||
protected function check_memory_usage()
|
||||
@@ -521,6 +533,11 @@ abstract class task_abstract
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function set_running($stat)
|
||||
{
|
||||
$this->running = $stat;
|
||||
}
|
||||
|
||||
protected function pause($when_started=0)
|
||||
{
|
||||
$this->log($this->records_done . ' records done');
|
||||
@@ -532,15 +549,16 @@ abstract class task_abstract
|
||||
$conn = connection::getPDOConnection();
|
||||
$conn->close();
|
||||
unset($conn);
|
||||
// sleep($this->period - $when_started);
|
||||
for($t = $this->period - $when_started; $t > 0; $t--) // DON'T do sleep($this->period - $when_started) because it prevents ticks !
|
||||
for($t = $this->period - $when_started; $this->running && $t > 0; $t--) // DON'T do sleep($this->period - $when_started) because it prevents ticks !
|
||||
sleep(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final public function run($runner)
|
||||
final public function run($runner, $input=null, $output = null)
|
||||
{
|
||||
$this->input = $input;
|
||||
$this->output = $output;
|
||||
|
||||
// ************************************************
|
||||
// file_put_contents("/tmp/scheduler2.log", sprintf("%s [%d] : LAUNCHING : tid=%s \n", __FILE__, __LINE__, $this->get_task_id()), FILE_APPEND);
|
||||
@@ -555,7 +573,7 @@ abstract class task_abstract
|
||||
{
|
||||
// ************************************************
|
||||
// file_put_contents("/tmp/scheduler2.log", sprintf("%s [%d] : LAUNCH OPENED AND CANT LOCK : pid=%s \n", __FILE__, __LINE__, getmypid()), FILE_APPEND);
|
||||
printf(("runtask::ERROR : task already running.\n"), $taskid);
|
||||
$this->log("runtask::ERROR : task already running.");
|
||||
fclose($tasklock);
|
||||
|
||||
return;
|
||||
@@ -574,8 +592,8 @@ abstract class task_abstract
|
||||
$this->set_status(self::STATUS_STARTED);
|
||||
|
||||
$this->running = true;
|
||||
|
||||
$this->run2();
|
||||
// $this->set_pid(0);
|
||||
|
||||
flock($tasklock, LOCK_UN | LOCK_NB);
|
||||
ftruncate($tasklock, 0);
|
||||
@@ -586,7 +604,6 @@ abstract class task_abstract
|
||||
$this->delete();
|
||||
else
|
||||
$this->set_status($this->return_value);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -651,12 +668,30 @@ abstract class task_abstract
|
||||
// print($s);
|
||||
}
|
||||
|
||||
function log($msg = '')
|
||||
public function log($message)
|
||||
{
|
||||
// $d = debug_backtrace(false);
|
||||
// printf("%s\t[%s]\t%s\r\n", date('r'), $d[0]['line'], $msg);
|
||||
printf("%s\t%s\r\n", date('r'), $msg);
|
||||
$registry = registry::get_instance();
|
||||
$logdir = $registry->get('GV_RootPath') . 'logs/';
|
||||
|
||||
logs::rotate($logdir . 'task_l_'.$this->taskid.'.log');
|
||||
logs::rotate($logdir . 'task_o_'.$this->taskid.'.log');
|
||||
logs::rotate($logdir . 'task_e_'.$this->taskid.'.log');
|
||||
|
||||
$date_obj = new DateTime();
|
||||
$message = sprintf("%s\t%s", $date_obj->format(DATE_ATOM), $message);
|
||||
|
||||
if($this->output)
|
||||
{
|
||||
$this->output->writeln($message);
|
||||
}
|
||||
if( $this->input && !($this->input->getOption('nolog')) )
|
||||
{
|
||||
file_put_contents($logdir . 'task_l_'.$this->taskid.'.log', $message."\n", FILE_APPEND);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
public static function interfaceAvailable()
|
||||
{
|
||||
|
@@ -33,27 +33,32 @@ abstract class task_databoxAbstract extends task_abstract
|
||||
|
||||
protected function run2()
|
||||
{
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
while($this->running)
|
||||
{
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
try
|
||||
{
|
||||
$conn = connection::getPDOConnection();
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->log($e->getMessage());
|
||||
$this->log(("Warning : abox connection lost, restarting in 10 min."));
|
||||
|
||||
for($t = 60 * 10; $t; $t--) // DON'T do sleep(600) because it prevents ticks !
|
||||
for($t = 60 * 10; $this->running && $t; $t--) // DON'T do sleep(600) because it prevents ticks !
|
||||
sleep(1);
|
||||
|
||||
$this->running = false;
|
||||
$this->return_value = self::RETURNSTATUS_TORESTART;
|
||||
|
||||
$this->log(sprintf("%s [%d] returning from 'run2()' rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_last_exec_time();
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
|
||||
try
|
||||
{
|
||||
@@ -67,12 +72,14 @@ abstract class task_databoxAbstract extends task_abstract
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->task_status = self::STATUS_TOSTOP;
|
||||
$this->return_value = self::RETURNSTATUS_STOPPED;
|
||||
$rs = array();
|
||||
}
|
||||
foreach($rs as $row)
|
||||
{
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
if(!$this->running)
|
||||
break;
|
||||
|
||||
@@ -89,6 +96,7 @@ abstract class task_databoxAbstract extends task_abstract
|
||||
|
||||
try
|
||||
{
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->load_settings(simplexml_load_string($row['settings']));
|
||||
}
|
||||
catch(Exception $e)
|
||||
@@ -98,14 +106,26 @@ abstract class task_databoxAbstract extends task_abstract
|
||||
}
|
||||
|
||||
$this->current_state = self::STATE_OK;
|
||||
$this->process_sbas()
|
||||
->check_current_state()
|
||||
->flush_records_sbas();
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->process_sbas()->check_current_state();
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->process_sbas()->flush_records_sbas();
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
}
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
|
||||
$this->increment_loops();
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->pause($duration);
|
||||
}
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->process_sbas()->check_current_state();
|
||||
$this->log(sprintf("%s [%d] rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
$this->process_sbas()->flush_records_sbas();
|
||||
|
||||
$this->set_status($this->return_value);
|
||||
|
||||
$this->log(sprintf("%s [%d] returning from 'run2()' rv=%s \n", __FILE__, __LINE__, $this->return_value));
|
||||
|
||||
return;
|
||||
}
|
||||
|
@@ -167,13 +167,7 @@ class task_manager
|
||||
|
||||
public function get_scheduler_state2()
|
||||
{
|
||||
$sql = "SELECT UNIX_TIMESTAMP()-UNIX_TIMESTAMP(schedqtime) AS qdelay, schedstatus AS status FROM sitepreff";
|
||||
$stmt = $this->appbox->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$ret = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$ret['pid'] = NULL;
|
||||
|
||||
$pid = NULL;
|
||||
$appbox = appbox::get_instance();
|
||||
$lockdir = $appbox->get_registry()->get('GV_RootPath') . 'tmp/locks/';
|
||||
if( ($schedlock = fopen( $lockdir . 'scheduler.lock', 'a+')) )
|
||||
@@ -181,7 +175,7 @@ class task_manager
|
||||
if (flock($schedlock, LOCK_SH | LOCK_NB) === FALSE)
|
||||
{
|
||||
// already locked : running !
|
||||
$ret['pid'] = fgets($schedlock, 512);
|
||||
$pid = trim(fgets($schedlock, 512));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -190,6 +184,20 @@ class task_manager
|
||||
}
|
||||
fclose($schedlock);
|
||||
}
|
||||
|
||||
$sql = "SELECT UNIX_TIMESTAMP()-UNIX_TIMESTAMP(schedqtime) AS qdelay, schedstatus AS status FROM sitepreff";
|
||||
$stmt = $this->appbox->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$ret = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
|
||||
if($pid === NULL && $ret['status'] !== 'stopped')
|
||||
{
|
||||
// auto fix
|
||||
$this->appbox->get_connection()->exec('UPDATE sitepreff SET schedstatus=\'stopped\'');
|
||||
$ret['status'] = 'stopped';
|
||||
}
|
||||
$ret['pid'] = $pid;
|
||||
return($ret);
|
||||
}
|
||||
|
||||
|
@@ -16,7 +16,6 @@
|
||||
*/
|
||||
class task_period_archive extends task_abstract
|
||||
{
|
||||
|
||||
/**
|
||||
* command line args specifics
|
||||
*
|
||||
@@ -173,7 +172,6 @@ class task_period_archive extends task_abstract
|
||||
<?php echo $form ?>.copy_spe.checked = <?php echo p4field::isyes($sxml->copy_spe) ? "true" : "false" ?>;
|
||||
</script>
|
||||
<?php
|
||||
|
||||
return("");
|
||||
}
|
||||
else // ... so we NEVER come here
|
||||
@@ -206,7 +204,6 @@ class task_period_archive extends task_abstract
|
||||
}
|
||||
</script>
|
||||
<?php
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -406,7 +403,8 @@ class task_period_archive extends task_abstract
|
||||
catch(Exception $e)
|
||||
{
|
||||
$this->log(("dbox connection lost, restarting in 10 min."));
|
||||
sleep(60 * 10);
|
||||
for($i = 0; $i < 60 * 10 && $this->running; $i++)
|
||||
sleep(1);
|
||||
$this->running = false;
|
||||
|
||||
return(self::RETURNSTATUS_TORESTART);
|
||||
@@ -416,7 +414,8 @@ class task_period_archive extends task_abstract
|
||||
if(!@is_dir($path_in))
|
||||
{
|
||||
$this->log(sprintf(('missing hotfolder \'%s\', restarting in 10 min.'), $path_in));
|
||||
sleep(60 * 10);
|
||||
for($i = 0; $i < 60 * 10 && $this->running; $i++)
|
||||
sleep(1);
|
||||
$this->running = false;
|
||||
|
||||
return(self::RETURNSTATUS_TORESTART);
|
||||
@@ -482,7 +481,8 @@ class task_period_archive extends task_abstract
|
||||
if($duration < ($period + $cold))
|
||||
{
|
||||
$conn->close();
|
||||
sleep(($period + $cold) - $duration);
|
||||
for($i = 0; $i < (($period + $cold) - $duration) && $this->running; $i++)
|
||||
sleep(1);
|
||||
unset($conn);
|
||||
$conn = connection::getPDOConnection();
|
||||
}
|
||||
@@ -514,7 +514,6 @@ class task_period_archive extends task_abstract
|
||||
}
|
||||
}
|
||||
$this->return_value = $ret;
|
||||
|
||||
return($ret);
|
||||
}
|
||||
|
||||
@@ -590,7 +589,6 @@ class task_period_archive extends task_abstract
|
||||
$stmt->closeCursor();
|
||||
|
||||
if($row && $row['status'] == 'tostop')
|
||||
|
||||
return('NORECSTODO');
|
||||
sleep(2);
|
||||
$cold -= 2;
|
||||
@@ -738,10 +736,8 @@ class task_period_archive extends task_abstract
|
||||
{
|
||||
$magicmethod = strtoupper($sxDotPhrasea->magicfile['method']);
|
||||
if($magicmethod == 'LOCK' && file_exists($path . '/' . $magicfile))
|
||||
|
||||
return;
|
||||
elseif($magicmethod == 'UNLOCK' && !file_exists($path . '/' . $magicfile))
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -825,6 +821,19 @@ class task_period_archive extends task_abstract
|
||||
|
||||
$xp = new DOMXPath($dom);
|
||||
|
||||
if(($sxDotPhrasea = @simplexml_load_file($path . '/.phrasea.xml')))
|
||||
{
|
||||
// on gere le magicfile
|
||||
if(($magicfile = trim((string) ($sxDotPhrasea->magicfile))) != '')
|
||||
{
|
||||
$magicmethod = strtoupper($sxDotPhrasea->magicfile['method']);
|
||||
if($magicmethod == 'LOCK' && file_exists($path . '/' . $magicfile))
|
||||
return;
|
||||
elseif($magicmethod == 'UNLOCK' && !file_exists($path . '/' . $magicfile))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
while(($file = $listFolder->read()) !== NULL)
|
||||
{
|
||||
if($this->isIgnoredFile($file))
|
||||
@@ -834,8 +843,6 @@ class task_period_archive extends task_abstract
|
||||
usleep(500);
|
||||
|
||||
$dnl = @$xp->query('./file[@name="' . $file . '"]', $node);
|
||||
// if(!$dnl)
|
||||
// printf("%s \n", './file[@name="'.$file.'"]');
|
||||
if($dnl && $dnl->length == 0)
|
||||
{
|
||||
if(is_dir($path . '/' . $file))
|
||||
@@ -913,7 +920,6 @@ class task_period_archive extends task_abstract
|
||||
$iloop = 0;
|
||||
|
||||
if($depth == 0 && ($node->getAttribute('temperature') == 'hot' || $node->getAttribute('cid') == '-1'))
|
||||
|
||||
return;
|
||||
|
||||
$xpath = new DOMXPath($dom); // useful
|
||||
@@ -1072,10 +1078,8 @@ class task_period_archive extends task_abstract
|
||||
$ret = false;
|
||||
|
||||
if($depth == 0 && $node->getAttribute('temperature') == 'hot') // if root of hotfolder if hot, die...
|
||||
|
||||
return($ret);
|
||||
|
||||
//printf("%s : \n", __LINE__);
|
||||
$nodesToDel = array();
|
||||
for($n = $node->firstChild; $n; $n = $n->nextSibling)
|
||||
{
|
||||
@@ -1085,12 +1089,7 @@ class task_period_archive extends task_abstract
|
||||
if($n->getAttribute('temperature') == 'hot') // do not move hotfiles
|
||||
continue;
|
||||
|
||||
//printf("%s : \n", __LINE__);
|
||||
$name = $n->getAttribute('name');
|
||||
//printf("----------------\n file %s : \n ", $path.'/'.$name);
|
||||
//$fp = fopen('php://stdin', 'r');
|
||||
//fgets($fp);
|
||||
//fclose($fp);
|
||||
|
||||
if($n->getAttribute('isdir'))
|
||||
{
|
||||
@@ -1115,7 +1114,6 @@ class task_period_archive extends task_abstract
|
||||
// a file
|
||||
if($n->getAttribute('error'))
|
||||
{
|
||||
// printf("%s : \n", __LINE__);
|
||||
if($this->move_error)
|
||||
{
|
||||
$rootpath = p4string::delEndSlash(trim((string) ($this->sxTaskSettings->hotfolder)));
|
||||
@@ -1161,7 +1159,6 @@ class task_period_archive extends task_abstract
|
||||
$iloop = 0;
|
||||
|
||||
if($node->getAttribute('temperature') == 'hot')
|
||||
|
||||
return;
|
||||
|
||||
$nodesToDel = array();
|
||||
@@ -1238,7 +1235,6 @@ class task_period_archive extends task_abstract
|
||||
$iloop = 0;
|
||||
|
||||
if($node->getAttribute('temperature') == 'hot')
|
||||
|
||||
return;
|
||||
|
||||
$ret = 0;
|
||||
@@ -1302,7 +1298,6 @@ class task_period_archive extends task_abstract
|
||||
$ret = false;
|
||||
|
||||
if($depth == 0 && $node->getAttribute('temperature') == 'hot') // if root of hotfolder if hot, die...
|
||||
|
||||
return($ret);
|
||||
|
||||
//printf("%s : \n", __LINE__);
|
||||
@@ -1686,7 +1681,6 @@ class task_period_archive extends task_abstract
|
||||
{
|
||||
$match = $node->getAttribute('match');
|
||||
if($match == '*')
|
||||
|
||||
return;
|
||||
|
||||
$file = $node->getAttribute('name');
|
||||
@@ -2021,7 +2015,6 @@ class task_period_archive extends task_abstract
|
||||
|
||||
class CListFolder
|
||||
{
|
||||
|
||||
/**
|
||||
*
|
||||
* @var Array
|
||||
@@ -2065,4 +2058,3 @@ class CListFolder
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@@ -16,6 +16,11 @@
|
||||
*/
|
||||
class task_period_cindexer extends task_abstract
|
||||
{
|
||||
// how to execute indexer (choose in 'run2' method)
|
||||
private $method;
|
||||
const METHOD_FORK = 'METHOD_FORK';
|
||||
const METHOD_EXEC = 'METHOD_EXEC';
|
||||
const METHOD_PROC_OPEN = 'METHOD_PROC_OPEN';
|
||||
|
||||
/**
|
||||
*
|
||||
@@ -178,7 +183,6 @@ class task_period_cindexer extends task_abstract
|
||||
parent.calccmd();
|
||||
</script>
|
||||
<?php
|
||||
|
||||
return("");
|
||||
}
|
||||
else // ... so we NEVER come here
|
||||
@@ -247,7 +251,6 @@ class task_period_cindexer extends task_abstract
|
||||
}
|
||||
</script>
|
||||
<?php
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -356,13 +359,17 @@ class task_period_cindexer extends task_abstract
|
||||
*/
|
||||
protected function run2()
|
||||
{
|
||||
$this->method = self::METHOD_PROC_OPEN;
|
||||
$this->method = self::METHOD_FORK;
|
||||
$this->method = self::METHOD_EXEC;
|
||||
|
||||
$cmd = $this->binpath . 'phraseanet_indexer';
|
||||
$nulfile = '/dev/null';
|
||||
$nullfile = '/dev/null';
|
||||
|
||||
if($this->system == 'WINDOWS')
|
||||
{
|
||||
$cmd .= '.exe';
|
||||
$nulfile = 'nul';
|
||||
$nullfile = 'NULL';
|
||||
}
|
||||
|
||||
if(!file_exists($cmd) || !is_executable($cmd))
|
||||
@@ -372,28 +379,57 @@ class task_period_cindexer extends task_abstract
|
||||
return;
|
||||
}
|
||||
|
||||
$cmd .= $this->host ? " -h=" . $this->host : '';
|
||||
$cmd .= $this->port ? " -P=" . $this->port : '';
|
||||
$cmd .= $this->base ? " -b=" . $this->base : '';
|
||||
$cmd .= $this->user ? " -u=" . $this->user : '';
|
||||
$cmd .= $this->password ? " -p=" . $this->password : '';
|
||||
$cmd .= $this->socket ? " --socket=" . $this->socket : '';
|
||||
$cmd .= $this->use_sbas ? " -o" : '';
|
||||
$cmd .= $this->charset ? " --default-character-set=" . $this->charset : '';
|
||||
$cmd .= $this->nolog ? " -n" : '';
|
||||
$cmd .= $this->winsvc_run ? " --run" : '';
|
||||
// $cmd .= $this->host ? " -h=" . $this->host : '';
|
||||
// $cmd .= $this->port ? " -P=" . $this->port : '';
|
||||
// $cmd .= $this->base ? " -b=" . $this->base : '';
|
||||
// $cmd .= $this->user ? " -u=" . $this->user : '';
|
||||
// $cmd .= $this->password ? " -p=" . $this->password : '';
|
||||
// $cmd .= $this->socket ? " --socket=" . $this->socket : '';
|
||||
// $cmd .= $this->use_sbas ? " -o" : '';
|
||||
// $cmd .= $this->charset ? " --default-character-set=" . $this->charset : '';
|
||||
// $cmd .= $this->nolog ? " -n" : '';
|
||||
// $cmd .= $this->winsvc_run ? " --run" : '';
|
||||
|
||||
$args = array();
|
||||
if($this->host)
|
||||
$args[] = '-h=' . $this->host;
|
||||
if($this->port)
|
||||
;
|
||||
$args[] = '-P=' . $this->port;
|
||||
if($this->base)
|
||||
$args[] = '-b=' . $this->base;
|
||||
if($this->user)
|
||||
$args[] = '-u=' . $this->user;
|
||||
if($this->password)
|
||||
$args[] = '-p=' . $this->password;
|
||||
if($this->socket)
|
||||
$args[] = '--socket=' . $this->socket;
|
||||
if($this->use_sbas)
|
||||
$args[] = '-o';
|
||||
if($this->charset)
|
||||
$args[] = '--default-character-set=' . $this->charset;
|
||||
if($this->nolog)
|
||||
$args[] = '-n';
|
||||
if($this->winsvc_run)
|
||||
$args[] = '--run';
|
||||
|
||||
$registry = registry::get_instance();
|
||||
$logdir = p4string::addEndSlash($registry->get('GV_RootPath') . 'logs');
|
||||
|
||||
$this->return_value = self::RETURNSTATUS_STOPPED; // will be normal ending
|
||||
|
||||
if($this->method == self::METHOD_PROC_OPEN)
|
||||
{
|
||||
$descriptors = array();
|
||||
$descriptors[1] = array("file", $logdir . "/phraseanet_indexer_" . $this->get_task_id() . ".log", "a+");
|
||||
$descriptors[2] = array("file", $logdir . "/phraseanet_indexer_" . $this->get_task_id() . ".error.log", "a+");
|
||||
// $descriptors[1] = array("file", $logdir . "/phraseanet_indexer_" . $this->get_task_id() . ".log", "a+");
|
||||
// $descriptors[2] = array("file", $logdir . "/phraseanet_indexer_" . $this->get_task_id() . ".error.log", "a+");
|
||||
$descriptors[1] = array("file", $nullfile, "a+");
|
||||
$descriptors[2] = array("file", $nullfile, "a+");
|
||||
|
||||
$pipes = array();
|
||||
|
||||
$this->log(sprintf('cmd=\'%s\'', $cmd));
|
||||
$process = proc_open($cmd, $descriptors, $pipes, $this->binpath, null, array('bypass_shell' => true));
|
||||
$this->log(sprintf('cmd=\'%s %s\'', $cmd, implode(' ', $args)));
|
||||
$process = proc_open($cmd . ' ' . implode(' ', $args), $descriptors, $pipes, $this->binpath, null, array('bypass_shell' => true));
|
||||
|
||||
$pid = NULL;
|
||||
if(is_resource($process))
|
||||
@@ -439,11 +475,18 @@ class task_period_cindexer extends task_abstract
|
||||
{
|
||||
// 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'));
|
||||
$this->return_value = NULL; // NOT normal ending will enforce restart from scheduler
|
||||
}
|
||||
$this->running = false;
|
||||
}
|
||||
else
|
||||
@@ -476,8 +519,121 @@ class task_period_cindexer extends task_abstract
|
||||
|
||||
proc_terminate($process); // sigint
|
||||
proc_close($process);
|
||||
}
|
||||
elseif($this->method == self::METHOD_FORK)
|
||||
{
|
||||
$pid = pcntl_fork();
|
||||
if($pid == -1)
|
||||
{
|
||||
die("failed to fork");
|
||||
}
|
||||
elseif($pid == 0)
|
||||
{
|
||||
// child
|
||||
umask(0);
|
||||
// openlog('MyLog', LOG_PID | LOG_PERROR, LOG_LOCAL0);
|
||||
if(posix_setsid() < 0)
|
||||
die("Forked process could not detach from terminal\n");
|
||||
//chdir(dirname(__FILE__));
|
||||
fclose(STDIN);
|
||||
fclose(STDOUT);
|
||||
fclose(STDERR);
|
||||
$fdIN = fopen($nullfile, 'r');
|
||||
// $fdOUT = fopen($nullfile, 'a+');
|
||||
// $fdERR = fopen($nullfile, 'a+');
|
||||
$fdOUT = fopen($logdir . "/task_o_" . $this->get_task_id() . ".log", "a+");
|
||||
$fdERR = fopen($logdir . "/task_e_" . $this->get_task_id() . ".log", "a+");
|
||||
|
||||
return self::RETURNSTATUS_STOPPED;
|
||||
pcntl_exec($cmd, $args);
|
||||
|
||||
sleep(2);
|
||||
}
|
||||
else
|
||||
{
|
||||
// parent
|
||||
$this->running = true;
|
||||
|
||||
$sigsent = NULL;
|
||||
while($this->running)
|
||||
{
|
||||
// is the cindexer alive ?
|
||||
if(!posix_kill($pid, 0))
|
||||
{
|
||||
printf("%d \n", __LINE__);
|
||||
// dead...
|
||||
if($sigsent === NULL)
|
||||
{
|
||||
printf("%d \n", __LINE__);
|
||||
// but it's not my fault
|
||||
$this->log(_('task::cindexer:the cindexer crashed'));
|
||||
$this->running = false;
|
||||
// return self::RETURNSTATUS_STOPPED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printf("%d \n", __LINE__);
|
||||
$this->check_task_status();
|
||||
|
||||
if($this->task_status == self::STATUS_TOSTOP)
|
||||
{
|
||||
printf("%d \n", __LINE__);
|
||||
posix_kill($pid, ($sigsent=SIGINT));
|
||||
sleep(2);
|
||||
}
|
||||
|
||||
$status = NULL;
|
||||
if(pcntl_wait($status, WNOHANG) == $pid)
|
||||
{
|
||||
printf("%d \n", __LINE__);
|
||||
// child (indexer) has exited
|
||||
if($sigsent == SIGINT)
|
||||
{
|
||||
$this->log(_('task::cindexer:the cindexer clean-quit'));
|
||||
}
|
||||
elseif($sigsent == SIGKILL)
|
||||
{
|
||||
$this->log(_('task::cindexer:the cindexer has been killed'));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->log(_('task::cindexer:the cindexer crashed'));
|
||||
$this->return_value = NULL; // NOT normal ending will enforce restart from scheduler
|
||||
}
|
||||
$this->running = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("%d \n", __LINE__);
|
||||
if($sigsent == SIGINT && time() > $timetokill)
|
||||
{
|
||||
printf("%d \n", __LINE__);
|
||||
// must kill cindexer
|
||||
$this->log(_('task::cindexer:killing the cindexer'));
|
||||
$qsent = 'K';
|
||||
posix_kill($pid, ($sigsent=SIGKILL));
|
||||
}
|
||||
sleep(2);
|
||||
}
|
||||
} // while running (method fork)
|
||||
}
|
||||
}
|
||||
elseif($this->method == self::METHOD_EXEC)
|
||||
{
|
||||
umask(0);
|
||||
fclose(STDIN);
|
||||
fclose(STDOUT);
|
||||
fclose(STDERR);
|
||||
$fdIN = fopen($nullfile, 'r');
|
||||
$fdOUT = fopen($logdir . "/task_o_" . $this->get_task_id() . ".log", "a+");
|
||||
$fdERR = fopen($logdir . "/task_e_" . $this->get_task_id() . ".log", "a+");
|
||||
|
||||
pcntl_exec($cmd, $args);
|
||||
|
||||
sleep(2);
|
||||
}
|
||||
|
||||
return($this->return_value);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -551,7 +551,8 @@ class task_period_outofdate extends task_abstract
|
||||
if(!$conn->ping())
|
||||
{
|
||||
$this->log(("Warning : abox connection lost, restarting in 10 min."));
|
||||
sleep(60 * 10);
|
||||
for($i=0; $i<60 * 10; $i++)
|
||||
sleep(1);
|
||||
$this->running = false;
|
||||
|
||||
return(self::RETURNSTATUS_TORESTART);
|
||||
@@ -566,13 +567,13 @@ class task_period_outofdate extends task_abstract
|
||||
catch(Exception $e)
|
||||
{
|
||||
$this->log(("dbox connection lost, restarting in 10 min."));
|
||||
sleep(60 * 10);
|
||||
for($i=0; $i<60 * 10; $i++)
|
||||
sleep(1);
|
||||
$this->running = false;
|
||||
|
||||
return(self::RETURNSTATUS_TORESTART);
|
||||
}
|
||||
|
||||
|
||||
$this->set_last_exec_time();
|
||||
|
||||
$databox = databox::get_instance($this->sbas_id);
|
||||
@@ -670,15 +671,28 @@ class task_period_outofdate extends task_abstract
|
||||
|
||||
$nchanged = 0;
|
||||
foreach($tsql as $xsql)
|
||||
{
|
||||
try
|
||||
{
|
||||
$stmt = $this->connbas->prepare($xsql['sql']);
|
||||
$stmt->execute($xsql['params']);
|
||||
if($stmt->execute($xsql['params']))
|
||||
{
|
||||
$n = $stmt->rowCount();
|
||||
$stmt->closeCursor();
|
||||
|
||||
$nchanged += $n;
|
||||
if($n > 0)
|
||||
$this->log(sprintf(("SQL=%s\n - %s changes"), $xsql['sql'], $n));
|
||||
$this->log(sprintf("SQL='%s' ; parms=%s - %s changes", $xsql['sql'], var_export($xsql['params']), $n));
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->log(sprintf("ERROR SQL='%s' ; parms=%s", $xsql['sql'], var_export($xsql['params'], true)));
|
||||
}
|
||||
}
|
||||
catch (ErrorException $e)
|
||||
{
|
||||
$this->log(sprintf("ERROR SQL='%s' ; parms=%s", $xsql['sql'], var_export($xsql['params'], true)));
|
||||
}
|
||||
}
|
||||
|
||||
$ret = ($nchanged > 0 ? $nchanged : 'NORECSTODO');
|
||||
@@ -686,228 +700,6 @@ class task_period_outofdate extends task_abstract
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
function doRecords()
|
||||
{
|
||||
$ndone = 0;
|
||||
$ret = 'NORECSTODO';
|
||||
|
||||
$date1 = $date2 = NULL;
|
||||
$field1 = $field2 = '';
|
||||
|
||||
// test : DATE 1
|
||||
if(($field1 = trim($this->sxTaskSettings->field1)) != '')
|
||||
{
|
||||
$date1 = time();
|
||||
if(($delta = (int) ($this->sxTaskSettings->fieldDv1)) > 0)
|
||||
{
|
||||
if($this->sxTaskSettings->fieldDs1 == '-')
|
||||
$date1 += 86400 * $delta;
|
||||
else
|
||||
$date1 -= 86400 * $delta;
|
||||
}
|
||||
$date1 = date("YmdHis", $date1);
|
||||
}
|
||||
// test : DATE 2
|
||||
if(($field2 = trim($this->sxTaskSettings->field2)) != '')
|
||||
{
|
||||
$date2 = time();
|
||||
if(($delta = (int) ($this->sxTaskSettings->fieldDv2)) > 0)
|
||||
{
|
||||
if($this->sxTaskSettings->fieldDs2 == '-')
|
||||
$date2 += 86400 * $delta;
|
||||
else
|
||||
$date2 -= 86400 * $delta;
|
||||
}
|
||||
$date2 = date("YmdHis", $date2);
|
||||
}
|
||||
|
||||
|
||||
$sqlset = $params = $tmp_params = array();
|
||||
for($i = 0; $i <= 2; $i++)
|
||||
{
|
||||
$sqlwhere[$i] = '';
|
||||
$sqlset[$i] = '';
|
||||
$x = 'status' . $i;
|
||||
@list($tostat, $statval) = explode('_', (string) ($this->sxTaskSettings->{$x}));
|
||||
if($tostat >= 4 && $tostat <= 63)
|
||||
{
|
||||
if($statval == '0')
|
||||
{
|
||||
$sqlset[$i] = 'status=status & ~(1<<' . $tostat . ')';
|
||||
$sqlwhere[$i] .= '(status & (1<<' . $tostat . ') = 0)';
|
||||
}
|
||||
elseif($statval == '1')
|
||||
{
|
||||
$sqlset[$i] = 'status=status|(1<<' . $tostat . ')';
|
||||
$sqlwhere[$i] .= '(status & (1<<' . $tostat . ') != 0)';
|
||||
}
|
||||
}
|
||||
$x = 'coll' . $i;
|
||||
if(($tocoll = (string) ($this->sxTaskSettings->{$x})) != '')
|
||||
{
|
||||
$sqlset[$i] .= ( $sqlset[$i] ? ', ' : '') . ('coll_id = :coll_id_set' . $i);
|
||||
$sqlwhere[$i] .= ( $sqlwhere[$i] ? ' AND ' : '') . '(coll_id = :coll_id_where' . $i . ')';
|
||||
$tmp_params[':coll_id_set' . $i] = $tocoll;
|
||||
$tmp_params[':coll_id_where' . $i] = $tocoll;
|
||||
}
|
||||
}
|
||||
for($i = 0; $i <= 2; $i++)
|
||||
{
|
||||
// if(!$sqlwhere[$i])
|
||||
// $sqlwhere[$i] = '1';
|
||||
}
|
||||
|
||||
$nchanged = 0;
|
||||
// $sqlupd = 'UPDATE record INNER JOIN prop ON prop.record_id=record.record_id';
|
||||
|
||||
if($date1)
|
||||
{
|
||||
$params = array();
|
||||
$params[':name1'] = $field1;
|
||||
$params[':date1'] = $date1;
|
||||
$params[':coll_id_set0'] = $tmp_params[':coll_id_set0'];
|
||||
|
||||
$w = 'p1.name = :name1 AND :date1 <= p1.value';
|
||||
if($sqlwhere[1] && $sqlwhere[2])
|
||||
{
|
||||
$w .= ' AND ((' . $sqlwhere[1] . ') OR (' . $sqlwhere[2] . '))';
|
||||
$params[':coll_id_where1'] = $tmp_params[':coll_id_where1'];
|
||||
$params[':coll_id_where2'] = $tmp_params[':coll_id_where2'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if($sqlwhere[1])
|
||||
{
|
||||
$w .= ' AND ' . $sqlwhere[1];
|
||||
$params[':coll_id_where1'] = $tmp_params[':coll_id_where1'];
|
||||
}
|
||||
elseif($sqlwhere[2])
|
||||
{
|
||||
$w .= ' AND ' . $sqlwhere[2];
|
||||
$params[':coll_id_where2'] = $tmp_params[':coll_id_where2'];
|
||||
}
|
||||
}
|
||||
|
||||
$sql = "UPDATE prop AS p1 INNER JOIN record USING(record_id)
|
||||
SET " . $sqlset[0] .
|
||||
" WHERE " . $w;
|
||||
printf("%d : %s \n%s", __LINE__, $sql, var_export($params, true));
|
||||
|
||||
$stmt = $this->connbas->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$n = $stmt->rowCount();
|
||||
$stmt->closeCursor();
|
||||
|
||||
$nchanged += $n;
|
||||
if($n > 0)
|
||||
$this->log(sprintf(("SQL=%s\n - %s changes"), $sql, $n));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if($date2 && $date1)
|
||||
{
|
||||
$params = array();
|
||||
$params[':name1'] = $field1;
|
||||
$params[':name2'] = $field2;
|
||||
$params[':date1'] = $date1;
|
||||
$params[':date2'] = $date2;
|
||||
$params[':coll_id_set1'] = $tmp_params[':coll_id_set1'];
|
||||
|
||||
$w = 'p1.name = :name1 AND p2.name = :name2 AND :date1 > p1.value AND :date2 <= p2.value';
|
||||
if($sqlwhere[0] && $sqlwhere[2])
|
||||
{
|
||||
$w .= ' AND ((' . $sqlwhere[0] . ') OR (' . $sqlwhere[2] . '))';
|
||||
$params[':coll_id_where0'] = $tmp_params[':coll_id_where0'];
|
||||
$params[':coll_id_where2'] = $tmp_params[':coll_id_where2'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if($sqlwhere[0])
|
||||
{
|
||||
$w .= ' AND ' . $sqlwhere[0];
|
||||
$params[':coll_id_where0'] = $tmp_params[':coll_id_where0'];
|
||||
}
|
||||
elseif($sqlwhere[2])
|
||||
{
|
||||
$w .= ' AND ' . $sqlwhere[2];
|
||||
$params[':coll_id_where2'] = $tmp_params[':coll_id_where2'];
|
||||
}
|
||||
}
|
||||
|
||||
$sql = "UPDATE (prop AS p1 INNER JOIN prop AS p2 USING(record_id))
|
||||
INNER JOIN record USING(record_id)
|
||||
SET " . $sqlset[1] .
|
||||
" WHERE " . $w;
|
||||
printf("%d : %s \n%s", __LINE__, $sql, var_export($params, true));
|
||||
|
||||
$stmt = $this->connbas->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$n = $stmt->rowCount();
|
||||
$stmt->closeCursor();
|
||||
|
||||
$nchanged += $n;
|
||||
if($n > 0)
|
||||
$this->log(sprintf(("SQL=%s\n - %s changes"), $sql, $n));
|
||||
}
|
||||
|
||||
|
||||
|
||||
if($date2)
|
||||
{
|
||||
$params = array();
|
||||
$params[':name2'] = $field2;
|
||||
$params[':date2'] = $date2;
|
||||
$params[':coll_id_set2'] = $tmp_params[':coll_id_set2'];
|
||||
|
||||
$w = 'p2.name = :name2 AND :date2 > p2.value';
|
||||
if($sqlwhere[0] && $sqlwhere[1])
|
||||
{
|
||||
$w .= ' AND ((' . $sqlwhere[0] . ') OR (' . $sqlwhere[2] . '))';
|
||||
$params[':coll_id_where0'] = $tmp_params[':coll_id_where0'];
|
||||
$params[':coll_id_where1'] = $tmp_params[':coll_id_where1'];
|
||||
}
|
||||
else
|
||||
{
|
||||
if($sqlwhere[0])
|
||||
{
|
||||
$w .= ' AND ' . $sqlwhere[0];
|
||||
$params[':coll_id_where0'] = $tmp_params[':coll_id_where0'];
|
||||
}
|
||||
elseif($sqlwhere[1])
|
||||
{
|
||||
$w .= ' AND ' . $sqlwhere[1];
|
||||
$params[':coll_id_where1'] = $tmp_params[':coll_id_where1'];
|
||||
}
|
||||
}
|
||||
|
||||
$sql = "UPDATE prop AS p2 INNER JOIN record USING(record_id)
|
||||
SET " . $sqlset[2] .
|
||||
" WHERE " . $w;
|
||||
|
||||
printf("%d : %s \n%s", __LINE__, $sql, var_export($params, true));
|
||||
|
||||
$stmt = $this->connbas->prepare($sql);
|
||||
$stmt->execute($params);
|
||||
$n = $stmt->rowCount();
|
||||
$stmt->closeCursor();
|
||||
|
||||
$nchanged += $n;
|
||||
if($n > 0)
|
||||
$this->log(sprintf(("SQL=%s\n - %s changes"), $sql, $n));
|
||||
}
|
||||
|
||||
$ret = ($nchanged > 0 ? $nchanged : 'NORECSTODO');
|
||||
|
||||
return($ret);
|
||||
}
|
||||
*/
|
||||
|
||||
private function calcSQL($sxTaskSettings)
|
||||
{
|
||||
$ret = array();
|
||||
@@ -1006,24 +798,11 @@ class task_period_outofdate extends task_abstract
|
||||
$sql = "UPDATE prop AS p1 INNER JOIN record USING(record_id)
|
||||
SET " . $sqlset[0] .
|
||||
" WHERE " . $w;
|
||||
// printf("%d : %s \n%s", __LINE__, $sql, var_export($params, true));
|
||||
|
||||
$ret[] = array('sql'=>$sql, 'params'=>$params);
|
||||
|
||||
// $stmt = $this->connbas->prepare($sql);
|
||||
// $stmt->execute($params);
|
||||
// $n = $stmt->rowCount();
|
||||
// $stmt->closeCursor();
|
||||
//
|
||||
// $nchanged += $n;
|
||||
// if($n > 0)
|
||||
// $this->log(sprintf(("SQL=%s\n - %s changes"), $sql, $n));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if($date1 && $date2)
|
||||
{
|
||||
$params = array();
|
||||
@@ -1058,22 +837,11 @@ class task_period_outofdate extends task_abstract
|
||||
INNER JOIN record USING(record_id)
|
||||
SET " . $sqlset[1] .
|
||||
" WHERE " . $w;
|
||||
// printf("%d : %s \n%s", __LINE__, $sql, var_export($params, true));
|
||||
|
||||
$ret[] = array('sql'=>$sql, 'params'=>$params);
|
||||
|
||||
// $stmt = $this->connbas->prepare($sql);
|
||||
// $stmt->execute($params);
|
||||
// $n = $stmt->rowCount();
|
||||
// $stmt->closeCursor();
|
||||
//
|
||||
// $nchanged += $n;
|
||||
// if($n > 0)
|
||||
// $this->log(sprintf(("SQL=%s\n - %s changes"), $sql, $n));
|
||||
}
|
||||
|
||||
|
||||
|
||||
if($date2 && $sqlset[2])
|
||||
{
|
||||
$params = array();
|
||||
@@ -1084,7 +852,7 @@ class task_period_outofdate extends task_abstract
|
||||
$w = 'p2.name = :name2 AND :date2 > p2.value';
|
||||
if($sqlwhere[0] && $sqlwhere[1])
|
||||
{
|
||||
$w .= ' AND ((' . $sqlwhere[0] . ') OR (' . $sqlwhere[2] . '))';
|
||||
$w .= ' AND ((' . $sqlwhere[0] . ') OR (' . $sqlwhere[1] . '))';
|
||||
$params[':coll_id_where0'] = $tmp_params[':coll_id_where0'];
|
||||
$params[':coll_id_where1'] = $tmp_params[':coll_id_where1'];
|
||||
}
|
||||
@@ -1106,121 +874,13 @@ class task_period_outofdate extends task_abstract
|
||||
SET " . $sqlset[2] .
|
||||
" WHERE " . $w;
|
||||
|
||||
// printf("%d : %s \n%s", __LINE__, $sql, var_export($params, true));
|
||||
|
||||
$ret[] = array('sql'=>$sql, 'params'=>$params);
|
||||
|
||||
// $stmt = $this->connbas->prepare($sql);
|
||||
// $stmt->execute($params);
|
||||
// $n = $stmt->rowCount();
|
||||
// $stmt->closeCursor();
|
||||
//
|
||||
// $nchanged += $n;
|
||||
// if($n > 0)
|
||||
// $this->log(sprintf(("SQL=%s\n - %s changes"), $sql, $n));
|
||||
}
|
||||
|
||||
return($ret);
|
||||
}
|
||||
|
||||
private function no_calcSQL($sxTaskSettings)
|
||||
{
|
||||
$ret = array();
|
||||
|
||||
$date1 = $date2 = time();
|
||||
$field1 = $field2 = '';
|
||||
|
||||
// test : DATE 1
|
||||
if(($field1 = trim($sxTaskSettings->field1)) != '')
|
||||
{
|
||||
if(($delta = (int) ($sxTaskSettings->fieldDv1)) > 0)
|
||||
{
|
||||
if($sxTaskSettings->fieldDs1 == '-')
|
||||
$date1 += 86400 * $delta;
|
||||
else
|
||||
$date1 -= 86400 * $delta;
|
||||
}
|
||||
}
|
||||
// test : DATE 2
|
||||
if(($field2 = trim($sxTaskSettings->field2)) != '')
|
||||
{
|
||||
if(($delta = (int) ($sxTaskSettings->fieldDv2)) > 0)
|
||||
{
|
||||
if($sxTaskSettings->fieldDs2 == '-')
|
||||
$date2 += 86400 * $delta;
|
||||
else
|
||||
$date2 -= 86400 * $delta;
|
||||
}
|
||||
}
|
||||
|
||||
$date1 = date("YmdHis", $date1);
|
||||
$date2 = date("YmdHis", $date2);
|
||||
|
||||
$sqlset = array();
|
||||
for($i = 0; $i <= 2; $i++)
|
||||
{
|
||||
$sqlset[$i] = '';
|
||||
$x = 'status' . $i;
|
||||
@list($tostat, $statval) = explode('_', (string) ($sxTaskSettings->{$x}));
|
||||
if($tostat >= 4 && $tostat <= 63)
|
||||
{
|
||||
if($statval == '0')
|
||||
$sqlset[$i] = 'status=status&~(1<<' . $tostat . ')';
|
||||
elseif($statval == '1')
|
||||
$sqlset[$i] = 'status=status|(1<<' . $tostat . ')';
|
||||
}
|
||||
$x = 'coll' . $i;
|
||||
if(($tocoll = (string) ($sxTaskSettings->{$x})) != '')
|
||||
$sqlset[$i] .= ($sqlset[$i] ? ', ' : '') . ('coll_id=\'' . $tocoll . '\'');
|
||||
}
|
||||
|
||||
// $sqlupd = 'UPDATE record INNER JOIN prop ON prop.record_id=record.record_id';
|
||||
|
||||
if($sqlset[0] && $field1)
|
||||
{
|
||||
$sql = 'UPDATE prop AS p1 INNER JOIN record USING(record_id)' .
|
||||
' SET ' . $sqlset[0] .
|
||||
' WHERE p1.name=\'' . $field1 . '\' AND \'' . $date1 . '\'<=p1.value';
|
||||
$ret[] = $sql;
|
||||
}
|
||||
|
||||
if($sqlset[1])
|
||||
{
|
||||
if($field1 && $field2)
|
||||
{
|
||||
$sql = 'UPDATE (prop AS p1 INNER JOIN prop AS p2 USING(record_id))' .
|
||||
' INNER JOIN record USING(record_id)' .
|
||||
' SET ' . $sqlset[1] .
|
||||
' WHERE (p1.name=\'' . $field1 . '\' AND \'' . $date1 . '\'>p1.value)' .
|
||||
' AND (p2.name=\'' . $field2 . '\' AND \'' . $date2 . '\'<=p2.value)';
|
||||
$ret[] = $sql;
|
||||
}
|
||||
elseif($field1)
|
||||
{
|
||||
$sql = 'UPDATE prop AS p1 INNER JOIN record USING(record_id)' .
|
||||
' SET ' . $sqlset[1] .
|
||||
' WHERE p1.name=\'' . $field1 . '\' AND \'' . $date1 . '\'>p1.value';
|
||||
$ret[] = $sql;
|
||||
}
|
||||
elseif($field2)
|
||||
{
|
||||
$sql = 'UPDATE prop AS p2 INNER JOIN record USING(record_id)' .
|
||||
' SET ' . $sqlset[1] .
|
||||
' WHERE p2.name=\'' . $field2 . '\' AND \'' . $date2 . '\'<=p2.value';
|
||||
$ret[] = $sql;
|
||||
}
|
||||
}
|
||||
|
||||
if($sqlset[2] && $field2)
|
||||
{
|
||||
$sql = 'UPDATE prop AS p2 INNER JOIN record USING(record_id)' .
|
||||
' SET ' . $sqlset[2] .
|
||||
' WHERE p2.name=\'' . $field2 . '\' AND \'' . $date2 . '\'>p2.value';
|
||||
$ret[] = $sql;
|
||||
}
|
||||
|
||||
return($ret);
|
||||
}
|
||||
|
||||
public function facility()
|
||||
{
|
||||
@@ -1232,9 +892,6 @@ class task_period_outofdate extends task_abstract
|
||||
);
|
||||
|
||||
phrasea::headers(200, true, 'application/json', 'UTF-8', false);
|
||||
// return("hello4");
|
||||
//var_dump($parm2);
|
||||
//return;
|
||||
$ret = NULL;
|
||||
switch($parm2['ACT'])
|
||||
{
|
||||
@@ -1281,6 +938,6 @@ class task_period_outofdate extends task_abstract
|
||||
}
|
||||
print(json_encode($ret));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
@@ -107,21 +107,26 @@ switch ($parm['action'])
|
||||
break;
|
||||
|
||||
case 'SETTASKSTATUS':
|
||||
$parm = $request->get_parms("task_id", "status");
|
||||
$parm = $request->get_parms('task_id', 'status', 'signal');
|
||||
try
|
||||
{
|
||||
$task_manager = new task_manager($appbox);
|
||||
$task = $task_manager->get_task($parm['task_id']);
|
||||
$pid = (int)($task->get_pid());
|
||||
$task->set_status($parm["status"]);
|
||||
$signal = (int)($parm['signal']);
|
||||
if( $signal > 0 && $pid )
|
||||
posix_kill($pid, $signal);
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
|
||||
}
|
||||
$output = json_encode($pid);
|
||||
break;
|
||||
|
||||
case 'SETSCHEDSTATUS':
|
||||
$parm = $request->get_parms('status');
|
||||
$parm = $request->get_parms('status', 'signal');
|
||||
try
|
||||
{
|
||||
$task_manager = new task_manager($appbox);
|
||||
@@ -132,13 +137,6 @@ switch ($parm['action'])
|
||||
{
|
||||
|
||||
}
|
||||
$ret = new DOMDocument("1.0", "UTF-8");
|
||||
$ret->standalone = true;
|
||||
$ret->preserveWhiteSpace = false;
|
||||
$root = $ret->appendChild($ret->createElement("result"));
|
||||
$root->appendChild($ret->createCDATASection(var_export($parm, true)));
|
||||
|
||||
$output = $ret->saveXML();
|
||||
break;
|
||||
|
||||
case 'RESETTASKCRASHCOUNTER':
|
||||
@@ -267,7 +265,6 @@ switch ($parm['action'])
|
||||
$ret['tasks'] = array();
|
||||
foreach ($task_manager->get_tasks(true) as $task)
|
||||
{
|
||||
// var_dump($task);
|
||||
$_t = array(
|
||||
'id'=>$task->get_task_id()
|
||||
, 'pid' =>$task->get_pid()
|
||||
@@ -278,8 +275,22 @@ switch ($parm['action'])
|
||||
$ret['tasks'][$_t['id']] = $_t;
|
||||
}
|
||||
|
||||
$output = json_encode($ret);
|
||||
if(1)
|
||||
{
|
||||
$sql = 'SHOW PROCESSLIST';
|
||||
$stmt = $appbox->get_connection()->prepare($sql);
|
||||
$stmt->execute();
|
||||
$rows = $stmt->fetchALL(PDO::FETCH_ASSOC);
|
||||
$stmt->closeCursor();
|
||||
$ret['db_processlist'] = array();
|
||||
foreach($rows as $row)
|
||||
{
|
||||
if($row['Info'] != $sql)
|
||||
$ret['db_processlist'][] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
$output = json_encode($ret);
|
||||
break;
|
||||
|
||||
case 'UNMOUNTBASE':
|
||||
|
@@ -15,6 +15,7 @@
|
||||
* @license http://opensource.org/licenses/gpl-3.0 GPLv3
|
||||
* @link www.phraseanet.com
|
||||
*/
|
||||
|
||||
require_once dirname(__FILE__) . "/../../lib/bootstrap.php";
|
||||
|
||||
$appbox = appbox::get_instance();
|
||||
@@ -52,31 +53,35 @@ $logdir = p4string::addEndSlash($registry->get('GV_RootPath') . 'logs');
|
||||
|
||||
$phpcli = $registry->get('GV_cli');
|
||||
|
||||
$nullfile = '';
|
||||
switch ($system)
|
||||
{
|
||||
case "DARWIN":
|
||||
$cmd = $phpcli . ' -f ' . $registry->get('GV_RootPath') . "bin/console scheduler:start";
|
||||
$nullfile = '/dev/null';
|
||||
break;
|
||||
case "LINUX":
|
||||
$cmd = $phpcli . ' -f ' . $registry->get('GV_RootPath') . "bin/console scheduler:start";
|
||||
$nullfile = '/dev/null';
|
||||
break;
|
||||
case "WINDOWS":
|
||||
case "WINDOWS NT":
|
||||
$cmd = $phpcli . ' -f ' . $registry->get('GV_RootPath') . "bin/console scheduler:start";
|
||||
$nullfile = 'NUL';
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if ($logdir)
|
||||
{
|
||||
$descriptors[1] = array("file", $logdir . "scheduler.log", "a+");
|
||||
$descriptors[2] = array("file", $logdir . "scheduler.error.log", "a+");
|
||||
}
|
||||
else
|
||||
{
|
||||
$descriptors[1] = array("file", "NUL", "a+");
|
||||
$descriptors[2] = array("file", "NUL", "a+");
|
||||
}
|
||||
//if ($logdir)
|
||||
//{
|
||||
// $descriptors[1] = array("file", $logdir . "scheduler.log", "a+");
|
||||
// $descriptors[2] = array("file", $logdir . "scheduler.error.log", "a+");
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
$descriptors[1] = array("file", $nullfile, "a+");
|
||||
$descriptors[2] = array("file", $nullfile, "a+");
|
||||
//}
|
||||
|
||||
$pipes = null;
|
||||
$cwd = $registry->get('GV_RootPath') . "bin/";
|
||||
|
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of Phraseanet
|
||||
*
|
||||
@@ -20,30 +19,74 @@ $appbox = appbox::get_instance();
|
||||
$session = $appbox->get_session();
|
||||
|
||||
$request = http_request::getInstance();
|
||||
$parm = $request->get_parms('fil', 'act');
|
||||
|
||||
$parm = $request->get_parms('fil', 'log', 'id', 'act');
|
||||
?>
|
||||
<html lang="<?php echo($session->get_I18n()); ?>">
|
||||
<head>
|
||||
<style>
|
||||
* {font-family: monospace}
|
||||
BODY {margin: 0px; padding: 0px}
|
||||
H1 { font-size: 18px; background-color:#CCCCCC; padding: 0px}
|
||||
A { padding: 3px; color: #000000 }
|
||||
A.current {background-color: #ffffff}
|
||||
PRE {padding-left: 3px; padding-right: 3px}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>
|
||||
logfile :
|
||||
<?php
|
||||
foreach(array('l' => 'log', 'o' => 'stdout', 'e' => 'stderr') as $k => $v)
|
||||
{
|
||||
$cls = '';
|
||||
if($k == $parm['log'])
|
||||
$cls = 'current';
|
||||
printf("<a class=\"%s\" href=\"/admin/showlogtask.php?fil=%s&log=%s&id=%s\">(%s)</a>\n"
|
||||
, $cls
|
||||
, urlencode($parm['fil'])
|
||||
, urlencode($k)
|
||||
, urlencode($parm['id'])
|
||||
, $v);
|
||||
}
|
||||
?>
|
||||
</h1>
|
||||
<?php
|
||||
$registry = $appbox->get_registry();
|
||||
$logdir = p4string::addEndSlash($registry->get('GV_RootPath') . 'logs');
|
||||
$logfile = $logdir . $parm['fil'];
|
||||
if($parm['log'])
|
||||
$logfile .= '_' . $parm['log'];
|
||||
if($parm['id'])
|
||||
$logfile .= '_' . $parm['id'];
|
||||
$logfile .= '.log';
|
||||
|
||||
if(file_exists($logfile))
|
||||
{
|
||||
if($parm['act'] == 'CLR')
|
||||
{
|
||||
file_put_contents($logfile, '');
|
||||
|
||||
return phrasea::redirect("/admin/showlogtask.php?fil=" . urlencode($parm['fil']));
|
||||
return phrasea::redirect(sprintf("/admin/showlogtask.php?fil=%s&log=%s&id=%s"
|
||||
, urlencode($parm['fil'])
|
||||
, urlencode($parm['log'])
|
||||
, urlencode($parm['id']))
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("<html lang=\"" . $session->get_I18n() . "\"><body><h4>%s <a href=\"showlogtask.php?fil=%s&act=CLR\">effacer</a></h4>\n", $logfile, urlencode($parm['fil']));
|
||||
print("<pre>\n");
|
||||
printf("<h4>%s\n", $logfile);
|
||||
printf(" <a href=\"/admin/showlogtask.php?fil=%s&log=%s&id=%s&act=CLR\">effacer</a>\n"
|
||||
, urlencode($parm['fil'])
|
||||
, urlencode($parm['log'])
|
||||
, urlencode($parm['id']));
|
||||
print("</h4>\n<pre>\n");
|
||||
print(htmlentities(file_get_contents($logfile)));
|
||||
print("</pre>\n</body></html>");
|
||||
print("</pre>\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("file <b>%s</b> does not exists\n", $logfile);
|
||||
printf("<h4>file <b>%s</b> does not exists</h4>\n", $logfile);
|
||||
}
|
||||
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -30,12 +30,32 @@ if(!$user->ACL()->has_right('taskmanager'))
|
||||
|
||||
phrasea::headers();
|
||||
$registry = $appbox->get_registry();
|
||||
|
||||
$task_manager = new task_manager($appbox);
|
||||
|
||||
$refresh_tasklist = false;
|
||||
if($parm["act"] == "DELETETASK")
|
||||
{
|
||||
try
|
||||
{
|
||||
$task = $task_manager->get_task($parm['tid']);
|
||||
$task->delete();
|
||||
$refresh_tasklist = true;
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
<html lang="<?php echo $session->get_I18n(); ?>">
|
||||
<head>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="/include/minify/f=skins/common/main.css,skins/admin/admincolor.css" />
|
||||
<link rel="stylesheet" href="/include/minify/f=include/jslibs/jquery.contextmenu.css,include/jslibs/jquery-ui-1.8.12/css/ui-lightness/jquery-ui-1.8.12.custom.css" type="text/css" media="screen" />
|
||||
<style>
|
||||
.divTop
|
||||
{
|
||||
@@ -45,10 +65,38 @@ $task_manager = new task_manager($appbox);
|
||||
#redbox0 table{
|
||||
font-size:10px;
|
||||
text-align:center;
|
||||
table-layout: fixed;
|
||||
}
|
||||
table.task_manager {
|
||||
border: 1px solid #e0e0e0;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
}
|
||||
table.task_manager tr {
|
||||
height:auto;
|
||||
}
|
||||
table.task_manager th, table.task_manager td {
|
||||
height:auto;
|
||||
padding: 2px;
|
||||
margin: 0px;
|
||||
border: 1px solid #e0e0e0;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
#db_processlist table {
|
||||
border: 1px solid #e0e0e0;
|
||||
border-collapse: collapse;
|
||||
table-layout: fixed;
|
||||
}
|
||||
#db_processlist table th, table td {
|
||||
height:auto;
|
||||
padding: 2px;
|
||||
margin: 0px;
|
||||
border: 1px solid #e0e0e0;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
</style>
|
||||
<link rel="stylesheet" href="/include/minify/f=include/jslibs/jquery.contextmenu.css,include/jslibs/jquery-ui-1.8.12/css/ui-lightness/jquery-ui-1.8.12.custom.css" type="text/css" media="screen" />
|
||||
<script type="text/javascript" src="/include/minify/f=include/jslibs/jquery-1.5.2.js,include/jslibs/jquery-ui-1.8.12/development-bundle/ui/i18n/jquery-ui-i18n.js,include/jslibs/jquery.contextmenu.js"></script>
|
||||
<script type="text/javascript" src="/include/jslibs/jquery-ui-1.8.12/js/jquery-ui-1.8.12.custom.min.js"></script>
|
||||
<script type="text/javascript">
|
||||
@@ -67,8 +115,6 @@ $task_manager = new task_manager($appbox);
|
||||
$("#redbox1").width = ($("#tableau_center").width()-4);
|
||||
}
|
||||
|
||||
|
||||
|
||||
function newTask(tclass)
|
||||
{
|
||||
document.forms["task"].target = "";
|
||||
@@ -88,7 +134,7 @@ $task_manager = new task_manager($appbox);
|
||||
setSchedStatus('tostop');
|
||||
break;
|
||||
case "log":
|
||||
window.open("/admin/showlogtask.php?fil=<?php echo urlencode('scheduler.log') ?>", "SCHEDLOG");
|
||||
window.open("/admin/showlogtask.php?fil=scheduler&log=l", "scheduler.log");
|
||||
break;
|
||||
case "preferences":
|
||||
preferencesScheduler();
|
||||
@@ -96,7 +142,6 @@ $task_manager = new task_manager($appbox);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function doMenuTask(context, act)
|
||||
{
|
||||
var tid = $(context).parent().attr('id').split('_').pop();
|
||||
@@ -107,47 +152,12 @@ $task_manager = new task_manager($appbox);
|
||||
editTask(tid);
|
||||
break;
|
||||
case "start":
|
||||
setTaskStatus(tid, 'tostart', true); // true : reset crash counter
|
||||
setTaskStatus(tid, 'tostart', null, true); // null:no signal, true : reset crash counter
|
||||
break;
|
||||
case "stop":
|
||||
setTaskStatus(tid, 'tostop', false);
|
||||
setTaskStatus(tid, 'tostop', 15, false); // 15 = SIGTERM
|
||||
break;
|
||||
/*
|
||||
case "fix":
|
||||
switch(T_task[tid])
|
||||
{
|
||||
case "started_0":
|
||||
case "starting_0":
|
||||
case "stopping_0":
|
||||
case "tostart_0":
|
||||
case "tostop_0":
|
||||
case "manual_0":
|
||||
setTaskStatus(tid, 'stopped');
|
||||
break;
|
||||
|
||||
case "stopped_1":
|
||||
case "starting_1":
|
||||
case "stopping_1":
|
||||
case "tostart_1":
|
||||
case "tostop_1":
|
||||
// case "manual_1":
|
||||
// case "torestart_1":
|
||||
setTaskStatus(tid, 'started');
|
||||
break;
|
||||
}
|
||||
break;
|
||||
*/
|
||||
case 'delete':
|
||||
switch(T_task[tid])
|
||||
{
|
||||
case "stopped_0":
|
||||
case "started_0":
|
||||
case "starting_0":
|
||||
case "stopping_0":
|
||||
case "tostart_0":
|
||||
case "tostop_0":
|
||||
case "manual_0":
|
||||
case "torestart_0":
|
||||
if(confirm("<?php echo p4string::MakeString(_('admin::tasks: supprimer la tache ?'), 'js', '"') ?>"))
|
||||
{
|
||||
document.forms["taskManager"].target = "";
|
||||
@@ -156,10 +166,8 @@ $task_manager = new task_manager($appbox);
|
||||
document.forms["taskManager"].submit();
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case "log":
|
||||
window.open("/admin/showlogtask.php?fil=<?php echo urlencode('task_t_') ?>"+tid+"%2Elog", "TASKLOG_"+tid);
|
||||
window.open("/admin/showlogtask.php?fil=task&id="+tid+"&log=l", "task_"+tid+".log");
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -368,40 +376,24 @@ foreach($tasks as $t)
|
||||
|
||||
|
||||
<?php
|
||||
if($parm["act"] == "DELETETASK")
|
||||
{
|
||||
try
|
||||
{
|
||||
$task = $task_manager->get_task($parm['tid']);
|
||||
$task->delete();
|
||||
}
|
||||
catch(Exception $e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
||||
<iframe id="zsched" src="about:blank" style="position:absolute; top:0px; left:0px; width:50px; height:50px; visibility:hidden"></iframe>
|
||||
|
||||
<h1><?php echo _('admin::tasks: planificateur de taches') ?></h1>
|
||||
|
||||
<form method="post" name="taskManager" action="/admin/taskmanager.php" target="???" onsubmit="return(false);" >
|
||||
<input type="hidden" name="act" value="" />
|
||||
<input type="hidden" name="tid" value="" />
|
||||
<input type="hidden" name="att" value="" />
|
||||
</form>
|
||||
<p>
|
||||
<h1><?php echo _('admin::tasks: planificateur de taches') ?>
|
||||
<span style="font-size:12px;">
|
||||
<?php echo sprintf(_('Last update at %s.'), '<span id="pingTime"></span>'); ?>
|
||||
<a id="newTaskButton" href="#"><?php echo _('admin::tasks: Nouvelle tache') ?></a>
|
||||
</p>
|
||||
</span>
|
||||
</h1>
|
||||
|
||||
<table class="admintable task_manager" cellpadding="0" cellSpacing="0">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width:20px;"></th>
|
||||
<th style="width:40px;">ID</th>
|
||||
<th style="width:80px;"><?php echo _('admin::tasks: statut de la tache') ?></th>
|
||||
<th style="width:60px;"><?php echo _('admin::tasks: process_id de la tache') ?></th>
|
||||
<th style="width:120px;"><?php echo _('admin::tasks: etat de progression de la tache') ?></th>
|
||||
<th style="text-align:center; width:40px;">ID</th>
|
||||
<th style="text-align:center; width:30px;">!</th>
|
||||
<th style="text-align:center; width:80px;"><?php echo _('admin::tasks: statut de la tache') ?></th>
|
||||
<th style="text-align:center; width:60px;"><?php echo _('admin::tasks: process_id de la tache') ?></th>
|
||||
<th style="text-align:center; width:120px;"><?php echo _('admin::tasks: etat de progression de la tache') ?></th>
|
||||
<th style="width:auto;"><?php echo _('admin::tasks: nom de la tache') ?></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -411,23 +403,15 @@ foreach($tasks as $t)
|
||||
<img src="/skins/admin/dropdown.png"/>
|
||||
</td>
|
||||
<td> </td>
|
||||
|
||||
<td style="text-align:center" id="STATUS_SCHED">
|
||||
<img id="STATUSIMG_SCHED" style="display:none;" />
|
||||
<img id='WARNING_SCHED' style='display:none' src="/skins/icons/alert.png" alt="" />
|
||||
</td>
|
||||
|
||||
<td> </td>
|
||||
<td style="text-align:center" id="STATUS_SCHED"></td>
|
||||
<td id="PID_SCHED" style="text-align:center;"> </td>
|
||||
|
||||
<td>
|
||||
|
||||
</td>
|
||||
|
||||
<td> </td>
|
||||
<td style="font-weight:900" class="taskname">TaskManager</td>
|
||||
</tr>
|
||||
<?php
|
||||
$n = 0;
|
||||
foreach($task_manager->get_tasks() as $task)
|
||||
foreach($task_manager->get_tasks($refresh_tasklist) as $task)
|
||||
{
|
||||
$n++;
|
||||
$tid = $task->get_task_id()
|
||||
@@ -437,29 +421,40 @@ foreach($tasks as $t)
|
||||
<img src="/skins/admin/dropdown.png"/>
|
||||
</td>
|
||||
<td style="text-align:center; font-weight:900"><?php echo $tid ?></td>
|
||||
|
||||
<td style="text-align:center" id="STATUS_<?php echo $tid ?>">
|
||||
<img id="STATUSIMG_<?php echo $tid ?>" style="display:none;" />
|
||||
<img id='WARNING_<?php echo $tid ?>' style='display:none' src="/skins/icons/alert.png" alt="" />
|
||||
</td>
|
||||
|
||||
<td id="PID_<?php echo $tid ?>" style="text-align:center;width:60px;"> </td>
|
||||
|
||||
<td style="text-align:center"><img id="WARNING_<?php echo $tid ?>" src="/skins/icons/alert.png" title="" style="display:none;"/></td>
|
||||
<td style="text-align:center" id="STATUS_<?php echo $tid ?>"></td>
|
||||
<td style="text-align:center" id="PID_<?php echo $tid ?>"> </td>
|
||||
<td>
|
||||
<div id="COMPBOX_<?php echo $tid ?>" style="position:relative; top:1px; left:5px; width:110px; height:5px; background-color:#787878">
|
||||
<div style="position:relative; top:0px; left:0px; right:0px;" >
|
||||
<div id="COMPBOX_<?php echo $tid ?>" style="position:absolute; top:1px; left:3px; right:3px; height:5px; background-color:#787878">
|
||||
<div id="COMP_<?php echo $tid ?>" style="position:absolute; top:1px; left:0px; width:0%; height:3px; background-color:#FFFF80">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<td style="width:auto" class="taskname"><?php echo p4string::MakeString($task->get_title()) ?> [<?php echo p4string::MakeString($task::getName()) ?>]</td>
|
||||
<td class="taskname"><?php echo p4string::MakeString($task->get_title()) ?> [<?php echo p4string::MakeString($task::getName()) ?>]</td>
|
||||
</tr>
|
||||
<?php
|
||||
// $i = 1 - $i;
|
||||
}
|
||||
?> </tbody>
|
||||
?>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td class="dropdown scheduler">
|
||||
<img id="newTaskButton" src="/skins/admin/dropdown.png"/>
|
||||
</td>
|
||||
<td colspan="6">
|
||||
<?php echo _('admin::tasks: Nouvelle tache') ?>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
|
||||
<div id="db_processlist"></div>
|
||||
<!--
|
||||
<a id="newTaskButton" href="#"><?php echo _('admin::tasks: Nouvelle tache') ?></a>
|
||||
-->
|
||||
|
||||
<?php ?>
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -471,7 +466,7 @@ foreach($tasks as $t)
|
||||
document.forms["task"].submit();
|
||||
}
|
||||
|
||||
function setTaskStatus(tid, status, resetCrashCounter)
|
||||
function setTaskStatus(tid, status, signal, resetCrashCounter)
|
||||
{
|
||||
if(resetCrashCounter)
|
||||
{
|
||||
@@ -487,8 +482,8 @@ foreach($tasks as $t)
|
||||
|
||||
$.ajax({
|
||||
url: "/admin/adminFeedback.php",
|
||||
data : {task_id:tid, action:"SETTASKSTATUS", status:status},
|
||||
dataType:'xml',
|
||||
data : {task_id:tid, action:"SETTASKSTATUS", status:status, signal:signal},
|
||||
dataType:'json',
|
||||
success: function(ret)
|
||||
{
|
||||
pingScheduler(false); // false : just one time
|
||||
@@ -502,7 +497,7 @@ foreach($tasks as $t)
|
||||
$.ajax({
|
||||
url: "/admin/adminFeedback.php",
|
||||
data : { action:"SETSCHEDSTATUS", status:status },
|
||||
dataType:'xml',
|
||||
dataType:'json',
|
||||
success: function(ret)
|
||||
{
|
||||
pingScheduler(false); // false : just one time
|
||||
@@ -704,6 +699,16 @@ foreach($tasks as $t)
|
||||
else
|
||||
$("#PID_"+id).html('-');
|
||||
|
||||
if(ret.tasks[id].crashed)
|
||||
{
|
||||
// $("#WARNING_"+id).show().setAttribute("src", "/skins/icons/alert.png");
|
||||
$("#WARNING_"+id).show().attr("title", "crashed "+ret.tasks[id].crashed+" times");
|
||||
}
|
||||
else
|
||||
{
|
||||
$("#WARNING_"+id).hide();
|
||||
}
|
||||
|
||||
if(ret.tasks[id].completed && ret.tasks[id].completed>0 && ret.tasks[id].completed<=100)
|
||||
{
|
||||
$("#COMP_"+id).width(ret.tasks[id].completed + "%");
|
||||
@@ -716,14 +721,30 @@ foreach($tasks as $t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(ret.db_processlist)
|
||||
{
|
||||
var _table = document.createElement('table');
|
||||
for(p in ret.db_processlist)
|
||||
{
|
||||
if(p==0)
|
||||
{
|
||||
var _tr = _table.appendChild(document.createElement('tr'));
|
||||
for(c in ret.db_processlist[p])
|
||||
_tr.appendChild(document.createElement('th')).appendChild(document.createTextNode(c));
|
||||
}
|
||||
var _tr = _table.appendChild(document.createElement('tr'));
|
||||
for(c in ret.db_processlist[p])
|
||||
_tr.appendChild(document.createElement('td')).appendChild(document.createTextNode(ret.db_processlist[p][c]));
|
||||
}
|
||||
$("#db_processlist").html(_table);
|
||||
}
|
||||
if(repeat)
|
||||
self.setTimeout("pingScheduler(true);", 1000);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
function lauchScheduler()
|
||||
{
|
||||
url = "./runscheduler.php";
|
||||
@@ -734,11 +755,15 @@ foreach($tasks as $t)
|
||||
</script>
|
||||
|
||||
<div id="scheduler-preferences" style="display:none;" title="<?php echo _('Preferences du TaskManager'); ?>">
|
||||
|
||||
<div style="margin:5px 0;"><span><?php echo _('Cette URL vous permet de controler le sheduler depuis un manager comme cron') ?></span></div>
|
||||
<div style="margin:5px 0;"><input id="scheduler_key" style="width:100%;" type="text" readonly="readonly" value="<?php echo $registry->get('GV_ServerName') ?>admin/runscheduler.php?key=<?php echo phrasea::scheduler_key(); ?>" /></div>
|
||||
</div>
|
||||
|
||||
<form method="post" name="taskManager" action="/admin/taskmanager.php" target="???" onsubmit="return(false);" >
|
||||
<input type="hidden" name="act" value="" />
|
||||
<input type="hidden" name="tid" value="" />
|
||||
<input type="hidden" name="att" value="" />
|
||||
</form>
|
||||
<form method="post" name="task" action="/admin/task2.php" target="???" onsubmit="return(false);">
|
||||
<input type="hidden" name="act" value="???" />
|
||||
<input type="hidden" name="tid" value="" />
|
||||
|
Reference in New Issue
Block a user