// SOAP templates
var tmplAddAlarmComment = '' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.AlarmID}}' +
' {{.Comments}}' +
' ' +
' ' +
'';
var tmplGetAlarmByID =
'' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
" " +
' {{.AlarmID}}' +
' ' +
' ' +
'';
var tmplGetAlarmEventsByID = '' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.AlarmID}}' +
' {{.IncludeRawLog}}' +
' ' +
' ' +
'';
var tmplGetAlarmHistoryByID = '' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.AlarmID}}' +
' {{.IncludeNotifications}}' +
' {{.IncludeComments}}' +
' ' +
' ' +
'';
var tmplUpdateAlarmStatus = '' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.AlarmID}}' +
' {{.Status}}' +
' {{.Comments}}' +
' ' +
' ' +
'';
var tmplGetFirstPageAlarmsByAlarmStatus =
'' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
" " +
' {{.StartDate}}' +
' {{.EndDate}}' +
' {{.Status}}' +
' {{.AllUsers}}' +
' {{.MaxResultsPerPage}}' +
' ' +
' ' +
''
var tmplGetNextPageAlarms = '' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.NextPageID}}' +
' ' +
' ' +
'';
var tmplGetHostByEntity = '' +
' ' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.EntityId}}' +
' ' +
' ' +
'';
var tmplAddHost1 = '' +
'' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' ' +
' {{.EntityId}}' +
' {{.Hostname}}' +
' ';
var tmplAddHostIdentifier = ' ' +
' {{.Type}}' +
' {{.Value}}' +
' true' +
' '
var tmplAddHost2 = ' ' +
' {{.ShortDesc}}' +
' {{.LongDesc}}' +
' {{.DateUpdated}}' +
' {{.RiskThreshold}}' +
' {{.OsType}}' +
' {{.OsVersion}}' +
' {{.ThreatThreshold}}' +
' ' +
' ' +
' ' +
''
var tmpExecuteQuery = ' ' +
' ' +
' ' +
' ' +
' {{.Username}}' +
' {{.Password}}' +
' ' +
' ' +
' ' +
' ' +
' ' +
' ' +
' false' +
' ' +
' ' +
' 100' +
' ' +
' ' +
' NormalMsgDateRange' +
' FilterIn' +
' And' +
' ' +
' DateRange' +
' ' +
' ' +
' {{.StartDate}}' +
' {{.EndDate}}' +
' ' +
' ' +
' ' +
' false' +
' ' +
' ' +
' Message' +
' FilterIn' +
' And' +
' ' +
' String' +
' ' +
' {{.Keyword}}' +
' ' +
' ' +
' false' +
' ' +
' ' +
' true' +
' false' +
' ' +
' 0' +
' 0' +
' 100' +
' ' +
' 1' +
' ' +
' false' +
' ' +
' ' +
' ' +
''
// global variables and helper functions
var soapActionURIGetNextPageAlarms = 'http://www.logrhythm.com/webservices/AlarmService/GetNextPageAlarms';
var soapActionURIGetFirstPageAlarmsByAlarmStatus = 'http://www.logrhythm.com/webservices/AlarmService/GetFirstPageAlarmsByAlarmStatus';
var logRhythmAlarmAPI = params.use_ntlm ? 'AlarmServiceWindowsAuth.svc' : 'AlarmServiceBasicAuth.svc';
var logRhythmHostAPI = params.use_ntlm ? 'HostServiceWindowsAuth.svc' : 'HostServiceBasicAuth.svc';
var logRhythmQueryAPI = params.use_ntlm ? 'LogQueryServiceWindowsAuth.svc' : 'LogQueryServiceBasicAuth.svc';
var defaultAlarmsPageSize = 2000;
var defaultCount = 1000;
var alarmsFieldsToRemove = ["EntityID","LastUpdatedID","LastUpdatedName","DateInserted","DateUpdated","EventDateFirst","EventDateLast","EventCount","RuleID"];
var hostsFieldsToRemove = ["Key","Identifiers"];
var myTimezone = new Date().getTimezoneOffset();
var tz = params.timeZone ? parseInt(params.timeZone) : myTimezone;
var fixUrl = function(base) {
res = base;
if (base && base[base.length - 1] != '/') {
res = res + '/';
}
return res + 'LogRhythm.API/Services/';
};
var getRequestUrl = function(api) {
var url;
// includes server URL that starts with http or https
if (params.Host.startsWith('http')) {
url = fixUrl(params.Host) + api;
}
else {
url = 'https://' + fixUrl(params.Host) + api;
}
return url;
};
var getRaw = function(url) {
username = params.Credentials.identifier.split('\\')[1]
password = params.Credentials.password
domain = params.domain
if (params.use_ntlm) {
res = http(
url,
{
AuthProtocol:['NTLM'],
Username: username,
Password: password,
Domain: domain,
Method: 'GET'
},
params.Insecure,
params.useproxy
);
} else {
res = http(
url,
{
Method: 'GET',
},
params.Insecure,
params.useproxy
);
}
return res;
};
var fixTemplate = function(template, data) {
var keys = Object.keys(data);
for (var i = 0 ; i < keys.length; i++) {
var key = keys[i];
template = template.replace('{{.'+key+'}}',data[key]);
}
return template;
};
var sendRequest = function(envelope, soapAction, apiUrl) {
username = params.Credentials.identifier.split('\\')[1]
password = params.Credentials.password
domain = params.domain
url = getRequestUrl(apiUrl)
if (params.use_ntlm) {
res = http(
url,
{
Method: 'POST',
AuthProtocol:['NTLM'],
Username: username,
Password: password,
Domain: domain,
Body: envelope,
Headers: {
'Content-Type': ['text/xml'],
Soapaction: [soapAction]
}
},
params.Insecure,
params.useproxy
);
} else {
res = http(
url,
{
Method: 'POST',
Body: envelope,
Headers: {
'Content-Type': ['text/xml; charset=utf-8'],
Soapaction: [soapAction]
}
},
params.Insecure,
params.useproxy
);
}
if (res.StatusCode < 200 || res.StatusCode >= 300) {
throw 'Request to LogRhythm ' + url + ' failed, request status code: ' + res.StatusCode + ' and Body: ' + res.Body + '.';
}
return res.Body;
};
var parseResponse = function(body) {
return JSON.parse(x2j(body));
};
var doBatch = function(envelope, action, count, pageSize) {
var alarmPath = 'Envelope.Body.GetFirstPageAlarmsByAlarmStatusResponse.GetFirstPageAlarmsByAlarmStatusResult.Alarms.AlarmSummaryDataModel';
var hasMorePath = 'Envelope.Body.GetFirstPageAlarmsByAlarmStatusResponse.GetFirstPageAlarmsByAlarmStatusResult.HasMoreResults';
var nextPagePath = 'Envelope.Body.GetFirstPageAlarmsByAlarmStatusResponse.GetFirstPageAlarmsByAlarmStatusResult.NextPageID';
var alarms = [];
var res = parseResponse(sendRequest(envelope, action, logRhythmAlarmAPI));
while (true) {
var alarmObj = dq(res,alarmPath);
if (!alarmObj) {
break;
}
if (alarmObj.length) {
alarms = alarms.concat(alarmObj);
} else {
alarms.push(alarmObj);
}
var hasMore = dq(res,hasMorePath);
var nextPage = dq(res,nextPagePath);
if (!hasMore || count <= pageSize || count <= alarms.length || !nextPage) {
break;
}
var obj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
NextPageID: nextPage
};
var nextEnvelope = fixTemplate(tmplGetNextPageAlarms, obj);
res = parseResponse(sendRequest(nextEnvelope, soapActionURIGetNextPageAlarms, logRhythmAlarmAPI));
alarmPath = 'Envelope.Body.GetNextPageAlarmsResponse.GetNextPageAlarmsResult.Alarms.AlarmSummaryDataModel';
hasMorePath = 'Envelope.Body.GetNextPageAlarmsResponse.GetNextPageAlarmsResult.HasMoreResults';
nextPagePath = 'Envelope.Body.GetNextPageAlarmsResponse.GetNextPageAlarmsResult.NextPageID';
}
alarms.forEach(function(element) {
alarmsFieldsToRemove.forEach(function(field){
delete element[field];
});
});
return alarms.length > count ? alarms.slice(0,count) : alarms;
};
function fixDictionaryKeys(dict){
//remove the word 'Alarm' from dictionary keys (e.g AlarmID to ID)
Object.keys(dict).forEach(function(key) {
if(key.indexOf("Alarm") !== -1){
var newkey = key.replace('Alarm', '');
dict[newkey] = dict[key];
delete dict[key];
}
});
}
function getAlarmsData(allUsers, count, pageSize, startDate, endDate, status, dataObj) {
dataObj.StartDate = startDate;
dataObj.EndDate = endDate;
dataObj.Status = status;
dataObj.AllUsers = allUsers;
dataObj.MaxResultsPerPage = pageSize;
var envelope = fixTemplate(tmplGetFirstPageAlarmsByAlarmStatus, dataObj);
return doBatch(envelope, soapActionURIGetFirstPageAlarmsByAlarmStatus, count, pageSize);
}
var prepareDetailsString = function(al) {
return JSON.stringify(
{
AlarmRuleID: al.AlarmRuleID,
AlarmStatus: al.AlarmStatus,
EntityID: al.EntityID,
LastUpdatedID: al.LastUpdatedID,
EventCount: al.EventCount,
EventDateFirst: al.EventDateFirst,
EventDateLast: al.EventDateLast,
RBPAvg: al.RBPAvg,
RBPMax: al.RBPMax,
DateInserted: al.DateInserted,
DateUpdated: al.DateUpdated,
AlarmRuleName: al.AlarmRuleName,
EntityName: al.EntityName,
LastUpdatedName: al.LastUpdatedName
}
);
};
var getOccurredTime = function(al) {
var occurred = new Date();
if (al.AlarmDate) {
var hour = tz / 60;
var minute = tz % 60;
var tzPrefix = tz < 0 ? '-' : '+';
var hourstr = hour +'';
if (hourstr.length < 2) {
hourstr = '0' + hourstr;
}
var minutestr = minute +'';
if (minutestr.length < 2) {
minutestr = '0' + minutestr;
}
occurred = new Date(Date.parse(al.AlarmDate + tzPrefix + hourstr + minutestr));
}
return occurred;
};
var alarmsToIncident = function(alarmList, lastRun) {
var incs = [];
var orgLastId = lastRun.lastId;
for (var i = 0; i < alarmList.length; i++) {
logDebug("Got alarm from LR",JSON.stringify(alarmList[i]));
inc = {
name: 'LogRhythm alarm ' + alarmList[i].AlarmID,
occurred: getOccurredTime(alarmList[i]),
created: new Date(),
details: prepareDetailsString(alarmList[i]),
rawJSON: JSON.stringify(alarmList[i])
};
// Check that it is in the time range and in the id range
var alarmIdInt = parseInt(alarmList[i].AlarmID);
if (alarmIdInt && alarmIdInt <= orgLastId) {
continue;
}
if (alarmIdInt > lastRun.lastId) {
lastRun.lastId = alarmIdInt;
}
if (inc.occurred.getTime() > lastRun.lastTime) {
lastRun.lastTime = inc.occurred.getTime();
}
incs.push(inc);
}
setLastRun(lastRun);
logDebug("LogRythm: lastRun is",JSON.stringify(lastRun));
logDebug("LogRythm: returning incs",JSON.stringify(incs));
return JSON.stringify(incs);
};
function getTimeFrame(timeFrame, startArg, endArg){
var start = new Date();
var end = new Date();
switch(timeFrame){
case 'Today':
start = new Date(end.getFullYear(), end.getMonth(), end.getDate(), 0, 0, 0, 0);
break;
case 'LastHour':
start.setHours(new Date().getHours() - 1);
break;
case 'Last2Days':
start.setDate(start.getDate()-2);
break;
case 'LastWeek':
start.setDate(start.getDate()-7);
break;
case 'LastMonth':
start.setDate(start.getDate()-30);
break;
case 'Custom':
if(!startArg){
throw 'start-date argument is missing';
}
if(!endArg){
throw 'end-date argument is missing';
}
start = new Date(startArg);
end = new Date(endArg);
}
return {
start: start.toISOString(),
end: end.toISOString()
};
}
var getDateAsString = function(d) {
return d.toISOString();
}
function processAlarmEventsMd(mdRaw){
// flattening the AlarmEvents structure
var processedMd = {};
mdRaw = mdRaw['LogDataModel'];
Object.keys(mdRaw).forEach(function(key) {
if (mdRaw[key] === undefined || mdRaw[key] === "" || mdRaw[key] === "NaN") {
return;
}
else if (typeof (mdRaw[key]) === 'object'){
var inputString = "";
Object.keys(mdRaw[key]).forEach(function(innerKey) {
inputString += innerKey + ":" + mdRaw[key][innerKey] + "\n";
});
processedMd[key] = inputString;
} else {
processedMd[key] = mdRaw[key];
}
});
return processedMd;
}
// commands functions
function addAlarmComments(args){
// corresponds to lr-add-alarm-comments command. Adds a comment to an alarm
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
AlarmID: args['alarm-id'],
Comments: args['comments']
};
var soapActionURIAddAlarmComments = 'http://www.logrhythm.com/webservices/AlarmService/AddAlarmComments';
var envelope = fixTemplate(tmplAddAlarmComment, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIAddAlarmComments, logRhythmAlarmAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.AddAlarmCommentsResponse.AddAlarmCommentsResult');
fixDictionaryKeys(mdRaw);
var md = 'LogRhythm added alarm comment ' + args['comments'] + ' for ID: ' + args['alarm-id'];
var ec= {};
ec["LogRhythm.Alarm(val.ID && val.ID == " + args['alarm-id'] + ")"] = {'ID' : args['alarm-id']};
ec["LogRhythm.Alarm(val.ID && val.ID == " + args['alarm-id'] + ").Comment"] = [args['comments']];
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
}
function getAlarmById(args){
// corresponds to lr-get-alarm-by-id command. Get the data by a specific alarm id
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
AlarmID: args['alarm-id']
};
var soapActionURIGetAlarmByID = 'http://www.logrhythm.com/webservices/AlarmService/GetAlarmByID';
var envelope = fixTemplate(tmplGetAlarmByID, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIGetAlarmByID, logRhythmAlarmAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.GetAlarmByIDResponse.GetAlarmByIDResult');
if (mdRaw['-i']) {
delete mdRaw['-i'];
}
fixDictionaryKeys(mdRaw);
alarmsFieldsToRemove.forEach(function(field){
delete mdRaw[field];
});
var md = tableToMarkdown('LogRhythm alarm for ID: ' + args['alarm-id'], mdRaw);
var ec = {};
ec["LogRhythm.Alarm(val.ID && val.ID == " + mdRaw['ID'] + ")"] = mdRaw;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
}
function getAlarmEventsById(args){
// corresponds to lr-get-alarm-events-by-id command. Get the alarm's events by a specific alarm id
var fieldsToRemove = ["Bytes","ClassificationID","ClassificationTypeName","CommonEventID","DirectionName","EntityID","ImpactedZone",
"ImpactedEntityID","ImpactedHostID","ImpactedLocation","ImpactedLocationID","ImpactedNATPort","ImpactedNetwork","ImpactedNetworkID",
"ImpactedPort","LogDate","LogSourceHost","LogSourceHostID","LogSourceID","LogSourceType","LogSourceTypeName","Login","MPERuleID",
"MPERuleName","MessageID","NormalDateMax","OriginEntityID","OriginHostID","OriginLocation","OriginLocationID","LogSourceHostName",
"OriginNATPort","OriginName","OriginNetwork","OriginNetworkID","OriginPort","Priority","ProcessID","ProtocolID","Direction",
"SequenceNumber","ServiceID","ServiceName","Count","DateInserted","OriginZone","MessageType","EntityName","ImpactedHostID"];
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
AlarmID: args['alarm-id'],
IncludeRawLog: args['include-raw-log'] === 'true'
};
var soapActionURIGetAlarmsEventsByID = 'http://www.logrhythm.com/webservices/AlarmService/GetAlarmEventsByID';
var envelope = fixTemplate(tmplGetAlarmEventsByID, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIGetAlarmsEventsByID, logRhythmAlarmAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.GetAlarmEventsByIDResponse.GetAlarmEventsByIDResult.Events')
if (mdRaw['-i']) {
delete mdRaw['-i'];
}
if(!mdRaw['LogDataModel']){
return {
Type: entryTypes.note,
Contents: "No events found for this alarm",
ContentsFormat: formats.text
};
}
var processedMd = processAlarmEventsMd(mdRaw);
fieldsToRemove.forEach(function(field){
delete processedMd[field];
});
var md = tableToMarkdown('LogRhythm alarm events for ID: ' + args['alarm-id'], processedMd);
var historyRow = {};
historyRow['ID'] = args['alarm-id'];
historyRow['Event'] = processedMd;
var ec = {};
ec['LogRhythm.Alarm(val.ID && val.ID == ' + args['alarm-id'] + ')'] = historyRow;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
}
function getAlarmHistoryById(args){
// corresponds to lr-get-alarm-history-by-id command. Get the alarm's history by a specific alarm id
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
AlarmID: args['alarm-id'],
IncludeComments: args['include-comments'] === 'true',
IncludeNotifications: args['include-notifications'] === 'true'
};
//Verify that at least one of the 2 are marked as true, else throw an error
if (!dataObj.IncludeNotifications && !dataObj.IncludeComments) {
throw 'At least one of "include-comments", "include-notifications" should be true';
}
var soapActionURIGetAlarmsHistoryByID = 'http://www.logrhythm.com/webservices/AlarmService/GetAlarmHistoryByID';
var envelope = fixTemplate(tmplGetAlarmHistoryByID, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIGetAlarmsHistoryByID, logRhythmAlarmAPI));
var md = "", mdRaw;
if (dataObj.IncludeNotifications) {
mdRaw = dq(jsResponse, 'Envelope.Body.GetAlarmHistoryByIDResponse.GetAlarmHistoryByIDResult.Notifications.AlarmNotificationDataModel')
md = tableToMarkdown('LogRhythm alarm notifications history for ID: ' + args['alarm-id'], mdRaw);
}
if (dataObj.IncludeComments) {
if (md.length > 0) {
md += '\n\n';
}
mdRaw = dq(jsResponse, 'Envelope.Body.GetAlarmHistoryByIDResponse.GetAlarmHistoryByIDResult.Comments.AlarmCommentDataModel')
md += tableToMarkdown('LogRhythm alarm comments history for ID: ' + args['alarm-id'], mdRaw);
}
var historyRow = {};
historyRow['ID'] = args['alarm-id'];
historyRow['History'] = mdRaw;
var ec = {};
ec['LogRhythm.Alarm(val.ID && val.ID == ' + args['alarm-id'] + ')'] = historyRow;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
}
function updateAlarmStatus(args){
// corresponds to lr-update-alarm-status command. Updates an alarm's current status
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
AlarmID: args['alarm-id'],
Status: args['status'],
Comments: (args.comments ? ('' + args.comments + '') : '')
};
var soapActionURIUpdateAlarmStatus = 'http://www.logrhythm.com/webservices/AlarmService/UpdateAlarmStatus';
var envelope = fixTemplate(tmplUpdateAlarmStatus, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIUpdateAlarmStatus, logRhythmAlarmAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.UpdateAlarmStatusResponse.UpdateAlarmStatusResult')
fixDictionaryKeys(mdRaw);
var md = 'LogRhythm alarm status updated for alarm: *' + args['alarm-id']+'* status: *' + args.status +'*';
var status = {
'Status' : args['status'],
'ID' : args['alarm-id']
};
var ec= {};
ec["LogRhythm.Alarm(val.ID && val.ID == " + args['alarm-id'] + ")"] = status;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext : ec
};
}
function getAlarms(dataArgs){
/* corresponds to lr-get-alarms command. Retrieves data about alarms in a particular time range.
time format follows iso 8601, for example: startDate="2017-03-27" */
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
};
var allUsers = dataArgs['all-users'] === 'true';
var count = dataArgs.count ? parseInt(dataArgs.count) : defaultCount;
count = count || defaultCount;
var pageSize = params.pageSize ? parseInt(params.pageSize) : defaultAlarmsPageSize;
pageSize = pageSize || defaultAlarmsPageSize;
if (count < pageSize) {
pageSize = count;
}
var timeFrame = getTimeFrame(dataArgs['time_frame'], dataArgs['start-date'], dataArgs['end-date']);
var alarms = getAlarmsData(allUsers, count, pageSize, timeFrame.start, timeFrame.end, dataArgs.status, dataObj);
var ec = {};
alarms.forEach(function(alarm) {
fixDictionaryKeys(alarm);
ec['LogRhythm.Alarm(val.ID && val.ID == ' + alarm['ID'] + ')'] = alarm;
});
if (alarms.length) {
var md = tableToMarkdown('', alarms);
return {
Type: entryTypes.note,
Contents: alarms,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
} else {
return {
Type: entryTypes.note,
Contents: "No results",
ContentsFormat: formats.text
};
}
}
function getHostsByEntityId(dataArgs){
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
EntityId: dataArgs['entity-id']
};
var soapActionURIUgethostbyentity = 'http://www.logrhythm.com/webservices/HostService/GetHostsByEntity';
var envelope = fixTemplate(tmplGetHostByEntity, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIUgethostbyentity, logRhythmHostAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.GetHostsByEntityResponse.GetHostsByEntityResult.HostDataModel')
if (mdRaw['-i']) {
delete mdRaw['-i'];
}
fixDictionaryKeys(mdRaw);
mdRaw.forEach(function(row){
hostsFieldsToRemove.forEach(function(field){
delete row[field];
});
});
var md = tableToMarkdown('LogRhythm hosts for entity ID: ' + args['entity-id'], mdRaw);
var ec = {};
ec["LogRhythm.Host(val.ID && val.ID == " + mdRaw['ID'] + ")"] = mdRaw;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
}
function addHost(dataArgs){
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
Hostname: dataArgs['host-name'],
EntityId: dataArgs['entity-id'],
ShortDesc: dataArgs['short-description'],
LongDesc: dataArgs['long-description'],
DateUpdated: new Date().toISOString(),
RiskThreshold: dataArgs['risk-threshold'],
OsType: dataArgs['os-type'],
OsVersion: dataArgs['os-version'],
ThreatThreshold: dataArgs['threat-threshold']
};
var soapActionURIUaddHost = 'http://www.logrhythm.com/webservices/HostService/AddHost';
var envelope = fixTemplate(tmplAddHost1, dataObj);
if(dataArgs['ip-address']){
envelope += fixTemplate(tmplAddHostIdentifier, {Type: 'IPAddress', Value: dataArgs['ip-address']});
}
if(dataArgs['dns-name']){
envelope += fixTemplate(tmplAddHostIdentifier, {Type: 'DNSName', Value: dataArgs['dns-name']});
}
if(dataArgs['windows-name']){
envelope += fixTemplate(tmplAddHostIdentifier, {Type: 'WindowsName', Value: dataArgs['windows-name']});
}
envelope += fixTemplate(tmplAddHost2, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIUaddHost, logRhythmHostAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.AddHostResponse.AddHostResult')
if (mdRaw['Succeeded'] == 'true'){
var host = {};
host["ShortDescription"] = dataObj['ShortDesc'];
host["LongDescription"] = dataObj['LongDesc'];
host["HostID"] = mdRaw['DataID'];
host["RecordStatus"] = 'NewRecord';
host["DateUpdated"] = dataObj['DateUpdated'];
host["ThreatThreshold"] = dataObj['ThreatThreshold'];
host["HostName"] = dataObj['Hostname'];
host["OSVersion"] = dataObj['OsVersion'];
host["RiskThreshold"] = dataObj['RiskThreshold'];
host["EntityID"] = dataObj['EntityId'];
host["OSType"] = dataObj['OsType'];
var ec = {};
ec["LogRhythm.Host"] = host;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: 'Host ' + dataArgs['host-name'] + ' added succesfuly',
EntryContext: ec
};
}
else{
throw mdRaw['Errors']['ErrorInfo']['ErrorMessage'];
}
}
function executeQuery(dataArgs){
var queryFieldsToRemove = ["Amount","Bytes","BytesIn","BytesOut","ClassificationID","ClassificationTypeName","CommonEventID","DirectionName","Domain","Duration","EntityID",
"ImpactedEntityName","ImpactedHostID","ImpactedIP","ImpactedInterface","ImpactedLocation","ImpactedLocationID","ImpactedMAC","ImpactedNATIP","ImpactedNATPort","ImpactedEntityID",
"ImpactedNetwork","ImpactedNetworkID","ImpactedPort","ImpactedZoneName","ItemsPacketsIn","ItemsPacketsOut","LogSourceHostID","LogSourceID","LogSourceType","MPERuleID",
"MessageID","OriginEntityID","OriginHostID","OriginIP","OriginInterface","OriginLocation","OriginLocationID","OriginLogin","OriginMAC","OriginNATIP","OriginNATPort",
"OriginNetwork","OriginNetworkID","OriginPort","OriginZoneName","Process","ProcessID","ProtocolID","ProtocolName","Quantity","Rate","Recipient","Sender","SequenceNumber",
"ServiceID","ServiceName","Size","URL","Version","Account","Command","Group","DateInserted","Login","NormalDate","NormalDateMax","Object","OriginName","Subject"];
var timeFrame = getTimeFrame(dataArgs['time_frame'], dataArgs['start-date'], dataArgs['end-date']);
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password,
Keyword: dataArgs['keyword'],
StartDate: timeFrame.start,
EndDate: timeFrame.end
};
var soapActionURIUexecuteQuery = 'http://www.logrhythm.com/webservices/LogQueryService/ExecuteQuery';
var envelope = fixTemplate(tmpExecuteQuery, dataObj);
var jsResponse = parseResponse(sendRequest(envelope, soapActionURIUexecuteQuery, logRhythmQueryAPI));
var mdRaw = dq(jsResponse, 'Envelope.Body.ExecuteQueryResponse.ExecuteQueryResult.LogDataModel');
if(mdRaw === undefined || mdRaw === null){
return {
Type: entryTypes.note,
Contents: "No results",
ContentsFormat: formats.text
};
}
if(Array.isArray(mdRaw)){
mdRaw.forEach(function(row){
queryFieldsToRemove.forEach(function(field){
delete row[field];
});
});
}
else{
queryFieldsToRemove.forEach(function(field){
delete mdRaw[field];
});
}
var md = tableToMarkdown('LogRhythm query results:', mdRaw);
var ec = {};
ec["LogRhythm.Log"] = mdRaw;
return {
Type: entryTypes.note,
Contents: jsResponse,
ContentsFormat: formats.json,
HumanReadable: md,
EntryContext: ec
};
}
function fetchIncidents(){
var dataObj = {
Username: params.Credentials.identifier,
Password: params.Credentials.password
};
var lastRun = getLastRun();
if (!lastRun || !lastRun.lastTime) {
lastRun = {
lastId: 0,
lastTime: new Date().getTime() - (10 * 60 * 1000)
}
}
var pageSize = params.pageSize ? parseInt(params.pageSize) : defaultAlarmsPageSize;
pageSize = pageSize || defaultAlarmsPageSize;
var alarms = getAlarmsData(true, pageSize, pageSize, getDateAsString(new Date(lastRun.lastTime)), getDateAsString(new Date()), 'New',dataObj);
if (alarms.length) {
return alarmsToIncident(alarms, lastRun);
}
return '[]';
}
// The command input arg holds the command sent from the user.
switch (command) {
// This is the call made when pressing the integration test button.
case 'test-module':
var url = params.use_ntlm ? getRequestUrl('AlarmServiceWindowsAuth.svc?singleWsdl') : getRequestUrl('AlarmServiceBasicAuth.svc?singleWsdl')
var resp = getRaw(url);
var alarmsArgs = {};
alarmsArgs['all-users'] = "true";
alarmsArgs['start-date'] = "2018-03-01";
alarmsArgs['end-date'] = "2018-03-30";
alarmsArgs['status'] = "New";
var alarmsResponse = getAlarms(alarmsArgs);
// if we get alarmsResponse.Type it means that no error was raised in getAlarms
if (resp.StatusCode === 200 && alarmsResponse.Type) {
return 'ok';
} else if (resp.Status) {
return resp.Status;
} else {
return resp;
}
break;
case 'lr-add-alarm-comments':
return addAlarmComments(args);
case 'lr-get-alarm-by-id':
return getAlarmById(args);
case 'lr-get-alarm-events-by-id':
return getAlarmEventsById(args);
case 'lr-get-alarm-history-by-id':
return getAlarmHistoryById(args);
case 'lr-update-alarm-status':
return updateAlarmStatus(args);
case 'lr-get-alarms':
return getAlarms(args);
case 'lr-get-hosts-by-entity-id':
return getHostsByEntityId(args);
case 'lr-add-host':
return addHost(args);
case 'lr-execute-query':
return executeQuery(args);
case 'fetch-incidents':
return fetchIncidents();
}