mirror of
https://github.com/valitydev/wazuh-kibana-app.git
synced 2024-11-07 18:28:55 +00:00
280 lines
8.1 KiB
JavaScript
280 lines
8.1 KiB
JavaScript
/*
|
|
* Wazuh app - Cluster monitoring controller
|
|
* Copyright (C) 2018 Wazuh, Inc.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Find more information about this on the LICENSE file.
|
|
*/
|
|
import { FilterHandler } from '../../utils/filter-handler';
|
|
import { uiModules } from 'ui/modules';
|
|
|
|
const app = uiModules.get('app/wazuh', []);
|
|
|
|
// Logs controller
|
|
app.controller('clusterController', function(
|
|
$scope,
|
|
$rootScope,
|
|
$timeout,
|
|
errorHandler,
|
|
apiReq,
|
|
$window,
|
|
$location,
|
|
discoverPendingUpdates,
|
|
rawVisualizations,
|
|
loadedVisualizations,
|
|
visHandlers,
|
|
tabVisualizations,
|
|
appState,
|
|
genericReq
|
|
) {
|
|
$scope.search = term => {
|
|
$scope.$broadcast('wazuhSearch', { term });
|
|
};
|
|
|
|
const clusterEnabled =
|
|
appState.getClusterInfo() && appState.getClusterInfo().status === 'enabled';
|
|
$scope.isClusterEnabled = clusterEnabled;
|
|
$scope.isClusterRunning = true;
|
|
$location.search('tabView', 'cluster-monitoring');
|
|
$location.search('tab', 'monitoring');
|
|
$location.search('_a', null);
|
|
const filterHandler = new FilterHandler(appState.getCurrentPattern());
|
|
discoverPendingUpdates.removeAll();
|
|
tabVisualizations.removeAll();
|
|
rawVisualizations.removeAll();
|
|
loadedVisualizations.removeAll();
|
|
tabVisualizations.setTab('monitoring');
|
|
tabVisualizations.assign({
|
|
monitoring: 2
|
|
});
|
|
|
|
$scope.loading = true;
|
|
$scope.showConfig = false;
|
|
$scope.showNodes = false;
|
|
$scope.currentNode = null;
|
|
$scope.nodeSearchTerm = '';
|
|
|
|
const setBooleans = component => {
|
|
$scope.showConfig = component === 'showConfig';
|
|
$scope.showNodes = component === 'showNodes';
|
|
$scope.currentNode = null;
|
|
};
|
|
|
|
$scope.goAgents = () => {
|
|
$window.location.href = '#/agents-preview';
|
|
};
|
|
|
|
$scope.goConfiguration = () => {
|
|
setBooleans('showConfig');
|
|
tabVisualizations.assign({
|
|
monitoring: 1
|
|
});
|
|
assignFilters();
|
|
$rootScope.$broadcast('updateVis');
|
|
};
|
|
|
|
$scope.goNodes = () => {
|
|
setBooleans('showNodes');
|
|
tabVisualizations.assign({
|
|
monitoring: 1
|
|
});
|
|
assignFilters();
|
|
$rootScope.$broadcast('updateVis');
|
|
};
|
|
|
|
$scope.goBack = () => {
|
|
setBooleans(null);
|
|
tabVisualizations.assign({
|
|
monitoring: 2
|
|
});
|
|
assignFilters();
|
|
$rootScope.$broadcast('updateVis');
|
|
};
|
|
|
|
$scope.$on('wazuhShowClusterNode', async (event, parameters) => {
|
|
try {
|
|
tabVisualizations.assign({
|
|
monitoring: 1
|
|
});
|
|
$scope.currentNode = parameters.node;
|
|
const data = await apiReq.request('GET', '/cluster/healthcheck', {
|
|
node: $scope.currentNode.name
|
|
});
|
|
|
|
$scope.currentNode.healthCheck =
|
|
data.data.data.nodes[$scope.currentNode.name];
|
|
|
|
if (
|
|
$scope.currentNode.healthCheck &&
|
|
$scope.currentNode.healthCheck.status
|
|
) {
|
|
$scope.currentNode.healthCheck.status.last_sync_integrity.duration =
|
|
'n/a';
|
|
$scope.currentNode.healthCheck.status.last_sync_agentinfo.duration =
|
|
'n/a';
|
|
$scope.currentNode.healthCheck.status.last_sync_agentgroups.duration =
|
|
'n/a';
|
|
|
|
if (
|
|
$scope.currentNode.healthCheck.status.last_sync_integrity
|
|
.date_start_master !== 'n/a' &&
|
|
$scope.currentNode.healthCheck.status.last_sync_integrity
|
|
.date_end_master !== 'n/a'
|
|
) {
|
|
const end = new Date(
|
|
$scope.currentNode.healthCheck.status.last_sync_integrity.date_end_master
|
|
);
|
|
const start = new Date(
|
|
$scope.currentNode.healthCheck.status.last_sync_integrity.date_start_master
|
|
);
|
|
$scope.currentNode.healthCheck.status.last_sync_integrity.duration = `${(end -
|
|
start) /
|
|
1000}s`;
|
|
}
|
|
|
|
if (
|
|
$scope.currentNode.healthCheck.status.last_sync_agentinfo
|
|
.date_start_master !== 'n/a' &&
|
|
$scope.currentNode.healthCheck.status.last_sync_agentinfo
|
|
.date_end_master !== 'n/a'
|
|
) {
|
|
const end = new Date(
|
|
$scope.currentNode.healthCheck.status.last_sync_agentinfo.date_end_master
|
|
);
|
|
const start = new Date(
|
|
$scope.currentNode.healthCheck.status.last_sync_agentinfo.date_start_master
|
|
);
|
|
$scope.currentNode.healthCheck.status.last_sync_agentinfo.duration = `${(end -
|
|
start) /
|
|
1000}s`;
|
|
}
|
|
|
|
if (
|
|
$scope.currentNode.healthCheck.status.last_sync_agentgroups
|
|
.date_start_master !== 'n/a' &&
|
|
$scope.currentNode.healthCheck.status.last_sync_agentgroups
|
|
.date_end_master !== 'n/a'
|
|
) {
|
|
const end = new Date(
|
|
$scope.currentNode.healthCheck.status.last_sync_agentgroups.date_end_master
|
|
);
|
|
const start = new Date(
|
|
$scope.currentNode.healthCheck.status.last_sync_agentgroups.date_start_master
|
|
);
|
|
$scope.currentNode.healthCheck.status.last_sync_agentgroups.duration = `${(end -
|
|
start) /
|
|
1000}s`;
|
|
}
|
|
}
|
|
|
|
assignFilters($scope.currentNode.name);
|
|
$rootScope.$broadcast('updateVis');
|
|
|
|
if (!$scope.$$phase) $scope.$digest();
|
|
} catch (error) {
|
|
errorHandler.handle(error, 'Cluster');
|
|
}
|
|
});
|
|
|
|
let filters = [];
|
|
const assignFilters = (node = false) => {
|
|
try {
|
|
filters = [];
|
|
filters.push(
|
|
filterHandler.managerQuery(appState.getClusterInfo().cluster, true)
|
|
);
|
|
if (node) {
|
|
filters.push(filterHandler.nodeQuery(node));
|
|
}
|
|
|
|
$rootScope.$emit('wzEventFilters', { filters, localChange: false });
|
|
if (!$rootScope.$$listenerCount['wzEventFilters']) {
|
|
$timeout(100).then(() => assignFilters(node));
|
|
}
|
|
} catch (error) {
|
|
errorHandler.handle(
|
|
'An error occurred while creating custom filters for visualizations',
|
|
'Cluster',
|
|
true
|
|
);
|
|
}
|
|
};
|
|
|
|
const load = async () => {
|
|
try {
|
|
visHandlers.removeAll();
|
|
discoverPendingUpdates.removeAll();
|
|
rawVisualizations.removeAll();
|
|
loadedVisualizations.removeAll();
|
|
|
|
const status = await apiReq.request('GET', '/cluster/status', {});
|
|
$scope.status = status.data.data.running;
|
|
if ($scope.status === 'no') {
|
|
$scope.isClusterRunning = false;
|
|
$scope.loading = false;
|
|
return;
|
|
}
|
|
|
|
const data = await Promise.all([
|
|
apiReq.request('GET', '/cluster/nodes', {}),
|
|
apiReq.request('GET', '/cluster/config', {}),
|
|
apiReq.request('GET', '/version', {}),
|
|
apiReq.request('GET', '/agents', { limit: 1 }),
|
|
apiReq.request('GET', '/cluster/healthcheck', {})
|
|
]);
|
|
|
|
const nodesCount = data[0].data.data.totalItems;
|
|
$scope.nodesCount = nodesCount;
|
|
|
|
const configuration = data[1];
|
|
$scope.configuration = configuration.data.data;
|
|
|
|
const version = data[2];
|
|
$scope.version = version.data.data;
|
|
|
|
const agents = data[3];
|
|
$scope.agentsCount = agents.data.data.totalItems - 1;
|
|
|
|
const health = data[4];
|
|
$scope.healthCheck = health.data.data;
|
|
|
|
const nodes = data[0].data.data;
|
|
|
|
nodes.name = $scope.configuration.name;
|
|
nodes.master_node = $scope.configuration.node_name;
|
|
|
|
const visData = await genericReq.request(
|
|
'POST',
|
|
`/elastic/visualizations/cluster-monitoring/${appState.getCurrentPattern()}`,
|
|
{ nodes }
|
|
);
|
|
|
|
rawVisualizations.assignItems(visData.data.raw);
|
|
assignFilters();
|
|
$rootScope.$broadcast('updateVis');
|
|
|
|
$scope.loading = false;
|
|
if (!$scope.$$phase) $scope.$digest();
|
|
return;
|
|
} catch (error) {
|
|
$scope.loading = false;
|
|
errorHandler.handle(error, 'Cluster');
|
|
}
|
|
};
|
|
|
|
if (clusterEnabled) load();
|
|
|
|
$scope.$on('$destroy', () => {
|
|
$location.search('tabView', null);
|
|
discoverPendingUpdates.removeAll();
|
|
tabVisualizations.removeAll();
|
|
rawVisualizations.removeAll();
|
|
loadedVisualizations.removeAll();
|
|
visHandlers.removeAll();
|
|
});
|
|
});
|