mirror of
https://github.com/valitydev/wazuh-kibana-app.git
synced 2024-11-08 18:53:52 +00:00
539 lines
20 KiB
JavaScript
539 lines
20 KiB
JavaScript
// Require config
|
|
var config = require('plugins/wazuh/config/config.js');
|
|
var app = require('ui/modules').get('app/wazuh', []);
|
|
|
|
app.controller('rulesController', function ($scope, $q, DataFactory, $mdToast) {
|
|
//Initialisation
|
|
$scope.load = true;
|
|
|
|
$scope.rules = [];
|
|
|
|
$scope.statusFilter = 'enabled';
|
|
|
|
$scope.maxLevel = 15;
|
|
$scope.minLevel = 0;
|
|
|
|
var _file;
|
|
var _group;
|
|
var _pci;
|
|
var objectsArray = [];
|
|
|
|
//Print Error
|
|
var printError = function (error) {
|
|
$mdToast.show({
|
|
template: '<md-toast>' + error.html + '</md-toast>',
|
|
position: 'bottom left',
|
|
hideDelay: 5000,
|
|
});
|
|
if ($scope._rules_blocked) {
|
|
$scope._rules_blocked = false;
|
|
}
|
|
};
|
|
|
|
//Functions
|
|
|
|
$scope.fileSearchFilter = function (search) {
|
|
if (search) {
|
|
DataFactory.filters.set(objectsArray['/rules'], 'search', search);
|
|
} else {
|
|
DataFactory.filters.unset(objectsArray['/rules'], 'search');
|
|
}
|
|
};
|
|
|
|
$scope.rulesApplyFilter = function (filterObj) {
|
|
if (!filterObj) {
|
|
return null;
|
|
}
|
|
if (filterObj.type == 'file') {
|
|
_file = filterObj.value;
|
|
DataFactory.filters.set(objectsArray['/rules'], 'file', filterObj.value);
|
|
} else if (filterObj.type == 'group') {
|
|
_group = filterObj.value;
|
|
DataFactory.filters.set(objectsArray['/rules'], 'group', filterObj.value);
|
|
} else if (filterObj.type == 'pci') {
|
|
_pci = filterObj.value;
|
|
DataFactory.filters.set(objectsArray['/rules'], 'pci', filterObj.value);
|
|
}
|
|
};
|
|
|
|
$scope.rulesHasFilter = function (type) {
|
|
if (type == 'file') {
|
|
return _file && _file != null;
|
|
} else if (type == 'group') {
|
|
return _group && _group != null;
|
|
} else if (type == 'pci') {
|
|
return _pci && _pci != null;
|
|
}
|
|
};
|
|
|
|
$scope.rulesUnset = function (type) {
|
|
if (type == 'file') {
|
|
_file = null;
|
|
DataFactory.filters.unset(objectsArray['/rules'], 'file');
|
|
} else if (type == 'group') {
|
|
_group = null;
|
|
DataFactory.filters.unset(objectsArray['/rules'], 'group');
|
|
} else if (type == 'pci') {
|
|
_pci = null;
|
|
DataFactory.filters.unset(objectsArray['/rules'], 'pci');
|
|
}
|
|
};
|
|
|
|
$scope.rulesGetFilter = function (type) {
|
|
if (type == 'file') {
|
|
return _file;
|
|
} else if (type == 'group') {
|
|
return _group;
|
|
} else if (type == 'pci') {
|
|
return _pci;
|
|
}
|
|
};
|
|
|
|
$scope.filtersSearch = function (search) {
|
|
var defered = $q.defer();
|
|
var promise = defered.promise;
|
|
|
|
var result = [];
|
|
|
|
if (!search) {
|
|
search = undefined;
|
|
}
|
|
|
|
DataFactory.getAndClean('get', '/rules/files', { 'offset': 0, 'limit': 100, 'search': search })
|
|
.then(function (data) {
|
|
angular.forEach(data.data.items, function (value) {
|
|
result.push({ 'type': 'file', 'value': value.name });
|
|
});
|
|
DataFactory.getAndClean('get', '/rules/groups', { 'offset': 0, 'limit': 100, 'search': search })
|
|
.then(function (data) {
|
|
angular.forEach(data.data.items, function (value) {
|
|
result.push({ 'type': 'group', 'value': value });
|
|
});
|
|
DataFactory.getAndClean('get', '/rules/pci', { 'offset': 0, 'limit': 100, 'search': search })
|
|
.then(function (data) {
|
|
angular.forEach(data.data.items, function (value) {
|
|
result.push({ 'type': 'pci', 'value': value });
|
|
});
|
|
defered.resolve(result);
|
|
}, function (data) {
|
|
printError(data);
|
|
defered.reject();
|
|
})
|
|
}, function (data) {
|
|
printError(data);
|
|
defered.reject();
|
|
})
|
|
}, function (data) {
|
|
printError(data);
|
|
defered.reject();
|
|
})
|
|
|
|
return promise;
|
|
};
|
|
|
|
$scope.rulesLevelFilter = function () {
|
|
if (!$scope.minLevel || !$scope.maxLevel || $scope.minLevel == null || $scope.maxLevel == null) {
|
|
return null;
|
|
}
|
|
if (0 <= parseInt($scope.minLevel) <= parseInt($scope.maxLevel) <= 15) {
|
|
DataFactory.filters.set(objectsArray['/rules'], 'level', $scope.minLevel + '-' + $scope.maxLevel);
|
|
}
|
|
};
|
|
|
|
$scope.rulesStatusFilter = function (status) {
|
|
DataFactory.filters.set(objectsArray['/rules'], 'status', status);
|
|
};
|
|
|
|
$scope.rulesObj = {
|
|
//Obj with methods for virtual scrolling
|
|
getItemAtIndex: function (index) {
|
|
if ($scope._rules_blocked) {
|
|
return null;
|
|
}
|
|
var _pos = index - DataFactory.getOffset(objectsArray['/rules']);
|
|
if (DataFactory.filters.flag(objectsArray['/rules'])) {
|
|
$scope._rules_blocked = true;
|
|
DataFactory.scrollTo(objectsArray['/rules'], 50)
|
|
.then(function (data) {
|
|
$scope.rules.length = 0;
|
|
$scope.rules = data.data.items;
|
|
DataFactory.filters.unflag(objectsArray['/rules']);
|
|
$scope._rules_blocked = false;
|
|
}, printError);
|
|
} else if ((_pos > 70) || (_pos < 0)) {
|
|
$scope._rules_blocked = true;
|
|
DataFactory.scrollTo(objectsArray['/rules'], index)
|
|
.then(function (data) {
|
|
$scope.rules.length = 0;
|
|
$scope.rules = data.data.items;
|
|
$scope._rules_blocked = false;
|
|
}, printError);
|
|
} else {
|
|
return $scope.rules[_pos];
|
|
}
|
|
},
|
|
getLength: function () {
|
|
return DataFactory.getTotalItems(objectsArray['/rules']);
|
|
},
|
|
};
|
|
|
|
var load = function () {
|
|
DataFactory.initialize('get', '/rules', {}, 100, 0)
|
|
.then(function (data) {
|
|
objectsArray['/rules'] = data;
|
|
DataFactory.get(objectsArray['/rules'])
|
|
.then(function (data) {
|
|
$scope.rules = data.data.items;
|
|
DataFactory.filters.register(objectsArray['/rules'], 'search', 'string');
|
|
DataFactory.filters.register(objectsArray['/rules'], 'file', 'string');
|
|
DataFactory.filters.register(objectsArray['/rules'], 'group', 'string');
|
|
DataFactory.filters.register(objectsArray['/rules'], 'pci', 'string');
|
|
DataFactory.filters.register(objectsArray['/rules'], 'level', 'string');
|
|
DataFactory.filters.register(objectsArray['/rules'], 'status', 'string');
|
|
DataFactory.filters.register(objectsArray['/rules'], 'filter-sort', 'string');
|
|
DataFactory.filters.set(objectsArray['/rules'], 'filter-sort', '-level');
|
|
$scope.load = false;
|
|
}, printError);
|
|
}, printError);
|
|
};
|
|
|
|
//Load
|
|
load();
|
|
|
|
//Destroy
|
|
$scope.$on("$destroy", function () {
|
|
angular.forEach(objectsArray, function (value) {
|
|
DataFactory.clean(value)
|
|
});
|
|
});
|
|
|
|
});
|
|
|
|
app.controller('decodersController', function ($scope, $q, $sce, DataFactory, $mdToast) {
|
|
|
|
//Initialisation
|
|
$scope.load = true;
|
|
|
|
$scope.decoders = [];
|
|
|
|
$scope.typeFilter = 'all';
|
|
|
|
var _lastFile = undefined;
|
|
var objectsArray = [];
|
|
|
|
//Print Error
|
|
var printError = function (error) {
|
|
$mdToast.show({
|
|
template: '<md-toast>' + error.html + '</md-toast>',
|
|
position: 'bottom left',
|
|
hideDelay: 5000,
|
|
});
|
|
if ($scope._decoders_blocked) {
|
|
$scope._decoders_blocked = false;
|
|
}
|
|
};
|
|
|
|
$scope.colorRegex = function (regex) {
|
|
regex = regex.toString();
|
|
var colors = ['blue', 'cadetblue', 'chocolate', 'darkgoldenrod', 'darkmagenta', 'darkred', 'darksalmon', 'dodgerblue', 'green',
|
|
'indigo', 'orange', 'purple', 'sienna', 'yellowgreen'];
|
|
var valuesArray = regex.match(/\(((?!<\/span>).)*?\)(?!<\/span>)/gmi);
|
|
var coloredString = regex;
|
|
for (var i = 0; i < valuesArray.length; i++) {
|
|
coloredString = coloredString.replace(/\(((?!<\/span>).)*?\)(?!<\/span>)/mi, '<span style="color: ' + colors[i] + ' ">' + valuesArray[i] + '</span>');
|
|
}
|
|
return $sce.trustAsHtml(coloredString);
|
|
};
|
|
|
|
$scope.colorOrder = function (order) {
|
|
order = order.toString();
|
|
var colors = ['blue', 'cadetblue', 'chocolate', 'darkgoldenrod', 'darkmagenta', 'darkred', 'darksalmon', 'dodgerblue', 'green',
|
|
'indigo', 'orange', 'purple', 'sienna', 'yellowgreen'];
|
|
var valuesArray = order.split(',');
|
|
var coloredString = order;
|
|
for (var i = 0; i < valuesArray.length; i++) {
|
|
coloredString = coloredString.replace(valuesArray[i], '<span style="color: ' + colors[i] + ' ">' + valuesArray[i] + '</span>');
|
|
}
|
|
return $sce.trustAsHtml(coloredString);
|
|
};
|
|
|
|
$scope.decoderSearchFilter = function (search) {
|
|
if (!search) {
|
|
DataFactory.filters.unset(objectsArray['/decoders'], 'search');
|
|
} else {
|
|
DataFactory.filters.set(objectsArray['/decoders'], 'search', search);
|
|
}
|
|
}
|
|
|
|
$scope.decoderFileFilter = function (file) {
|
|
if (!file) {
|
|
DataFactory.filters.unset(objectsArray['/decoders'], 'file');
|
|
} else {
|
|
_lastFile = file;
|
|
DataFactory.filters.set(objectsArray['/decoders'], 'file', file);
|
|
}
|
|
}
|
|
|
|
$scope.decoderTypeFilter = function (type) {
|
|
DataFactory.clean(objectsArray['/decoders']);
|
|
DataFactory.initialize('get', (type == 'parents') ? '/decoders/parents' : '/decoders', {}, 100, 0)
|
|
.then(function (data) {
|
|
objectsArray['/decoders'] = data;
|
|
DataFactory.get(objectsArray['/decoders'])
|
|
.then(function (data) {
|
|
$scope.decoders = data.data.items;
|
|
DataFactory.filters.register(objectsArray['/decoders'], 'search', 'string');
|
|
(type != 'parents') ? DataFactory.filters.register(objectsArray['/decoders'], 'file', 'string') : null;
|
|
$scope.decoderSearchFilter($scope.decoderSearch);
|
|
(type != 'parents') ? $scope.decoderFileFilter(_lastFile) : null;
|
|
}, printError);
|
|
}, printError);
|
|
}
|
|
|
|
$scope.fileSearch = function (search) {
|
|
var defered = $q.defer();
|
|
var promise = defered.promise;
|
|
|
|
if (!search) {
|
|
search = undefined;
|
|
}
|
|
|
|
DataFactory.getAndClean('get', '/decoders/files', { 'offset': 0, 'limit': 100, 'search': search })
|
|
.then(function (data) {
|
|
defered.resolve(data.data.items);
|
|
}, function (data) {
|
|
printError(data);
|
|
defered.reject();
|
|
})
|
|
|
|
return promise;
|
|
};
|
|
|
|
$scope.decodersObj = {
|
|
//Obj with methods for virtual scrolling
|
|
getItemAtIndex: function (index) {
|
|
if ($scope._decoders_blocked) {
|
|
return null;
|
|
}
|
|
var _pos = index - DataFactory.getOffset(objectsArray['/decoders']);
|
|
if (DataFactory.filters.flag(objectsArray['/decoders'])) {
|
|
$scope._decoders_blocked = true;
|
|
DataFactory.scrollTo(objectsArray['/decoders'], 50)
|
|
.then(function (data) {
|
|
$scope.decoders.length = 0;
|
|
$scope.decoders = data.data.items;
|
|
DataFactory.filters.unflag(objectsArray['/decoders']);
|
|
$scope._decoders_blocked = false;
|
|
}, printError);
|
|
} else if ((_pos > 70) || (_pos < 0)) {
|
|
$scope._decoders_blocked = true;
|
|
DataFactory.scrollTo(objectsArray['/decoders'], index)
|
|
.then(function (data) {
|
|
$scope.decoders.length = 0;
|
|
$scope.decoders = data.data.items;
|
|
$scope._decoders_blocked = false;
|
|
}, printError);
|
|
} else {
|
|
return $scope.decoders[_pos];
|
|
}
|
|
},
|
|
getLength: function () {
|
|
return DataFactory.getTotalItems(objectsArray['/decoders']);
|
|
},
|
|
};
|
|
|
|
var load = function () {
|
|
DataFactory.initialize('get', '/decoders', {}, 100, 0)
|
|
.then(function (data) {
|
|
objectsArray['/decoders'] = data;
|
|
DataFactory.get(objectsArray['/decoders'])
|
|
.then(function (data) {
|
|
$scope.decoders = data.data.items;
|
|
DataFactory.filters.register(objectsArray['/decoders'], 'search', 'string');
|
|
DataFactory.filters.register(objectsArray['/decoders'], 'file', 'string');
|
|
$scope.load = false;
|
|
}, printError);
|
|
}, printError);
|
|
};
|
|
|
|
//Load
|
|
load();
|
|
|
|
//Destroy
|
|
$scope.$on("$destroy", function () {
|
|
angular.forEach(objectsArray, function (value) {
|
|
DataFactory.clean(value)
|
|
});
|
|
$scope.decoders.length = 0;
|
|
});
|
|
});
|
|
|
|
|
|
app.controller('updateRulesetController', function ($scope, $q, DataFactory, tabProvider, $mdDialog, $mdToast) {
|
|
//Initialisation
|
|
$scope.load = true;
|
|
|
|
$scope.backups = [];
|
|
|
|
$scope.updateType = 'b';
|
|
$scope.updateForce = false;
|
|
|
|
$scope.menuNavItem = 'ruleset';
|
|
$scope.submenuNavItem = 'update';
|
|
|
|
$scope.pageId = (Math.random().toString(36).substring(3));
|
|
tabProvider.register($scope.pageId);
|
|
|
|
var objectsArray = [];
|
|
|
|
//Print Error
|
|
var printError = function (error) {
|
|
$mdToast.show({
|
|
template: '<md-toast>' + error.html + '</md-toast>',
|
|
position: 'bottom left',
|
|
hideDelay: 5000,
|
|
});
|
|
}
|
|
|
|
//Tabs
|
|
$scope.setTab = function (tab, group) {
|
|
tabProvider.setTab($scope.pageId, tab, group);
|
|
};
|
|
|
|
$scope.isSetTab = function (tab, group) {
|
|
return tabProvider.isSetTab($scope.pageId, tab, group);
|
|
};
|
|
|
|
//Functions
|
|
|
|
//Backups
|
|
|
|
$scope.updateRuleset = function (ev) {
|
|
if (!$scope.updateType) {
|
|
$mdToast.show({
|
|
template: '<md-toast>Select an update type</md-toast>',
|
|
position: 'bottom left',
|
|
hideDelay: 5000,
|
|
});
|
|
}
|
|
if ($scope.updateForce) {
|
|
var template = 'Are you sure you want to update the ruleset? The ruleset will be overwritten, except local_rules and local_decoders file. OSSEC manager is going to be restarted. Before the update, backup of the ruleset will be done.';
|
|
}
|
|
else {
|
|
var template = 'Are you sure you want to update the ruleset? The ruleset will be overwritten, except local_rules and local_decoders file. If any rule included in ossec.conf is updated, OSSEC manager will be restarted. Before the update, backup of the ruleset will be done.';
|
|
}
|
|
var confirm = $mdDialog.confirm()
|
|
.title('Update ruleset')
|
|
.textContent(template)
|
|
.targetEvent(ev)
|
|
.ok('Update')
|
|
.cancel('Cancel');
|
|
|
|
$mdDialog.show(confirm).then(function () {
|
|
if ($scope.updateForce) {
|
|
if ($scope.updateType == 'r') {
|
|
var path = '/manager/update-ruleset?force=yes&type=rules';
|
|
} else if ($scope.updateType == 'c') {
|
|
var path = '/manager/update-ruleset?force=yes&type=rootchecks';
|
|
} else {
|
|
var path = '/manager/update-ruleset?force=yes';
|
|
}
|
|
} else {
|
|
if ($scope.updateType == 'r') {
|
|
var path = '/manager/update-ruleset?type=rules';
|
|
} else if ($scope.updateType == 'c') {
|
|
var path = '/manager/update-ruleset?type=rootchecks';
|
|
} else {
|
|
var path = '/manager/update-ruleset';
|
|
}
|
|
}
|
|
DataFactory.getAndClean('put', path, {})
|
|
.then(function (data) {
|
|
var alert = data.data.msg + '. ';
|
|
if (data.data.need_restart === 'yes' && (data.data.restarted === 'no' || data.data.restart_status === 'fail')) {
|
|
alert += "The manager needs to be manually restarted.";
|
|
} else if (data.data.restarted === 'yes') {
|
|
alert += "The manager has been restarted. ";
|
|
}
|
|
if (data.data.manual_steps !== 'no') {
|
|
alert += "The following manual steps are required: " + data.data.manual_steps_detail;
|
|
}
|
|
$mdToast.show({
|
|
template: '<md-toast>' + alert + '</md-toast>',
|
|
position: 'bottom left',
|
|
hideDelay: 5000,
|
|
});
|
|
$scope.load_backups();
|
|
}, printError);
|
|
});
|
|
};
|
|
|
|
$scope.restoreBackup = function (ev) {
|
|
var template = 'Are you sure you want to restore this backup? This action can not be undone.';
|
|
var confirm = $mdDialog.confirm()
|
|
.title('Restore backup')
|
|
.textContent(template)
|
|
.targetEvent(ev)
|
|
.ok('Restore')
|
|
.cancel('Cancel');
|
|
|
|
$mdDialog.show(confirm).then(function () {
|
|
DataFactory.getAndClean('put', '/manager/update-ruleset/backups/' + $scope.selectedBackup, {})
|
|
.then(function (data) {
|
|
var alert;
|
|
if (data.data.msg === 'Backup successfully') {
|
|
alert = 'Backup successfuly restored. ';
|
|
}
|
|
if (data.data.need_restart === 'yes' && (data.data.restarted === 'no' || data.data.restart_status === 'fail')) {
|
|
alert += "The manager needs to be manually restarted.";
|
|
} else if (data.data.restarted === 'yes') {
|
|
alert += "The manager has been restarted";
|
|
}
|
|
if (data.data.manual_steps !== 'no') {
|
|
alert += "The following manual steps are required: " + data.data.manual_steps_detail;
|
|
}
|
|
$mdToast.show({
|
|
template: '<md-toast>' + alert + '</md-toast>',
|
|
position: 'bottom left',
|
|
hideDelay: 5000,
|
|
});
|
|
}, printError);
|
|
});
|
|
};
|
|
|
|
//Load functions
|
|
|
|
$scope.load_backups = function () {
|
|
var defered = $q.defer();
|
|
var promise = defered.promise;
|
|
|
|
DataFactory.getAndClean('get', '/manager/update-ruleset/backups', {})
|
|
.then(function (data) {
|
|
defered.resolve();
|
|
$scope.backups.length = 0;
|
|
$scope.backups = data.data;
|
|
}, function (error) {
|
|
printError(error);
|
|
defered.reject();
|
|
});
|
|
|
|
return promise;
|
|
};
|
|
|
|
var load = function () {
|
|
$scope.load = false;
|
|
};
|
|
|
|
//Load
|
|
load();
|
|
|
|
//Destroy
|
|
$scope.$on("$destroy", function () {
|
|
angular.forEach(objectsArray, function (value) {
|
|
DataFactory.clean(value)
|
|
});
|
|
tabProvider.clean($scope.pageId);
|
|
});
|
|
|
|
});
|