mirror of https://github.com/MISP/MISP
chg: [diagnostic] Improved submodules version and added individual
updatepull/4425/head
parent
fcb3338f49
commit
f03cae5f46
|
@ -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());
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue