diff --git a/app/Console/worker/start.sh b/app/Console/worker/start.sh index 9b958614d..3f8f453d3 100755 --- a/app/Console/worker/start.sh +++ b/app/Console/worker/start.sh @@ -13,6 +13,7 @@ cd "${0%/*}" ../cake CakeResque.CakeResque start --interval 5 --queue prio ../cake CakeResque.CakeResque start --interval 5 --queue cache ../cake CakeResque.CakeResque start --interval 5 --queue email +../cake CakeResque.CakeResque start --interval 5 --queue update ../cake CakeResque.CakeResque startscheduler --interval 5 exit 0 diff --git a/app/Console/worker/start_dynamic.sh b/app/Console/worker/start_dynamic.sh index c90bfc377..5e7f0f37f 100644 --- a/app/Console/worker/start_dynamic.sh +++ b/app/Console/worker/start_dynamic.sh @@ -28,7 +28,7 @@ else fi if [[ "$ADVANCED" == "1" ]]; then - for worker in `echo cache default email prio scheduler`; do + for worker in `echo cache default email prio scheduler update`; do workerStatus=$(../cake Admin getWorkers |tail -n +7 |jq -r ".$worker" |jq -r '.ok') PIDcount=$(../cake admin getWorkers |tail -n +7 |jq -r ".$worker.workers" |grep pid | wc -l) echo -n "$worker has $PIDcount PID(s)" @@ -51,6 +51,7 @@ else ../cake CakeResque.CakeResque start --interval 5 --queue prio ../cake CakeResque.CakeResque start --interval 5 --queue cache ../cake CakeResque.CakeResque start --interval 5 --queue email + ../cake CakeResque.CakeResque start --interval 5 --queue update ../cake CakeResque.CakeResque startscheduler --interval 5 exit 0 diff --git a/app/Controller/JobsController.php b/app/Controller/JobsController.php index 7db5ca5f8..16716b26d 100644 --- a/app/Controller/JobsController.php +++ b/app/Controller/JobsController.php @@ -25,7 +25,7 @@ class JobsController extends AppController $issueCount = 0; $workers = $this->Server->workerDiagnostics($issueCount); $this->recursive = 0; - $queues = array('email', 'default', 'cache', 'prio'); + $queues = array('email', 'default', 'cache', 'prio', 'update'); if ($queue && in_array($queue, $queues)) { $this->paginate['conditions'] = array('Job.worker' => $queue); } diff --git a/app/Controller/ServersController.php b/app/Controller/ServersController.php index 922f5a07f..9eae51dd7 100644 --- a/app/Controller/ServersController.php +++ b/app/Controller/ServersController.php @@ -1138,12 +1138,23 @@ class ServersController extends AppController if (!$this->_isSiteAdmin() || !$this->request->is('post')) { throw new MethodNotAllowedException(); } - $validTypes = array('default', 'email', 'scheduler', 'cache', 'prio'); + $validTypes = array('default', 'email', 'scheduler', 'cache', 'prio', 'update'); if (!in_array($type, $validTypes)) { throw new MethodNotAllowedException('Invalid worker type.'); } $prepend = ''; if ($type != 'scheduler') { + $workerIssueCount = 0; + $workerDiagnostic = $this->Server->workerDiagnostics($workerIssueCount); + if (isset($workerDiagnostic['update']['ok']) && $workerDiagnostic['update']['ok']) { + $message = __('Only one `update` worker can run at a time'); + if ($this->_isRest()) { + return $this->RestResponse->saveFailResponse('Servers', 'startWorker', false, $message, $this->response->type()); + } else { + $this->Flash->error($message); + $this->redirect('/servers/serverSettings/workers'); + } + } shell_exec($prepend . APP . 'Console' . DS . 'cake CakeResque.CakeResque start --interval 5 --queue ' . $type .' > /dev/null 2>&1 &'); } else { shell_exec($prepend . APP . 'Console' . DS . 'cake CakeResque.CakeResque startscheduler -i 5 > /dev/null 2>&1 &'); diff --git a/app/Model/AppModel.php b/app/Model/AppModel.php index 057fbd8e5..9779a31f3 100644 --- a/app/Model/AppModel.php +++ b/app/Model/AppModel.php @@ -1565,6 +1565,7 @@ class AppModel extends Model $this->AdminSetting = ClassRegistry::init('AdminSetting'); $this->Job = ClassRegistry::init('Job'); $this->Log = ClassRegistry::init('Log'); + $this->Server = ClassRegistry::init('Server'); $db = ConnectionManager::getDataSource('default'); $tables = $db->listSources(); $requiresLogout = false; @@ -1617,9 +1618,19 @@ class AppModel extends Model // restart this function by a worker if ($useWorker && Configure::read('MISP.background_jobs')) { + $workerIssueCount = 0; + $workerDiagnostic = $this->Server->workerDiagnostics($workerIssueCount); + $workerType = ''; + if (isset($workerDiagnostic['update']['ok']) && $workerDiagnostic['update']['ok']) { + $workerType = 'update'; + } elseif (isset($workerDiagnostic['prio']['ok']) && $workerDiagnostic['prio']['ok']) { + $workerType = 'prio'; + } else { // no worker running, doing inline update + return $this->runUpdates($verbose, false); + } $this->Job->create(); $data = array( - 'worker' => 'prio', + 'worker' => $workerType, 'job_type' => 'run_updates', 'job_input' => 'command: ' . implode(',', $updates), 'status' => 0, diff --git a/app/Model/Server.php b/app/Model/Server.php index 055862e37..2a097fdbd 100644 --- a/app/Model/Server.php +++ b/app/Model/Server.php @@ -4642,6 +4642,7 @@ class Server extends AppModel 'default' => array('ok' => false), 'email' => array('ok' => false), 'prio' => array('ok' => false), + 'update' => array('ok' => false), 'scheduler' => array('ok' => false) ); } @@ -4657,6 +4658,7 @@ class Server extends AppModel 'default' => array('ok' => true), 'email' => array('ok' => true), 'prio' => array('ok' => true), + 'update' => array('ok' => true), 'scheduler' => array('ok' => true) ); $procAccessible = file_exists('/proc'); @@ -5268,7 +5270,7 @@ class Server extends AppModel public function startWorker($queue) { - $validTypes = array('default', 'email', 'scheduler', 'cache', 'prio'); + $validTypes = array('default', 'email', 'scheduler', 'cache', 'prio', 'update'); if (!in_array($queue, $validTypes)) { return __('Invalid worker type.'); }