app['task-manager.status']; $status->start(); $cmdLine = sprintf( '%s %s %s', $this->getConf()->get(['main', 'binaries', 'php_binary']), realpath(__DIR__ . '/../../../../../bin/console'), 'task-manager:scheduler:run' ); $this->getDispatcher()->addListener(KernelEvents::TERMINATE, function () use ($cmdLine) { $process = new Process($cmdLine); $process->setTimeout(0); $process->disableOutput(); set_time_limit(0); ignore_user_abort(true); $process->run(); }, -1000); return $this->app->redirectPath('admin_tasks_list'); } public function stopScheduler() { /** @var TaskManagerStatus $status */ $status = $this->app['task-manager.status']; $status->stop(); $info = $this->getLiveInformationRequest(); $data = $info->getManager(); if (null !== $pid = $data['process-id']) { if (substr(php_uname(), 0, 7) == "Windows"){ exec(sprintf('TaskKill /PID %d', $pid)); } else { exec(sprintf('kill %d', $pid)); } } return $this->app->redirectPath('admin_tasks_list'); } public function getRoot() { return $this->app->redirectPath('admin_tasks_list'); } public function getLiveInformation(Request $request) { if ($request->getRequestFormat() !== "json") { $this->app->abort(406, 'Only JSON format is accepted.'); } $tasks = []; /** @var Task $task */ foreach ($this->getTaskRepository()->findAll() as $task) { $tasks[$task->getId()] = $this->getLiveInformationRequest()->getTask($task); } return $this->app->json([ 'manager' => $this->getLiveInformationRequest()->getManager(), 'tasks' => $tasks ]); } public function getScheduler(Request $request) { if ($request->getRequestFormat() !== "json") { $this->app->abort(406, 'Only JSON format is accepted.'); } $ret = [ 'name' => $this->app->trans('Task Scheduler'), 'configuration' => $this->app['task-manager.status']->getStatus(), ]; if (($this->app['phraseanet.configuration']['main']['task-manager']['enabled'] === true)) { $ret['urls'] = [ 'start' => $this->app->path('admin_tasks_scheduler_start'), 'stop' => $this->app->path('admin_tasks_scheduler_stop'), 'log' => $this->app->path('admin_tasks_scheduler_log'), ]; } else { $ret['urls'] = [ 'log' => $this->app->path('admin_tasks_scheduler_log'), ]; } return $this->app->json($ret); } public function getTasks(Request $request) { $tasks = []; /** @var Task $task */ foreach ($this->getTaskRepository()->findAll() as $task) { $tasks[] = [ 'id' => $task->getId(), 'name' => $task->getName(), 'status' => $task->getStatus() ]; } if ($request->getRequestFormat() === "json") { foreach ($tasks as $k => $task) { $tasks[$k]['urls'] = $this->getTaskResourceUrls($task['id']); } return $this->app->json($tasks); } return $this->app['twig']->render('admin/task-manager/index.html.twig', [ 'available_jobs' => $this->app['task-manager.available-jobs'], 'tasks' => $tasks, 'scheduler' => [ 'id' => null, 'name' => $this->app->trans('Task Scheduler'), 'status' => $this->app['task-manager.status']->getStatus(), ] ]); } public function postCreateTask(Request $request) { try { /** @var Factory $factory */ $factory = $this->app['task-manager.job-factory']; $job = $factory->create($request->request->get('job-name')); } catch (InvalidArgumentException $e) { throw new HttpException(400, $e->getMessage(), $e); } $task = $this->getTaskManipulator()->create( $job->getName(), $job->getJobId(), $job->getEditor()->getDefaultSettings($this->app['conf']), $job->getEditor()->getDefaultPeriod() ); return $this->app->redirectPath('admin_tasks_task_show', ['task' => $task->getId()]); } public function getSchedulerLog(Request $request) { /** @var LogFileFactory $factory */ $factory = $this->app['task-manager.log-file.factory']; $logFile = $factory->forManager(); if ($request->query->get('clr') && $request->query->get('version') !== null) { $logFile->clear($request->query->get('version')); } return $this->render('admin/task-manager/log_scheduler.html.twig', [ 'logfile' => $logFile, 'version' => $request->query->get('version') ]); } public function getTaskLog(Request $request, Task $task) { /** @var LogFileFactory $factory */ $factory = $this->app['task-manager.log-file.factory']; $logFile = $factory->forTask($task); if ($request->query->get('clr') && $request->query->get('version') !== null) { $logFile->clear($request->query->get('version')); } return $this->render('admin/task-manager/log_task.html.twig', [ 'logfile' => $logFile, 'version' => $request->query->get('version') ]); } public function postTaskDelete(Task $task) { $this->getTaskManipulator()->delete($task); return $this->app->redirectPath('admin_tasks_list'); } public function postStartTask(Task $task) { $this->getTaskManipulator()->start($task); return $this->app->redirectPath('admin_tasks_list'); } public function postStopTask(Task $task) { $this->getTaskManipulator()->stop($task); return $this->app->redirectPath('admin_tasks_list'); } public function postResetCrashes(Task $task) { $this->getTaskManipulator()->resetCrashes($task); return $this->app->json(['success' => true]); } public function postSaveTask(Request $request, Task $task) { if (!$this->doValidateXML($request->request->get('settings'))) { return $this->app->json(['success' => false, 'message' => sprintf('Unable to load XML %s', $request->request->get('xml'))]); } $form = $this->app->form(new TaskForm()); $form->setData($task); $form->handleRequest($request); if ($form->isValid()) { $this->getTaskManipulator()->update($task); return $this->app->json(['success' => true]); } return $this->app->json([ 'success' => false, 'message' => implode("\n", iterator_to_array($form->getErrors())), ]); } public function postTaskFacility(Request $request, Task $task) { return $this->getJobFactory() ->create($task->getJobId()) ->getEditor() ->facility($this->app, $request); } public function postXMLFromForm(Request $request, Task $task) { return $this->getJobFactory() ->create($task->getJobId()) ->getEditor() ->updateXMLWithRequest($request); } public function getTask(Request $request, Task $task) { if ('json' === $request->getContentType()) { return $this->app->json(array_replace([ 'id' => $task->getId(), 'name' => $task->getName(), 'urls' => $this->getTaskResourceUrls($task->getId()) ], $this->getLiveInformationRequest()->getTask($task) )); } $editor = $this->getJobFactory() ->create($task->getJobId()) ->getEditor(); $form = $this->app->form(new TaskForm()); $form->setData($task); return $this->render($editor->getTemplatePath(), [ 'task' => $task, 'form' => $form->createView(), 'view' => 'XML', ]); } public function validateXML(Request $request) { return $this->app->json(['success' => $this->doValidateXML($request->getContent())]); } private function doValidateXML($string) { $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->strictErrorChecking = true; return (Boolean) @$dom->loadXML($string); } private function getTaskResourceUrls($taskId) { return [ 'show' => $this->app->path('admin_tasks_task_show', ['task' => $taskId]), 'start' => $this->app->path('admin_tasks_task_start', ['task' => $taskId]), 'stop' => $this->app->path('admin_tasks_task_stop', ['task' => $taskId]), 'delete' => $this->app->path('admin_tasks_task_delete', ['task' => $taskId]), 'log' => $this->app->path('admin_tasks_task_log', ['task' => $taskId]), ]; } /** * @return TaskRepository */ private function getTaskRepository() { return $this->app['repo.tasks']; } /** * @return LiveInformation */ private function getLiveInformationRequest() { return $this->app['task-manager.live-information']; } /** * @return TaskManipulator */ private function getTaskManipulator() { return $this->app['manipulator.task']; } /** * @return Factory */ private function getJobFactory() { return $this->app['task-manager.job-factory']; } }