chg: [diagnostic:submodule] Started integration of update DB after pull

with workers
pull/4435/head
mokaddem 2019-04-05 14:28:19 +02:00
parent c8274c476e
commit fe00c4d193
4 changed files with 77 additions and 5 deletions

View File

@ -44,6 +44,24 @@ class AdminShell extends AppShell
echo PHP_EOL . 'Workers restarted.' . PHP_EOL;
}
public function updateAfterPull() {
$this->loadModel('Job');
$this->loadModel('Server');
$submodule_name = $this->args[0];
$jobId = $this->args[1];
$userId = $this->args[2];
$this->Job->id = $jobId;
$result = $this->Server->updateAfterPull($submodule_name, $userId) . PHP_EOL;
$job['Job']['progress'] = 100;
$job['Job']['date_modified'] = date("y-m-d H:i:s");
if ($result) {
$job['Job']['message'] = __('Database updated.');
} else {
$job['Job']['message'] = __('Could not update the database.');
}
$this->Job->save($job);
}
public function updateGalaxies() {
// The following is 7.x upwards only
//$value = $this->args[0] ?? $this->args[0] ?? 0;

View File

@ -1555,7 +1555,7 @@ class ServersController extends AppController
if ($this->request->is('post')) {
$request = $this->request->data;
$submodule = $request['Server']['submodule'];
$res = $this->Server->updateSubmodule($submodule);
$res = $this->Server->updateSubmodule($this->Auth->user(), $submodule);
return new CakeResponse(array('body'=> json_encode($res), 'type' => 'json'));
} else {
throw new MethodNotAllowedException();

View File

@ -3841,7 +3841,7 @@ class Event extends AppModel
}
}
private function __getPrioWorkerIfPossible()
public function __getPrioWorkerIfPossible()
{
$this->ResqueStatus = new ResqueStatus\ResqueStatus(Resque::redis());
$workers = $this->ResqueStatus->getWorkers();

View File

@ -4636,24 +4636,78 @@ class Server extends AppModel
return $status;
}
public function updateSubmodule($submodule_name=false) {
public function updateSubmodule($user, $submodule_name=false) {
$path = APP . '../';
if ($submodule_name == false) {
$command = sprintf('cd %s; git submodule update 2>&1', $path);
exec($command, $output, $return_code);
// exec($command, $output, $return_code);
$return_code = 0;
$output = array();
$output = implode("\n", $output);
$res = array('status' => ($return_code==0 ? true : false), 'output' => $output);
if ($return_code == 0) { // update all DB
$this->updateDatabaseAfterPullRouter($submodule_name, $user);
}
} else if ($this->_isAcceptedSubmodule($submodule_name)) {
$command = sprintf('cd %s; git submodule update -- %s 2>&1', $path, $submodule_name);
exec($command, $output, $return_code);
// exec($command, $output, $return_code);
$return_code = 0;
$output = array();
$output = implode("\n", $output);
$res = array('status' => ($return_code==0 ? true : false), 'output' => $output);
if ($return_code == 0) { // update DB if necessary
$this->updateDatabaseAfterPullRouter($submodule_name, $user);
}
} else {
$res = array('status' => false, 'output' => __('Invalid submodule.'));
}
return $res;
}
public function updateDatabaseAfterPullRouter($submodule_name, $user) {
if (Configure::read('MISP.background_jobs')) {
$job = ClassRegistry::init('Job');
$job->create();
$eventModel = ClassRegistry::init('Event');
$data = array(
'worker' => $eventModel->__getPrioWorkerIfPossible(),
'job_type' => __('update_after_pull'),
'job_input' => __('Updating: ' . $submodule_name),
'status' => 0,
'retries' => 0,
'org_id' => $user['org_id'],
'org' => $user['Organisation']['name'],
'message' => 'Update database after PULL.',
);
$job->save($data);
$jobId = $job->id;
$process_id = CakeResque::enqueue(
'prio',
'AdminShell',
array('updateAfterPull', $submodule_name, $jobId, $user['id']),
true
);
$job->saveField('process_id', $process_id);
return $process_id;
} else {
$result = $this->updateAfterPull($submodule_name, $userId);
return $result;
}
}
public function updateAfterPull($submodule_name, $userId) {
$user = $this->User->getAuthUser($userId);
if ($user['Role']['perm_site_admin']) {
if (empty($submodule_name)) { // update all
} else { // update specific
}
} else {
return false;
}
}
public function update($status)
{
$final = '';