chg: [diagnostic] Improved submodules version and added individual

update
pull/4425/head
mokaddem 2019-04-02 11:29:10 +02:00
parent fcb3338f49
commit f03cae5f46
4 changed files with 97 additions and 31 deletions

View File

@ -388,7 +388,7 @@ class ServersController extends AppController
$this->set('host_org_id', Configure::read('MISP.host_org_id'));
}
}
public function edit($id = null)
{
$this->Server->id = $id;
@ -1542,6 +1542,21 @@ class ServersController extends AppController
}
}
public function updateSubmodule()
{
if (!$this->_isSiteAdmin()) {
throw new MethodNotAllowedException();
}
if ($this->request->is('post')) {
$request = $this->request->data;
$submodule = $request['Server']['submodule'];
$res = $this->Server->updateSubmodule($submodule);
return new CakeResponse(array('body'=> json_encode($res), 'type' => 'json'));
} else {
throw new MethodNotAllowedException();
}
}
public function getInstanceUUID()
{
return $this->RestResponse->viewData(array('uuid' => Configure::read('MISP.uuid')), $this->response->type());

View File

@ -4570,48 +4570,56 @@ class Server extends AppModel
public function getSubmodulesGitStatus()
{
exec('cd ' . APP . '../; git submodule status | cut -b 2- | cut -d " " -f 1,2 ', $submodulesNames);
exec('cd ' . APP . '../; git submodule status --cached | cut -b 2- | cut -d " " -f 1,2 ', $submodulesNames);
$status = array();
foreach ($submodulesNames as $submoduleNameInfo) {
$submoduleNameInfo = explode(' ', $submoduleNameInfo);
$submoduleCommitId = $submoduleNameInfo[0];
$superProjectSubmoduleCommitId = $submoduleNameInfo[0];
$submoduleName = $submoduleNameInfo[1];
$temp = $this->getSubmoduleGitStatus($submoduleName);
$temp = $this->getSubmoduleGitStatus($submoduleName, $superProjectSubmoduleCommitId);
if ( !empty($temp) ) {
$status[$submoduleName] = $this->getSubmoduleGitStatus($submoduleName);
$status[$submoduleName] = $temp;
}
}
return $status;
}
public function getSubmoduleGitStatus($submoduleName) {
private function _isAcceptedSubmodule($submodule) {
$acceptedSubmodulesNames = array('PyMISP',
'app/files/misp-galaxy',
'app/files/taxonomies',
'app/files/misp-objects',
'app/files/noticelists',
'app/files/warninglists',
'cti-python-stix2'
);
'app/files/misp-galaxy',
'app/files/taxonomies',
'app/files/misp-objects',
'app/files/noticelists',
'app/files/warninglists',
'cti-python-stix2'
);
return in_array($submodule, $acceptedSubmodulesNames);
}
public function getSubmoduleGitStatus($submoduleName, $superProjectSubmoduleCommitId) {
$status = array();
if (in_array($submoduleName, $acceptedSubmodulesNames)) {
if ($this->_isAcceptedSubmodule($submoduleName)) {
$path = APP . '../' . $submoduleName;
$submoduleName=(strpos($submoduleName, '/') >= 0 ? explode('/', $submoduleName) : $submoduleName);
$submoduleName=end($submoduleName);
$submoduleRemote=exec('cd ' . $path . '; git config --get remote.origin.url');
exec(sprintf('cd %s; git rev-parse HEAD', $path), $submoduleCurrentCommitId);
$submoduleCurrentCommitId = $submoduleCurrentCommitId[0];
$status = array(
'moduleName' => $submoduleName,
'current' => exec(sprintf('cd %s; git rev-parse HEAD', $path)),
'current' => $submoduleCurrentCommitId,
'currentTimestamp' => exec(sprintf('cd %s; git log -1 --pretty=format:%%ct', $path)),
'remoteTimestamp' => exec('timeout 3 git log origin/2.4 -1 --pretty=format:%ct'),
'remote' => exec(sprintf('timeout 3 git ls-remote %s | head -1 | sed "s/HEAD//"', $submoduleRemote)),
'remoteTimestamp' => exec(sprintf('cd %s; git show -s --pretty=format:%%ct %s', $path, $superProjectSubmoduleCommitId)),
'remote' => $superProjectSubmoduleCommitId,
'upToDate' => ''
);
if (!empty($status['remote'])) {
if ($status['remote'] == $status['current']) {
$status['upToDate'] = 'same';
} else {
} else if ($status['currentTimestamp'] < $status['remoteTimestamp']) {
$status['upToDate'] = 'older';
} else {
$status['upToDate'] = 'younger';
}
} else {
$status['upToDate'] = 'error';
@ -4621,19 +4629,22 @@ class Server extends AppModel
return $status;
}
// Potentially obsolete. Ideally it is more uniform to get the path of the submodules.
private function __getSubmodulePath($submoduleName) {
$base = APP . 'files' . DS;
switch ($submoduleName) {
case 'misp-taxonomies':
return $base . 'taxonomies';
case 'misp-noticelist':
return $base . 'noticelists';
case 'misp-warninglists':
return $base . 'warninglists';
default:
return $base . $submoduleName;
public function updateSubmodule($submoduleName=false) {
$path = APP . '../';
if ($submoduleName == false) {
$command = sprintf('cd %s; git submodule update', $path);
exec($command, $output);
$output = implode("\n", $output);
$res = array('status' => true, 'output' => $output);
} else if ($this->_isAcceptedSubmodule($submoduleName)) {
$command = sprintf('cd %s; git submodule update -- %s', $path, $submoduleName);
exec($command, $output);
$output = implode("\n", $output);
$res = array('status' => true, 'output' => $output);
} else {
$res = array('status' => false);
}
return $res;
}
public function update($status)

View File

@ -4,6 +4,14 @@
<th><?php echo __('Submodule'); ?></th>
<th><?php echo __('Current Version'); ?></th>
<th><?php echo __('Status'); ?></th>
<th><?php echo __('Action'); ?>
<?php
echo $this->Form->create('Server', array('url' => array('action' => 'updateSubmodule'), 'div' => false, 'style' => 'margin: 0px; display: inline-block;'));
echo $this->Form->hidden('submodule', array('value' => false));
echo $this->Form->end();
echo '<it class="fas fa-sync useCursorPointer" title="' . __('Update all submodules') . '" aria-label="Update all" onclick="submitSubmoduleUpdate(this);"></it>';
?>
</th>
</tr>
</thead>
<tbody>
@ -21,7 +29,7 @@
$class = 'warning';
}
$versionText = __('Outdated version');
$versionText .= sprintf(' (%s days, %s hours)', $status['timeDiff']->format('%d'), $status['timeDiff']->format('%h'));
$versionText .= sprintf(_(' (%s days, %s hours older than super project)'), $status['timeDiff']->format('%d'), $status['timeDiff']->format('%h'));
break;
case 'error':
$class = 'error bold';
@ -37,6 +45,16 @@
<td><?php echo h($submodule) ?></td>
<td><?php echo h($status['current']) ?></td>
<td><?php echo h($versionText) ?></td>
<td>
<?php
if ($status['upToDate'] != 'same') {
echo $this->Form->create('Server', array('url' => array('action' => 'updateSubmodule'), 'div' => false, 'style' => 'margin: 0px; display: inline-block;'));
echo $this->Form->hidden('submodule', array('value' => h($submodule)));
echo $this->Form->end();
echo '<it class="fas fa-sync useCursorPointer" title="' . __('Update submodule') . '" aria-label="Update" onclick="submitSubmoduleUpdate(this);"></it>';
}
?>
</td>
</tr>
<?php endforeach; ?>
</tbody>

View File

@ -3715,6 +3715,28 @@ function submitMISPUpdate() {
});
}
function submitSubmoduleUpdate(clicked) {
var $clicked = $(clicked);
var $form = $clicked.parent().find('form');
var formData = $form.serialize();
$.ajax({
beforeSend: function (XMLHttpRequest) {
$clicked.addClass('fa-spin');
},
data: formData,
success:function (data, textStatus) {
showMessage('success', data.output);
updateSubModulesStatus();
},
complete:function() {
$clicked.removeClass('fa-spin');
},
type:"post",
cache: false,
url:$form.attr('action'),
});
}
$(".cortex-json").click(function() {
var cortex_data = $(this).data('cortex-json');
cortex_data = htmlEncode(JSON.stringify(cortex_data, null, 2));