mirror of https://github.com/MISP/MISP
new: [server] Compare server events overlap
parent
56ef2f9874
commit
7c28f9b966
|
@ -503,6 +503,7 @@ class ACLComponent extends Component
|
|||
'postTest' => array('perm_sync'),
|
||||
'previewEvent' => array(),
|
||||
'previewIndex' => array(),
|
||||
'compareServers' => [],
|
||||
'pull' => array(),
|
||||
'purgeSessions' => array(),
|
||||
'push' => array(),
|
||||
|
|
|
@ -203,6 +203,14 @@ class ServersController extends AppController
|
|||
$this->set('title_for_layout', __('Remote event preview'));
|
||||
}
|
||||
|
||||
public function compareServers()
|
||||
{
|
||||
list($servers, $overlap) = $this->Server->serverEventsOverlap();
|
||||
$this->set('servers', $servers);
|
||||
$this->set('overlap', $overlap);
|
||||
$this->set('title_for_layout', __('Server overlap analysis matrix'));
|
||||
}
|
||||
|
||||
public function filterEventIndex($id)
|
||||
{
|
||||
if (!$this->_isSiteAdmin()) {
|
||||
|
|
|
@ -809,6 +809,56 @@ class Server extends AppModel
|
|||
return $eventUuids;
|
||||
}
|
||||
|
||||
public function serverEventsOverlap()
|
||||
{
|
||||
$servers = $this->find('all', [
|
||||
'conditions' => ['OR' => [
|
||||
'pull' => 1,
|
||||
// 'push' => 1,
|
||||
]],
|
||||
'order' => ['Server.id ASC'],
|
||||
'recursive' => -1,
|
||||
]);
|
||||
|
||||
if (count($servers) < 2) {
|
||||
return [$servers, []];
|
||||
}
|
||||
|
||||
$serverUuids = [];
|
||||
foreach ($servers as $server) {
|
||||
try {
|
||||
$uuids = $this->getEventIdsFromServer($server, true, null, true, 'events', true);
|
||||
$serverUuids[$server['Server']['id']] = $uuids;
|
||||
} catch (Exception $e) {
|
||||
$this->logException("Could not get event UUIDs for server {$server['Server']['id']}", $e);
|
||||
}
|
||||
}
|
||||
|
||||
$compared = [];
|
||||
foreach ($servers as $server) {
|
||||
if (!isset($serverUuids[$server['Server']['id']])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($servers as $server2) {
|
||||
if ($server['Server']['id'] == $server2['Server']['id']) {
|
||||
continue;
|
||||
}
|
||||
if (!isset($serverUuids[$server2['Server']['id']])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$intersect = count(array_intersect($serverUuids[$server['Server']['id']], $serverUuids[$server2['Server']['id']]));
|
||||
$percentage = round(100 * $intersect / count($serverUuids[$server['Server']['id']]));
|
||||
$compared[$server['Server']['id']][$server2['Server']['id']] = [
|
||||
'percentage' => $percentage,
|
||||
'events' => $intersect,
|
||||
];
|
||||
}
|
||||
}
|
||||
return [$servers, $compared];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $id Server ID
|
||||
* @param string|int $technique Can be 'full', 'incremental' or event ID
|
||||
|
|
|
@ -752,6 +752,10 @@ $divider = $this->element('/genericElements/SideMenu/side_menu_divider');
|
|||
'url' => $baseurl . '/servers/add',
|
||||
'text' => __('New Servers')
|
||||
));
|
||||
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
|
||||
'url' => $baseurl . '/servers/compareServers',
|
||||
'text' => __('Server overlap analysis matrix'),
|
||||
));
|
||||
echo $this->element('/genericElements/SideMenu/side_menu_link', array(
|
||||
'url' => $baseurl . '/communities/index',
|
||||
'text' => __('List Communities'),
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
<?php
|
||||
$serverTemplate = array(
|
||||
'id', 'name', 'url'
|
||||
);
|
||||
?>
|
||||
<div class="index">
|
||||
<h2><?php echo __('Server events overlap analysis matrix');?></h2>
|
||||
<?php
|
||||
if (count($servers) >= 2):
|
||||
?>
|
||||
<div>
|
||||
<table class="table table-striped table-hover table-condensed" style="width:100px;">
|
||||
<tr>
|
||||
<th> </th>
|
||||
<?php
|
||||
foreach ($servers as $server):
|
||||
$popover = '';
|
||||
foreach ($serverTemplate as $element) {
|
||||
$popover .= '<span class=\'bold\'>' . Inflector::humanize($element) . '</span>: <span class=\'bold blue\'>' . h($server['Server'][$element]) . '</span><br>';
|
||||
}
|
||||
?>
|
||||
<th>
|
||||
<div data-toggle="popover" data-content="<?= $popover; ?>" data-trigger="hover">
|
||||
<?= 'S' . h($server['Server']['id']) ?>
|
||||
</div>
|
||||
</th>
|
||||
<?php
|
||||
endforeach;
|
||||
?>
|
||||
</tr>
|
||||
<?php
|
||||
foreach ($servers as $item):
|
||||
$popover = '';
|
||||
foreach ($serverTemplate as $element) {
|
||||
$popover .= '<span class=\'bold\'>' . Inflector::humanize($element) . '</span>: <span class=\'bold blue\'>' . h($item['Server'][$element]) . '</span><br>';
|
||||
}
|
||||
?>
|
||||
<tr>
|
||||
<td class="short">
|
||||
<div data-toggle="popover" data-content="<?php echo $popover;?>" data-trigger="hover">
|
||||
<?= __('Server #%s: %s', h($item['Server']['id']), h($item['Server']['name'])) ?>
|
||||
</div>
|
||||
</td>
|
||||
<?php
|
||||
foreach ($servers as $item2):
|
||||
$percentage = $count = null;
|
||||
if (isset($overlap[$item['Server']['id']][$item2['Server']['id']])) {
|
||||
$percentage = $overlap[$item['Server']['id']][$item2['Server']['id']]['percentage'];
|
||||
$count = $overlap[$item['Server']['id']][$item2['Server']['id']]['events'];
|
||||
}
|
||||
|
||||
$class = 'bold';
|
||||
if ($percentage !== null) {
|
||||
if ($percentage <= 5) {
|
||||
$class .= ' green';
|
||||
} else if ($percentage <= 50) {
|
||||
$class .= ' orange';
|
||||
} else {
|
||||
$class .= ' red';
|
||||
}
|
||||
}
|
||||
|
||||
if ($percentage === null) {
|
||||
$popover = '';
|
||||
} else if ($percentage == 0) {
|
||||
$popover = __('None or less than 1 % of the events of %s is contained in %s (%s matching events)', $item['Server']['name'], $item2['Server']['name'], $count);
|
||||
} else if ($percentage > 0) {
|
||||
$popover = __('%s % of the events of %s is contained in %s (%s matching events)', $percentage, $item['Server']['name'], $item2['Server']['name'], $count);
|
||||
}
|
||||
?>
|
||||
<td class="<?= h($class); ?>">
|
||||
<div data-toggle="popover" data-content="<?php echo h($popover);?>" data-trigger="hover">
|
||||
<?= $percentage === null ? '-' : h($percentage) . ' %' ?>
|
||||
</div>
|
||||
</td>
|
||||
<?php
|
||||
endforeach;
|
||||
?>
|
||||
</tr>
|
||||
<?php
|
||||
endforeach;
|
||||
?>
|
||||
</table>
|
||||
</div>
|
||||
<?php
|
||||
else:
|
||||
echo '<p class="red bold">Not enough remote servers. Make sure you have at least 2 server that are enabled and available.</p>';
|
||||
endif;
|
||||
?>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$(function(){
|
||||
popoverStartup();
|
||||
});
|
||||
</script>
|
||||
<?= $this->element('/genericElements/SideMenu/side_menu', array('menuList' => 'sync', 'menuItem' => 'compareServers'));
|
Loading…
Reference in New Issue