From a1ee9ea18fb78b4f3a2940cf84eab1a1896b063f Mon Sep 17 00:00:00 2001 From: Joe Hanvy Date: Wed, 24 Nov 2021 15:37:32 +0000 Subject: [PATCH] Added support for uppercase date fields in CEF. Renamed peek shiftItem, and added an actual peak (which doesn't mutate the array). --- dist/nsyslog-parser.js | 66 +++++++++++++++++++++++++++++++------- dist/nsyslog-parser.js.map | 2 +- dist/nsyslog-parser.min.js | 4 +-- package.json | 2 +- parser.js | 43 ++++++++++++++++++------- parser.test.js | 18 +++++++++++ 6 files changed, 109 insertions(+), 26 deletions(-) diff --git a/dist/nsyslog-parser.js b/dist/nsyslog-parser.js index 823608f..6e731ad 100644 --- a/dist/nsyslog-parser.js +++ b/dist/nsyslog-parser.js @@ -185,8 +185,8 @@ "pri": /^<\d+>/, "prinmr": /^\d+ /, "prival": /<(\d+)>/, - "month": /^[A-Za-z][a-z]{2} /, - "day": /^\d{1,2} /, + "month": /^[A-Za-z]{3} /, + "day": /^\d{1,2}/, "time": /^\d+:\d+:\d+ /, "ts": /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\S+ /, "invalid": /[^a-zA-Z0-9\.\$\-_#%\/\[\]\(\)]/, @@ -201,8 +201,13 @@ pid: true, generateTimestamp: true }; + /** + * Removes the first non whitespace item from the array and returns the item + * @param {string[]} arr the array to shift the item from + * @returns the first non whitespace item of the array + */ - function peek(arr) { + function shiftItem(arr) { do { var item = arr.shift(); if (item === undefined) return item;else item = item.trim(); @@ -210,6 +215,44 @@ return item; } + /** + * Gets the first non whitespace item from the array without mutating the array + * @param {string[]} arr the array to peek for the first item + * @returns the first non whitespace item of the array + */ + + + function peekItem(arr) { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + for (var _iterator = arr[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + var item = _step.value; + var trimmedItem = item.trim(); + + if (trimmedItem) { + return trimmedItem; + } + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + + return undefined; + } function assign(entry, item) { if (!entry.host) entry.host = item.trim();else if (!entry.appName) entry.appName = item.trim();else if (!entry.pid) entry.pid = item.trim();else if (!entry.messageid) entry.messageid = item.trim();else if (!entry.structuredData) { @@ -244,33 +287,34 @@ var endparse = false; while (line.length && !endparse) { - var item = peek(items) + " "; // RFC RFC5424 + var item = shiftItem(items) + " "; + var nextItem = peekItem(items); // RFC RFC5424 if (item.match(RXS.prinmr)) { entry.version = parseInt(item); entry.type = "RFC5424"; - item = peek(items) + " "; + item = shiftItem(items) + " "; if (item.match(RXS.ts)) { entry.ts = new Date(Date.parse(item.match(RXS.ts)[0].trim())); } } // BSD - else if (item.match(RXS.month)) { + else if (item.match(RXS.month) && nextItem && nextItem.match(RXS.day)) { entry.type = "BSD"; var month = item.trim(); - var day = peek(items); - var time = peek(items); + var day = shiftItem(items); + var time = shiftItem(items); var year = new Date().getYear() + 1900; var timezone = ""; // Check if the time is actually a year field and it is in the form "MMM dd yyyy HH:mm:ss" if (time.length === 4 && !Number.isNaN(+time)) { year = +time; - time = peek(items); + time = shiftItem(items); } // Check if we have a timezone if (isValidTimeZone(items[0].trim())) { - timezone = peek(items); + timezone = shiftItem(items); } entry.ts = new Date(Date.parse("".concat(year, " ").concat(month, " ").concat(day, " ").concat(time, " ").concat(timezone).trim())); @@ -295,7 +339,7 @@ endparse = false; while (line.length && !endparse) { - var item = peek(items); + var item = shiftItem(items); if (!item) { endparse = true; diff --git a/dist/nsyslog-parser.js.map b/dist/nsyslog-parser.js.map index 84af84b..64b7a0a 100644 --- a/dist/nsyslog-parser.js.map +++ b/dist/nsyslog-parser.js.map @@ -1 +1 @@ -{"version":3,"sources":["nsyslog-parser.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","module","$","parser","NSyslog","parse","window","FRX","CEP_FIELDS","splitHeaders","text","arr","map","scape","fields","curr","split","forEach","ch","push","splitFields","msg","key","nextKey","slice","headers","extension","isValidTimeZone","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","undefined","ex","Pri","CEF","RXS","DOPS","cef","pid","generateTimestamp","peek","item","shift","trim","assign","entry","host","appName","messageid","structuredData","line","opts","Object","pri","match","originalMessage","prival","parseInt","get","facilityval","facility","levelval","level","FACILITY","id","LEVEL","items","substring","endparse","prinmr","version","type","ts","Date","month","day","time","year","getYear","Number","isNaN","unshift","invalidate","message","join","endsWith","eitem","replace","invalid","chain","pop","bsdata","test","asdata","sdata","idx","nokeys","lastKey","indexOf","kv","sidx","header","prop","err","label","FACILITY_MAP","LEVEL_MAP","l","LEVELS","FACILITIES","val1","val2"],"mappings":"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","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i{\r\n\t\tif(!fields) {\r\n\t\t\tcurr += ch;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif(ch==\"|\") {\r\n\t\t\t\tif(scape) {\r\n\t\t\t\t\tscape = false;\r\n\t\t\t\t\tcurr += ch;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tarr.push(curr);\r\n\t\t\t\t\tcurr = \"\";\r\n\t\t\t\t\tfields--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(ch==\"\\\\\" && !scape) {\r\n\t\t\t\tscape = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tscape = false;\r\n\t\t\t\tcurr += ch;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tif(curr.length)\r\n\t\tarr.push(curr);\r\n\r\n\tCEP_FIELDS.forEach((f,i)=>map[f]=arr[i]);\r\n\treturn map;\r\n}\r\n\r\nfunction splitFields(msg) {\r\n\tvar map = {};\r\n\tvar scape = false;\r\n\tvar key = \"\";\r\n\tvar nextKey = \"\";\r\n\tvar curr = \"\";\r\n\r\n\tmsg.split(\"\").forEach(ch=>{\r\n\t\tif(ch==\"=\") {\r\n\t\t\tif(scape) {\r\n\t\t\t\t// Escape this = and treat it like any other character\r\n\t\t\t\tscape = false;\r\n\t\t\t\tcurr += ch;\r\n\t\t\t\tnextKey += ch;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// The equals isn't escaped, so add the previous key value to the map\r\n\t\t\t\tif (key) {\r\n\t\t\t\t\tmap[key] = curr.slice(0, curr.length - nextKey.length - 1);\r\n\t\t\t\t}\r\n\t\t\t\t// Now prepare for the next key value\r\n\t\t\t\tkey = nextKey;\r\n\t\t\t\tcurr = \"\";\r\n\t\t\t\tnextKey = \"\";\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(ch==\"\\\\\" && !scape) {\r\n\t\t\t// This is the escape character, so flag the next character to be escaped\r\n\t\t\tscape = true;\r\n\t\t}\r\n\t\telse if(ch==\" \") {\r\n\t\t\tscape = false;\r\n\t\t\tcurr += ch;\r\n\t\t\t// reset the next possible key as we've seen a space\r\n\t\t\tnextKey = \"\";\r\n\t\t}\r\n\t\telse if(ch==\"n\" && scape) {\r\n\t\t\tscape = false;\r\n\t\t\tcurr += \"\\n\";\r\n\t\t}\r\n\t\telse if(ch==\"r\" && scape) {\r\n\t\t\tscape = false;\r\n\t\t\tcurr += \"\\n\";\r\n\t\t}\r\n\t\telse {\r\n\t\t\tscape = false;\r\n\t\t\t// add the character to the possible key and current value\r\n\t\t\tcurr += ch;\r\n\t\t\tnextKey += ch;\r\n\t\t}\r\n\t});\r\n\r\n\tif(key && curr) {\r\n\t\tmap[key] = curr;\r\n\t}\r\n\r\n\treturn map;\r\n}\r\n\r\nmodule.exports = {\r\n\tparse(text) {\r\n\t\tvar headers = splitHeaders(text);\r\n\t\tvar fields = splitFields(headers.extension || \"\");\r\n\t\treturn {\r\n\t\t\theaders : headers,\r\n\t\t\tfields : fields\r\n\t\t}\r\n\t}\r\n}\r\n\n},{}],3:[function(require,module,exports){\n/**\r\n * Checks if a string is a valid timezone or not\r\n *\r\n * @param {string} timezone the time zone string, e.g UTC or America/Los_Angeles\r\n * @returns {boolean} if the timezone is valid\r\n */\r\nfunction isValidTimeZone(timezone) {\r\n if (!Intl || !Intl.DateTimeFormat().resolvedOptions().timeZone) {\r\n throw new Error(\"Time zones are not available in this environment\");\r\n }\r\n\r\n try {\r\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\r\n return true;\r\n } catch (ex) {\r\n return false;\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n isValidTimeZone,\r\n};\r\n\n},{}],4:[function(require,module,exports){\nconst Pri = require(\"./pri.js\");\r\nconst CEF = require(\"./cef.js\");\r\nconst { isValidTimeZone } = require(\"./isValidTimeZone.js\");\r\n\r\nconst RXS = {\r\n\t\"pri\" : /^<\\d+>/,\r\n\t\"prinmr\" : /^\\d+ /,\r\n\t\"prival\" : /<(\\d+)>/,\r\n\t\"month\" : /^[A-Za-z][a-z]{2} /,\r\n\t\"day\" : /^\\d{1,2} /,\r\n\t\"time\" : /^\\d+:\\d+:\\d+ /,\r\n\t\"ts\" : /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\S+ /,\r\n\t\"invalid\" : /[^a-zA-Z0-9\\.\\$\\-_#%\\/\\[\\]\\(\\)]/,\r\n\t\"sdata\" : /\\[(\\S+)( [^\\=]+\\=\\\"[^\\\"]*\\\")+\\]/g,\r\n\t\"asdata\" : /^\\s*[^\\[]+\\[/,\r\n\t\"bsdata\" : /^\\s*\\[/,\r\n\t\"cef\" : /^CEF:\\d+/\r\n}\r\n\r\nconst DOPS = {\r\n\tcef : true,\r\n\tfields : true,\r\n\tpid : true,\r\n\tgenerateTimestamp: true\r\n}\r\n\r\nfunction peek(arr) {\r\n\tdo {\r\n\t\tvar item = arr.shift();\r\n\t\tif(item===undefined) return item;\r\n\t\telse item = item.trim();\r\n\t}while(!item);\r\n\r\n\treturn item;\r\n}\r\n\r\nfunction assign(entry,item) {\r\n\tif(!entry.host) entry.host = item.trim();\r\n\telse if(!entry.appName) entry.appName = item.trim();\r\n\telse if(!entry.pid) entry.pid = item.trim();\r\n\telse if(!entry.messageid) entry.messageid = item.trim();\r\n\telse if(!entry.structuredData) {\r\n\t\tentry.structuredData = item.trim();\r\n\t\treturn false;\r\n\t}\r\n\telse return true;\r\n}\r\n\r\nfunction parse(line,opts) {\r\n\tif(opts)\r\n\t\topts = Object.assign({},DOPS,opts);\r\n\telse\r\n\t\topts = DOPS;\r\n\r\n\tvar pri = line.match(RXS.pri);\r\n\tvar entry = {\r\n\t\toriginalMessage : line\r\n\t};\r\n\r\n\t// First priority\r\n\tif(pri) {\r\n\t\tentry.pri = pri[0];\r\n\t\tentry.prival = parseInt(entry.pri.match(RXS.prival)[1]);\r\n\t\tvar prival = Pri.get(entry.prival);\r\n\t\tentry.facilityval = prival.facility;\r\n\t\tentry.levelval = prival.level;\r\n\t\tentry.facility = Pri.FACILITY[prival.facility].id;\r\n\t\tentry.level = Pri.LEVEL[prival.level].id;\r\n\t}\r\n\telse {\r\n\t\tentry.pri = \"\";\r\n\t\tentry.prival = null;\r\n\t}\r\n\r\n\t//Split message\r\n\tvar items = line.substring(entry.pri.length).split(\" \");\r\n\r\n\t// Date search\r\n\tvar endparse = false;\r\n\twhile(line.length && !endparse) {\r\n\t\tvar item = peek(items)+\" \";\r\n\r\n\t\t// RFC RFC5424\r\n\t\tif(item.match(RXS.prinmr)) {\r\n\t\t\tentry.version = parseInt(item);\r\n\t\t\tentry.type = \"RFC5424\";\r\n\t\t\titem = peek(items)+\" \";\r\n\t\t\tif(item.match(RXS.ts)) {\r\n\t\t\t\tentry.ts = new Date(Date.parse(item.match(RXS.ts)[0].trim()));\r\n\t\t\t}\r\n\t\t}\r\n\t\t// BSD\r\n\t\telse if(item.match(RXS.month)) {\r\n\t\t\tentry.type = \"BSD\";\r\n\t\t\tconst month = item.trim();\r\n\t\t\tconst day = peek(items);\r\n\t\t\tlet time = peek(items);\r\n\t\t\tlet year = new Date().getYear() + 1900\r\n\t\t\tlet timezone = \"\";\r\n\t\t\t// Check if the time is actually a year field and it is in the form \"MMM dd yyyy HH:mm:ss\"\r\n\t\t\tif (time.length === 4 && !Number.isNaN(+time)) {\r\n\t\t\t\tyear = +time;\r\n\t\t\t\ttime = peek(items);\r\n\t\t\t}\r\n\t\t\t// Check if we have a timezone\r\n\t\t\tif (isValidTimeZone(items[0].trim())) {\r\n\t\t\t\ttimezone = peek(items);\r\n\t\t\t}\r\n\r\n\t\t\tentry.ts = new Date(Date.parse(`${year} ${month} ${day} ${time} ${timezone}`.trim()));\r\n\t\t}\r\n\t\telse {\r\n\t\t\tentry.type = \"UNKNOWN\";\r\n\t\t\titems.unshift(item.trim());\r\n\t\t}\r\n\t\tendparse = true;\r\n\t}\r\n\r\n\t// No timestamp\r\n\tif(!entry.ts && opts.generateTimestamp) entry.ts = new Date();\r\n\r\n\t// Is a standard syslog message\r\n\tif(entry.type) {\r\n\t\tendparse = false;\r\n\r\n\t\tfunction invalidate(item) {\r\n\t\t\titems.unshift(item);\r\n\t\t\tentry.message = items.join(\" \");\r\n\t\t\tendparse = true;\r\n\t\t}\r\n\r\n\t\twhile(line.length && !endparse) {\r\n\t\t\tvar item = peek(items);\r\n\t\t\tif(!item) {\r\n\t\t\t\tendparse = true;\r\n\t\t\t}\r\n\t\t\telse if(item.endsWith(\":\")){\r\n\t\t\t\tlet eitem = item.replace(/:$/,\"\").trim();\r\n\t\t\t\tif(eitem.match(RXS.invalid)) {\r\n\t\t\t\t\tinvalidate(item);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tassign(entry,eitem)\r\n\t\t\t\t\tentry.message = items.join(\" \");\r\n\t\t\t\t\tendparse = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(!items.length) {\r\n\t\t\t\tinvalidate(item);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Invalid item (malformed message)\r\n\t\t\t\tif(item.match(RXS.invalid)) {\r\n\t\t\t\t\tinvalidate(item);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar r = assign(entry,item.replace(/: $/,\"\").trim())\r\n\t\t\t\t\tif(r===true) {\r\n\t\t\t\t\t\titems.unshift(item);\r\n\t\t\t\t\t\tentry.message = items.join(\" \");\r\n\t\t\t\t\t\tendparse = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(r===false) {\r\n\t\t\t\t\t\tentry.message = items.join(\" \");\r\n\t\t\t\t\t\tendparse = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\tentry.message = items.join(\" \");\r\n\t}\r\n\r\n\t// Chained hostnames\r\n\tentry.chain = (entry.host||\"\").split(\"/\");\r\n\tentry.host = entry.chain.pop();\r\n\r\n\t// Structured data\r\n\tif(entry.type==\"RFC5424\") {\r\n\t\t// Look if sdata if before or after message\r\n\t\tlet bsdata = RXS.bsdata.test(entry.message);\r\n\t\tlet asdata = RXS.asdata.test(entry.message);\r\n\r\n\t\tvar sdata = entry.message.match(RXS.sdata) || [];\r\n\t\tvar idx=0;\r\n\t\tentry.structuredData = sdata.map(item=>{\r\n\t\t\tvar map = {}, nokeys = [];\r\n\t\t\tvar lastKey = null;\r\n\t\t\tidx = entry.message.indexOf(item)+item.length+1;\r\n\t\t\titem.replace(/(^\\[)|(\\]$)/g,\"\").split(\" \").forEach((t,i)=>{\r\n\t\t\t\t// Extra space\r\n\t\t\t\tif(!t.trim()) return;\r\n\t\t\t\t// First element (ID of data)\r\n\t\t\t\tif(i==0) {\r\n\t\t\t\t\tmap[\"$id\"] = t;\r\n\t\t\t\t}\r\n\t\t\t\t// Key/Pair values\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar kv = t.split(\"=\");\r\n\t\t\t\t\t// Correct key/value pair\r\n\t\t\t\t\tif(kv[0] && kv[1] && kv[1]!='\"') {\r\n\t\t\t\t\t\tlastKey = kv.shift();\r\n\t\t\t\t\t\tmap[lastKey] = kv.join(\"=\").replace(/\\\"/g,\"\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Last key had values separated by spaces\r\n\t\t\t\t\telse if(kv[0] && kv[1]===undefined){\r\n\t\t\t\t\t\tmap[lastKey] += \" \"+(kv[0]||\"\").replace(/\\\"/g,\"\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(kv[0] && (!kv[1].length || kv[1]=='\"')){\r\n\t\t\t\t\t\tmap[lastKey] += \" \"+(kv[0]||\"\").replace(/\\\"/g,\"\")+\"=\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn map;\r\n\t\t});\r\n\r\n\t\t// Structured data parsed successfuly\r\n\t\tif(entry.structuredData.length) {\r\n\t\t\tlet sidx = entry.message.indexOf(\"[\");\r\n\t\t\t// sdata before message\r\n\t\t\tif(bsdata) {\r\n\t\t\t\tif(sidx>=0) entry.header = line.substring(0,line.length-entry.message.length);\r\n\t\t\t\tentry.message = entry.message.substring(idx);\r\n\t\t\t}\r\n\t\t\t// sdata after message\r\n\t\t\telse if(asdata) {\r\n\t\t\t\tif(sidx>=0) {\r\n\t\t\t\t\tentry.header = line.substring(0,line.length-entry.message.length);\r\n\t\t\t\t\tentry.message = entry.message.substring(0,sidx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// CEF Event message\r\n\tif(opts.cef!==false && RXS.cef.test(entry.message)) {\r\n\t\tentry.type = \"CEF\";\r\n\t\tlet cef = CEF.parse(entry.message);\r\n\t\tentry.cef = cef.headers;\r\n\t\tentry.fields = cef.fields;\r\n\t}\r\n\t// Default syslog message\r\n\telse if(opts.fields!==false && entry.type!=\"UNKNOWN\"){\r\n\t\t// Message with fields\r\n\t\tvar fields = [];\r\n\t\tentry.message.split(\",\").forEach(kv=>{\r\n\t\t\tvar prop = kv.split(\"=\");\r\n\t\t\tif(prop.length==2)\r\n\t\t\t\tfields[prop[0]] = prop[1];\r\n\t\t});\r\n\t\tentry.fields = fields;\r\n\t}\r\n\r\n\t// header\r\n\tentry.header = entry.header || line.substring(0,line.length-entry.message.length);\r\n\tentry.message = entry.message.trim();\r\n\r\n\t// PID\r\n\tif(opts.pid && entry.appName && entry.appName.endsWith(\"]\")) {\r\n\t\tlet idx = entry.appName.indexOf(\"[\");\r\n\t\tif(idx>=0) {\r\n\t\t\tentry.pid = entry.appName.substring(idx+1,entry.appName.length-1);\r\n\t\t\tentry.appName = entry.appName.substring(0,idx);\r\n\t\t}\r\n\t}\r\n\r\n\treturn entry;\r\n}\r\n\r\nmodule.exports = function(line,opts) {try {return parse(line,opts)}catch(err){return {err:err}}};\r\n\n},{\"./cef.js\":2,\"./isValidTimeZone.js\":3,\"./pri.js\":5}],5:[function(require,module,exports){\nconst FACILITY = [\r\n\t{id:\"kern\", label:\"kernel messages\"},\r\n\t{id:\"user\", label:\"user-level messages\"},\r\n\t{id:\"mail\", label:\"mail system\"},\r\n\t{id:\"daemon\", label:\"system daemons\"},\r\n\t{id:\"auth\", label:\"security/authorization messages\"},\r\n\t{id:\"syslog\", label:\"messages generated internally by syslogd\"},\r\n\t{id:\"lpr\", label:\"line printer subsystem\"},\r\n\t{id:\"news\", label:\"network news subsystem\"},\r\n\t{id:\"uucp\", label:\"UUCP subsystem\"},\r\n\t{id:\"cron\", label:\"clock daemon\"},\r\n\t{id:\"authpriv\", label:\"security/authorization messages\"},\r\n\t{id:\"ftp\", label:\"FTP daemon\"},\r\n\t{id:\"ntp\", label:\"NTP subsystem\"},\r\n\t{id:\"security\", label:\"log audit\"},\r\n\t{id:\"console\", label:\"log alert\"},\r\n\t{id:\"solaris-cron\", label:\"clock daemon\"},\r\n\t{id:\"local0\", label:\"locally used facility 0\"},\r\n\t{id:\"local1\", label:\"locally used facility 0\"},\r\n\t{id:\"local2\", label:\"locally used facility 0\"},\r\n\t{id:\"local3\", label:\"locally used facility 0\"},\r\n\t{id:\"local4\", label:\"locally used facility 0\"},\r\n\t{id:\"local5\", label:\"locally used facility 0\"},\r\n\t{id:\"local6\", label:\"locally used facility 0\"},\r\n\t{id:\"local7\", label:\"locally used facility 0\"}\r\n];\r\n\r\nconst LEVEL = [\r\n\t{id:\"emerg\", label:\"system is unusable\"},\r\n\t{id:\"alert\", label:\"action must be taken immediately\"},\r\n\t{id:\"crit\", label:\"critical conditions\"},\r\n\t{id:\"error\", label:\"error conditions\"},\r\n\t{id:\"warn\", label:\"warning conditions\"},\r\n\t{id:\"notice\", label:\"normal but significant condition\"},\r\n\t{id:\"info\", label:\"informational messages\"},\r\n\t{id:\"debug\", label:\"debug-level messages\"}\r\n]\r\n\r\nvar FACILITY_MAP = [];\r\nvar LEVEL_MAP = [];\r\n\r\nFACILITY.forEach((f,i)=>FACILITY_MAP[f.id]=i);\r\nLEVEL.forEach((l,i)=>LEVEL_MAP[l.id]=i);\r\n\r\nmodule.exports.LEVEL = LEVEL;\r\nmodule.exports.FACILITY = FACILITY;\r\nmodule.exports.LEVELS = LEVEL_MAP;\r\nmodule.exports.FACILITIES = FACILITY_MAP;\r\nmodule.exports.get = function(val1,val2) {\r\n\tif(typeof(val1)==\"number\" && typeof(val2)==\"undefined\") {\r\n\t\treturn {\r\n\t\t\tlevel : val1 & 0x7,\r\n\t\t\tfacility : val1 >> 3\r\n\t\t}\r\n\t}\r\n\telse if(typeof(val1)==\"number\" && typeof(val2)==\"number\") {\r\n\t\treturn val1*8 + val2;\r\n\t}\r\n\telse if(typeof(val1)==\"string\" && typeof(val2)==\"number\") {\r\n\t\treturn (FACILITY_MAP[val1]||0)*8 + val2;\r\n\t}\r\n\telse if(typeof(val1)==\"number\" && typeof(val2)==\"string\") {\r\n\t\treturn val1*8 + (LEVEL_MAP[val2]||0);\r\n\t}\r\n\telse if(typeof(val1)==\"string\" && typeof(val2)==\"string\") {\r\n\t\treturn (FACILITY_MAP[val1]||0)*8 + (LEVEL_MAP[val2]||0);\r\n\t}\r\n\telse {\r\n\t\treturn {level:0, facility:0}\r\n\t}\r\n}\r\n\n},{}]},{},[1]);\n"],"file":"nsyslog-parser.js"} \ No newline at end of file +{"version":3,"sources":["nsyslog-parser.js"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","module","$","parser","NSyslog","parse","window","FRX","CEP_FIELDS","splitHeaders","text","arr","map","scape","fields","curr","split","forEach","ch","push","splitFields","msg","key","nextKey","slice","headers","extension","isValidTimeZone","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","undefined","ex","Pri","CEF","RXS","DOPS","cef","pid","generateTimestamp","shiftItem","item","shift","trim","peekItem","trimmedItem","assign","entry","host","appName","messageid","structuredData","line","opts","Object","pri","match","originalMessage","prival","parseInt","get","facilityval","facility","levelval","level","FACILITY","id","LEVEL","items","substring","endparse","nextItem","prinmr","version","type","ts","Date","month","day","time","year","getYear","Number","isNaN","unshift","invalidate","message","join","endsWith","eitem","replace","invalid","chain","pop","bsdata","test","asdata","sdata","idx","nokeys","lastKey","indexOf","kv","sidx","header","prop","err","label","FACILITY_MAP","LEVEL_MAP","l","LEVELS","FACILITIES","val1","val2"],"mappings":"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","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i{\r\n\t\tif(!fields) {\r\n\t\t\tcurr += ch;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif(ch==\"|\") {\r\n\t\t\t\tif(scape) {\r\n\t\t\t\t\tscape = false;\r\n\t\t\t\t\tcurr += ch;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tarr.push(curr);\r\n\t\t\t\t\tcurr = \"\";\r\n\t\t\t\t\tfields--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(ch==\"\\\\\" && !scape) {\r\n\t\t\t\tscape = true;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tscape = false;\r\n\t\t\t\tcurr += ch;\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tif(curr.length)\r\n\t\tarr.push(curr);\r\n\r\n\tCEP_FIELDS.forEach((f,i)=>map[f]=arr[i]);\r\n\treturn map;\r\n}\r\n\r\nfunction splitFields(msg) {\r\n\tvar map = {};\r\n\tvar scape = false;\r\n\tvar key = \"\";\r\n\tvar nextKey = \"\";\r\n\tvar curr = \"\";\r\n\r\n\tmsg.split(\"\").forEach(ch=>{\r\n\t\tif(ch==\"=\") {\r\n\t\t\tif(scape) {\r\n\t\t\t\t// Escape this = and treat it like any other character\r\n\t\t\t\tscape = false;\r\n\t\t\t\tcurr += ch;\r\n\t\t\t\tnextKey += ch;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// The equals isn't escaped, so add the previous key value to the map\r\n\t\t\t\tif (key) {\r\n\t\t\t\t\tmap[key] = curr.slice(0, curr.length - nextKey.length - 1);\r\n\t\t\t\t}\r\n\t\t\t\t// Now prepare for the next key value\r\n\t\t\t\tkey = nextKey;\r\n\t\t\t\tcurr = \"\";\r\n\t\t\t\tnextKey = \"\";\r\n\t\t\t}\r\n\t\t}\r\n\t\telse if(ch==\"\\\\\" && !scape) {\r\n\t\t\t// This is the escape character, so flag the next character to be escaped\r\n\t\t\tscape = true;\r\n\t\t}\r\n\t\telse if(ch==\" \") {\r\n\t\t\tscape = false;\r\n\t\t\tcurr += ch;\r\n\t\t\t// reset the next possible key as we've seen a space\r\n\t\t\tnextKey = \"\";\r\n\t\t}\r\n\t\telse if(ch==\"n\" && scape) {\r\n\t\t\tscape = false;\r\n\t\t\tcurr += \"\\n\";\r\n\t\t}\r\n\t\telse if(ch==\"r\" && scape) {\r\n\t\t\tscape = false;\r\n\t\t\tcurr += \"\\n\";\r\n\t\t}\r\n\t\telse {\r\n\t\t\tscape = false;\r\n\t\t\t// add the character to the possible key and current value\r\n\t\t\tcurr += ch;\r\n\t\t\tnextKey += ch;\r\n\t\t}\r\n\t});\r\n\r\n\tif(key && curr) {\r\n\t\tmap[key] = curr;\r\n\t}\r\n\r\n\treturn map;\r\n}\r\n\r\nmodule.exports = {\r\n\tparse(text) {\r\n\t\tvar headers = splitHeaders(text);\r\n\t\tvar fields = splitFields(headers.extension || \"\");\r\n\t\treturn {\r\n\t\t\theaders : headers,\r\n\t\t\tfields : fields\r\n\t\t}\r\n\t}\r\n}\r\n\n},{}],3:[function(require,module,exports){\n/**\r\n * Checks if a string is a valid timezone or not\r\n *\r\n * @param {string} timezone the time zone string, e.g UTC or America/Los_Angeles\r\n * @returns {boolean} if the timezone is valid\r\n */\r\nfunction isValidTimeZone(timezone) {\r\n if (!Intl || !Intl.DateTimeFormat().resolvedOptions().timeZone) {\r\n throw new Error(\"Time zones are not available in this environment\");\r\n }\r\n\r\n try {\r\n Intl.DateTimeFormat(undefined, { timeZone: timezone });\r\n return true;\r\n } catch (ex) {\r\n return false;\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n isValidTimeZone,\r\n};\r\n\n},{}],4:[function(require,module,exports){\nconst Pri = require(\"./pri.js\");\r\nconst CEF = require(\"./cef.js\");\r\nconst { isValidTimeZone } = require(\"./isValidTimeZone.js\");\r\n\r\nconst RXS = {\r\n\t\"pri\" : /^<\\d+>/,\r\n\t\"prinmr\" : /^\\d+ /,\r\n\t\"prival\" : /<(\\d+)>/,\r\n\t\"month\" : /^[A-Za-z]{3} /,\r\n\t\"day\" : /^\\d{1,2}/,\r\n\t\"time\" : /^\\d+:\\d+:\\d+ /,\r\n\t\"ts\" : /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\S+ /,\r\n\t\"invalid\" : /[^a-zA-Z0-9\\.\\$\\-_#%\\/\\[\\]\\(\\)]/,\r\n\t\"sdata\" : /\\[(\\S+)( [^\\=]+\\=\\\"[^\\\"]*\\\")+\\]/g,\r\n\t\"asdata\" : /^\\s*[^\\[]+\\[/,\r\n\t\"bsdata\" : /^\\s*\\[/,\r\n\t\"cef\" : /^CEF:\\d+/\r\n}\r\n\r\nconst DOPS = {\r\n\tcef : true,\r\n\tfields : true,\r\n\tpid : true,\r\n\tgenerateTimestamp: true\r\n}\r\n\r\n/**\r\n * Removes the first non whitespace item from the array and returns the item\r\n * @param {string[]} arr the array to shift the item from\r\n * @returns the first non whitespace item of the array\r\n */\r\nfunction shiftItem(arr) {\r\n\tdo {\r\n\t\tvar item = arr.shift();\r\n\t\tif(item===undefined) return item;\r\n\t\telse item = item.trim();\r\n\t}while(!item);\r\n\r\n\treturn item;\r\n}\r\n\r\n/**\r\n * Gets the first non whitespace item from the array without mutating the array\r\n * @param {string[]} arr the array to peek for the first item\r\n * @returns the first non whitespace item of the array\r\n */\r\nfunction peekItem(arr) {\r\n\tfor (const item of arr) {\r\n\t\tlet trimmedItem = item.trim();\r\n\t\tif (trimmedItem) {\r\n\t\t\treturn trimmedItem;\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n}\r\n\r\nfunction assign(entry,item) {\r\n\tif(!entry.host) entry.host = item.trim();\r\n\telse if(!entry.appName) entry.appName = item.trim();\r\n\telse if(!entry.pid) entry.pid = item.trim();\r\n\telse if(!entry.messageid) entry.messageid = item.trim();\r\n\telse if(!entry.structuredData) {\r\n\t\tentry.structuredData = item.trim();\r\n\t\treturn false;\r\n\t}\r\n\telse return true;\r\n}\r\n\r\nfunction parse(line,opts) {\r\n\tif(opts)\r\n\t\topts = Object.assign({},DOPS,opts);\r\n\telse\r\n\t\topts = DOPS;\r\n\r\n\tvar pri = line.match(RXS.pri);\r\n\tvar entry = {\r\n\t\toriginalMessage : line\r\n\t};\r\n\r\n\t// First priority\r\n\tif(pri) {\r\n\t\tentry.pri = pri[0];\r\n\t\tentry.prival = parseInt(entry.pri.match(RXS.prival)[1]);\r\n\t\tvar prival = Pri.get(entry.prival);\r\n\t\tentry.facilityval = prival.facility;\r\n\t\tentry.levelval = prival.level;\r\n\t\tentry.facility = Pri.FACILITY[prival.facility].id;\r\n\t\tentry.level = Pri.LEVEL[prival.level].id;\r\n\t}\r\n\telse {\r\n\t\tentry.pri = \"\";\r\n\t\tentry.prival = null;\r\n\t}\r\n\r\n\t//Split message\r\n\tvar items = line.substring(entry.pri.length).split(\" \");\r\n\r\n\t// Date search\r\n\tvar endparse = false;\r\n\twhile(line.length && !endparse) {\r\n\t\tvar item = shiftItem(items)+\" \";\r\n\t\tvar nextItem = peekItem(items);\r\n\r\n\t\t// RFC RFC5424\r\n\t\tif(item.match(RXS.prinmr)) {\r\n\t\t\tentry.version = parseInt(item);\r\n\t\t\tentry.type = \"RFC5424\";\r\n\t\t\titem = shiftItem(items)+\" \";\r\n\t\t\tif(item.match(RXS.ts)) {\r\n\t\t\t\tentry.ts = new Date(Date.parse(item.match(RXS.ts)[0].trim()));\r\n\t\t\t}\r\n\t\t}\r\n\t\t// BSD\r\n\t\telse if(item.match(RXS.month) && nextItem && nextItem.match(RXS.day)) {\r\n\t\t\tentry.type = \"BSD\";\r\n\t\t\tconst month = item.trim();\r\n\t\t\tconst day = shiftItem(items);\r\n\t\t\tlet time = shiftItem(items);\r\n\t\t\tlet year = new Date().getYear() + 1900\r\n\t\t\tlet timezone = \"\";\r\n\t\t\t// Check if the time is actually a year field and it is in the form \"MMM dd yyyy HH:mm:ss\"\r\n\t\t\tif (time.length === 4 && !Number.isNaN(+time)) {\r\n\t\t\t\tyear = +time;\r\n\t\t\t\ttime = shiftItem(items);\r\n\t\t\t}\r\n\t\t\t// Check if we have a timezone\r\n\t\t\tif (isValidTimeZone(items[0].trim())) {\r\n\t\t\t\ttimezone = shiftItem(items);\r\n\t\t\t}\r\n\r\n\t\t\tentry.ts = new Date(Date.parse(`${year} ${month} ${day} ${time} ${timezone}`.trim()));\r\n\t\t}\r\n\t\telse {\r\n\t\t\tentry.type = \"UNKNOWN\";\r\n\t\t\titems.unshift(item.trim());\r\n\t\t}\r\n\t\tendparse = true;\r\n\t}\r\n\r\n\t// No timestamp\r\n\tif(!entry.ts && opts.generateTimestamp) entry.ts = new Date();\r\n\r\n\t// Is a standard syslog message\r\n\tif(entry.type) {\r\n\t\tendparse = false;\r\n\r\n\t\tfunction invalidate(item) {\r\n\t\t\titems.unshift(item);\r\n\t\t\tentry.message = items.join(\" \");\r\n\t\t\tendparse = true;\r\n\t\t}\r\n\r\n\t\twhile(line.length && !endparse) {\r\n\t\t\tvar item = shiftItem(items);\r\n\t\t\tif(!item) {\r\n\t\t\t\tendparse = true;\r\n\t\t\t}\r\n\t\t\telse if(item.endsWith(\":\")){\r\n\t\t\t\tlet eitem = item.replace(/:$/,\"\").trim();\r\n\t\t\t\tif(eitem.match(RXS.invalid)) {\r\n\t\t\t\t\tinvalidate(item);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tassign(entry,eitem)\r\n\t\t\t\t\tentry.message = items.join(\" \");\r\n\t\t\t\t\tendparse = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if(!items.length) {\r\n\t\t\t\tinvalidate(item);\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\t// Invalid item (malformed message)\r\n\t\t\t\tif(item.match(RXS.invalid)) {\r\n\t\t\t\t\tinvalidate(item);\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar r = assign(entry,item.replace(/: $/,\"\").trim())\r\n\t\t\t\t\tif(r===true) {\r\n\t\t\t\t\t\titems.unshift(item);\r\n\t\t\t\t\t\tentry.message = items.join(\" \");\r\n\t\t\t\t\t\tendparse = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(r===false) {\r\n\t\t\t\t\t\tentry.message = items.join(\" \");\r\n\t\t\t\t\t\tendparse = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\tentry.message = items.join(\" \");\r\n\t}\r\n\r\n\t// Chained hostnames\r\n\tentry.chain = (entry.host||\"\").split(\"/\");\r\n\tentry.host = entry.chain.pop();\r\n\r\n\t// Structured data\r\n\tif(entry.type==\"RFC5424\") {\r\n\t\t// Look if sdata if before or after message\r\n\t\tlet bsdata = RXS.bsdata.test(entry.message);\r\n\t\tlet asdata = RXS.asdata.test(entry.message);\r\n\r\n\t\tvar sdata = entry.message.match(RXS.sdata) || [];\r\n\t\tvar idx=0;\r\n\t\tentry.structuredData = sdata.map(item=>{\r\n\t\t\tvar map = {}, nokeys = [];\r\n\t\t\tvar lastKey = null;\r\n\t\t\tidx = entry.message.indexOf(item)+item.length+1;\r\n\t\t\titem.replace(/(^\\[)|(\\]$)/g,\"\").split(\" \").forEach((t,i)=>{\r\n\t\t\t\t// Extra space\r\n\t\t\t\tif(!t.trim()) return;\r\n\t\t\t\t// First element (ID of data)\r\n\t\t\t\tif(i==0) {\r\n\t\t\t\t\tmap[\"$id\"] = t;\r\n\t\t\t\t}\r\n\t\t\t\t// Key/Pair values\r\n\t\t\t\telse {\r\n\t\t\t\t\tvar kv = t.split(\"=\");\r\n\t\t\t\t\t// Correct key/value pair\r\n\t\t\t\t\tif(kv[0] && kv[1] && kv[1]!='\"') {\r\n\t\t\t\t\t\tlastKey = kv.shift();\r\n\t\t\t\t\t\tmap[lastKey] = kv.join(\"=\").replace(/\\\"/g,\"\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Last key had values separated by spaces\r\n\t\t\t\t\telse if(kv[0] && kv[1]===undefined){\r\n\t\t\t\t\t\tmap[lastKey] += \" \"+(kv[0]||\"\").replace(/\\\"/g,\"\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if(kv[0] && (!kv[1].length || kv[1]=='\"')){\r\n\t\t\t\t\t\tmap[lastKey] += \" \"+(kv[0]||\"\").replace(/\\\"/g,\"\")+\"=\";\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn map;\r\n\t\t});\r\n\r\n\t\t// Structured data parsed successfuly\r\n\t\tif(entry.structuredData.length) {\r\n\t\t\tlet sidx = entry.message.indexOf(\"[\");\r\n\t\t\t// sdata before message\r\n\t\t\tif(bsdata) {\r\n\t\t\t\tif(sidx>=0) entry.header = line.substring(0,line.length-entry.message.length);\r\n\t\t\t\tentry.message = entry.message.substring(idx);\r\n\t\t\t}\r\n\t\t\t// sdata after message\r\n\t\t\telse if(asdata) {\r\n\t\t\t\tif(sidx>=0) {\r\n\t\t\t\t\tentry.header = line.substring(0,line.length-entry.message.length);\r\n\t\t\t\t\tentry.message = entry.message.substring(0,sidx);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// CEF Event message\r\n\tif(opts.cef!==false && RXS.cef.test(entry.message)) {\r\n\t\tentry.type = \"CEF\";\r\n\t\tlet cef = CEF.parse(entry.message);\r\n\t\tentry.cef = cef.headers;\r\n\t\tentry.fields = cef.fields;\r\n\t}\r\n\t// Default syslog message\r\n\telse if(opts.fields!==false && entry.type!=\"UNKNOWN\"){\r\n\t\t// Message with fields\r\n\t\tvar fields = [];\r\n\t\tentry.message.split(\",\").forEach(kv=>{\r\n\t\t\tvar prop = kv.split(\"=\");\r\n\t\t\tif(prop.length==2)\r\n\t\t\t\tfields[prop[0]] = prop[1];\r\n\t\t});\r\n\t\tentry.fields = fields;\r\n\t}\r\n\r\n\t// header\r\n\tentry.header = entry.header || line.substring(0,line.length-entry.message.length);\r\n\tentry.message = entry.message.trim();\r\n\r\n\t// PID\r\n\tif(opts.pid && entry.appName && entry.appName.endsWith(\"]\")) {\r\n\t\tlet idx = entry.appName.indexOf(\"[\");\r\n\t\tif(idx>=0) {\r\n\t\t\tentry.pid = entry.appName.substring(idx+1,entry.appName.length-1);\r\n\t\t\tentry.appName = entry.appName.substring(0,idx);\r\n\t\t}\r\n\t}\r\n\r\n\treturn entry;\r\n}\r\n\r\nmodule.exports = function(line,opts) {try {return parse(line,opts)}catch(err){return {err:err}}};\r\n\n},{\"./cef.js\":2,\"./isValidTimeZone.js\":3,\"./pri.js\":5}],5:[function(require,module,exports){\nconst FACILITY = [\r\n\t{id:\"kern\", label:\"kernel messages\"},\r\n\t{id:\"user\", label:\"user-level messages\"},\r\n\t{id:\"mail\", label:\"mail system\"},\r\n\t{id:\"daemon\", label:\"system daemons\"},\r\n\t{id:\"auth\", label:\"security/authorization messages\"},\r\n\t{id:\"syslog\", label:\"messages generated internally by syslogd\"},\r\n\t{id:\"lpr\", label:\"line printer subsystem\"},\r\n\t{id:\"news\", label:\"network news subsystem\"},\r\n\t{id:\"uucp\", label:\"UUCP subsystem\"},\r\n\t{id:\"cron\", label:\"clock daemon\"},\r\n\t{id:\"authpriv\", label:\"security/authorization messages\"},\r\n\t{id:\"ftp\", label:\"FTP daemon\"},\r\n\t{id:\"ntp\", label:\"NTP subsystem\"},\r\n\t{id:\"security\", label:\"log audit\"},\r\n\t{id:\"console\", label:\"log alert\"},\r\n\t{id:\"solaris-cron\", label:\"clock daemon\"},\r\n\t{id:\"local0\", label:\"locally used facility 0\"},\r\n\t{id:\"local1\", label:\"locally used facility 0\"},\r\n\t{id:\"local2\", label:\"locally used facility 0\"},\r\n\t{id:\"local3\", label:\"locally used facility 0\"},\r\n\t{id:\"local4\", label:\"locally used facility 0\"},\r\n\t{id:\"local5\", label:\"locally used facility 0\"},\r\n\t{id:\"local6\", label:\"locally used facility 0\"},\r\n\t{id:\"local7\", label:\"locally used facility 0\"}\r\n];\r\n\r\nconst LEVEL = [\r\n\t{id:\"emerg\", label:\"system is unusable\"},\r\n\t{id:\"alert\", label:\"action must be taken immediately\"},\r\n\t{id:\"crit\", label:\"critical conditions\"},\r\n\t{id:\"error\", label:\"error conditions\"},\r\n\t{id:\"warn\", label:\"warning conditions\"},\r\n\t{id:\"notice\", label:\"normal but significant condition\"},\r\n\t{id:\"info\", label:\"informational messages\"},\r\n\t{id:\"debug\", label:\"debug-level messages\"}\r\n]\r\n\r\nvar FACILITY_MAP = [];\r\nvar LEVEL_MAP = [];\r\n\r\nFACILITY.forEach((f,i)=>FACILITY_MAP[f.id]=i);\r\nLEVEL.forEach((l,i)=>LEVEL_MAP[l.id]=i);\r\n\r\nmodule.exports.LEVEL = LEVEL;\r\nmodule.exports.FACILITY = FACILITY;\r\nmodule.exports.LEVELS = LEVEL_MAP;\r\nmodule.exports.FACILITIES = FACILITY_MAP;\r\nmodule.exports.get = function(val1,val2) {\r\n\tif(typeof(val1)==\"number\" && typeof(val2)==\"undefined\") {\r\n\t\treturn {\r\n\t\t\tlevel : val1 & 0x7,\r\n\t\t\tfacility : val1 >> 3\r\n\t\t}\r\n\t}\r\n\telse if(typeof(val1)==\"number\" && typeof(val2)==\"number\") {\r\n\t\treturn val1*8 + val2;\r\n\t}\r\n\telse if(typeof(val1)==\"string\" && typeof(val2)==\"number\") {\r\n\t\treturn (FACILITY_MAP[val1]||0)*8 + val2;\r\n\t}\r\n\telse if(typeof(val1)==\"number\" && typeof(val2)==\"string\") {\r\n\t\treturn val1*8 + (LEVEL_MAP[val2]||0);\r\n\t}\r\n\telse if(typeof(val1)==\"string\" && typeof(val2)==\"string\") {\r\n\t\treturn (FACILITY_MAP[val1]||0)*8 + (LEVEL_MAP[val2]||0);\r\n\t}\r\n\telse {\r\n\t\treturn {level:0, facility:0}\r\n\t}\r\n}\r\n\n},{}]},{},[1]);\n"],"file":"nsyslog-parser.js"} \ No newline at end of file diff --git a/dist/nsyslog-parser.min.js b/dist/nsyslog-parser.min.js index b3222d9..f7d9ca2 100644 --- a/dist/nsyslog-parser.min.js +++ b/dist/nsyslog-parser.min.js @@ -1,3 +1,3 @@ -/*! nsyslog-parser-2 2021-11-22 */ +/*! nsyslog-parser-2 2021-11-24 */ -"use strict";!function r(l,n,o){function c(i,e){if(!n[i]){if(!l[i]){var t="function"==typeof require&&require;if(!e&&t)return t(i,!0);if(d)return d(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var s=n[i]={exports:{}};l[i][0].call(s.exports,function(e){return c(l[i][1][e]||e)},s,s.exports,r,l,n,o)}return n[i].exports}for(var d="function"==typeof require&&require,e=0;e/,prinmr:/^\d+ /,prival:/<(\d+)>/,month:/^[A-Za-z][a-z]{2} /,day:/^\d{1,2} /,time:/^\d+:\d+:\d+ /,ts:/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\S+ /,invalid:/[^a-zA-Z0-9\.\$\-_#%\/\[\]\(\)]/,sdata:/\[(\S+)( [^\=]+\=\"[^\"]*\")+\]/g,asdata:/^\s*[^\[]+\[/,bsdata:/^\s*\[/,cef:/^CEF:\d+/},F={cef:!0,fields:!0,pid:!0,generateTimestamp:!0};function C(e){do{var i=e.shift();if(void 0===i)return i;i=i.trim()}while(!i);return i}function L(e,i){if(e.host)if(e.appName)if(e.pid){if(e.messageid)return!!e.structuredData||(e.structuredData=i.trim(),!1);e.messageid=i.trim()}else e.pid=i.trim();else e.appName=i.trim();else e.host=i.trim()}i.exports=function(e,i){try{return function(e,i){i=i?Object.assign({},F,i):F;var t=e.match(I.pri),r={originalMessage:e};if(t){r.pri=t[0],r.prival=parseInt(r.pri.match(I.prival)[1]);var a=D.get(r.prival);r.facilityval=a.facility,r.levelval=a.level,r.facility=D.FACILITY[a.facility].id,r.level=D.LEVEL[a.level].id}else r.pri="",r.prival=null;for(var s=e.substring(r.pri.length).split(" "),l=!1;e.length&&!l;){if((m=C(s)+" ").match(I.prinmr))r.version=parseInt(m),r.type="RFC5424",(m=C(s)+" ").match(I.ts)&&(r.ts=new Date(Date.parse(m.match(I.ts)[0].trim())));else if(m.match(I.month)){r.type="BSD";var n=m.trim(),o=C(s),c=C(s),d=(new Date).getYear()+1900,u="";4!==c.length||Number.isNaN(+c)||(d=+c,c=C(s)),j(s[0].trim())&&(u=C(s)),r.ts=new Date(Date.parse("".concat(d," ").concat(n," ").concat(o," ").concat(c," ").concat(u).trim()))}else r.type="UNKNOWN",s.unshift(m.trim());l=!0}if(!r.ts&&i.generateTimestamp&&(r.ts=new Date),r.type){var f=function(e){s.unshift(e),r.message=s.join(" "),l=!0};for(l=!1;e.length&&!l;){var m;if(m=C(s))if(m.endsWith(":")){var p=m.replace(/:$/,"").trim();p.match(I.invalid)?f(m):(L(r,p),r.message=s.join(" "),l=!0)}else if(s.length)if(m.match(I.invalid))f(m);else{var g=L(r,m.replace(/: $/,"").trim());!0===g?(s.unshift(m),r.message=s.join(" "),l=!0):!1===g&&(r.message=s.join(" "),l=!0)}else f(m);else l=!0}}else r.message=s.join(" ");if(r.chain=(r.host||"").split("/"),r.host=r.chain.pop(),"RFC5424"==r.type){var h=I.bsdata.test(r.message),v=I.asdata.test(r.message),y=r.message.match(I.sdata)||[],b=0;if(r.structuredData=y.map(function(e){var a={},s=null;return b=r.message.indexOf(e)+e.length+1,e.replace(/(^\[)|(\]$)/g,"").split(" ").forEach(function(e,i){if(e.trim())if(0==i)a.$id=e;else{var t=e.split("=");t[0]&&t[1]&&'"'!=t[1]?(s=t.shift(),a[s]=t.join("=").replace(/\"/g,"")):t[0]&&void 0===t[1]?a[s]+=" "+(t[0]||"").replace(/\"/g,""):!t[0]||t[1].length&&'"'!=t[1]||(a[s]+=" "+(t[0]||"").replace(/\"/g,"")+"=")}}),a}),r.structuredData.length){var N=r.message.indexOf("[");h?(0<=N&&(r.header=e.substring(0,e.length-r.message.length)),r.message=r.message.substring(b)):v&&0<=N&&(r.header=e.substring(0,e.length-r.message.length),r.message=r.message.substring(0,N))}}if(!1!==i.cef&&I.cef.test(r.message)){r.type="CEF";var E=T.parse(r.message);r.cef=E.headers,r.fields=E.fields}else if(!1!==i.fields&&"UNKNOWN"!=r.type){var x=[];r.message.split(",").forEach(function(e){var i=e.split("=");2==i.length&&(x[i[0]]=i[1])}),r.fields=x}if(r.header=r.header||e.substring(0,e.length-r.message.length),r.message=r.message.trim(),i.pid&&r.appName&&r.appName.endsWith("]")){var w=r.appName.indexOf("[");0<=w&&(r.pid=r.appName.substring(w+1,r.appName.length-1),r.appName=r.appName.substring(0,w))}return r}(e,i)}catch(e){return{err:e}}}},{"./cef.js":2,"./isValidTimeZone.js":3,"./pri.js":5}],5:[function(e,i,t){var a=[{id:"kern",label:"kernel messages"},{id:"user",label:"user-level messages"},{id:"mail",label:"mail system"},{id:"daemon",label:"system daemons"},{id:"auth",label:"security/authorization messages"},{id:"syslog",label:"messages generated internally by syslogd"},{id:"lpr",label:"line printer subsystem"},{id:"news",label:"network news subsystem"},{id:"uucp",label:"UUCP subsystem"},{id:"cron",label:"clock daemon"},{id:"authpriv",label:"security/authorization messages"},{id:"ftp",label:"FTP daemon"},{id:"ntp",label:"NTP subsystem"},{id:"security",label:"log audit"},{id:"console",label:"log alert"},{id:"solaris-cron",label:"clock daemon"},{id:"local0",label:"locally used facility 0"},{id:"local1",label:"locally used facility 0"},{id:"local2",label:"locally used facility 0"},{id:"local3",label:"locally used facility 0"},{id:"local4",label:"locally used facility 0"},{id:"local5",label:"locally used facility 0"},{id:"local6",label:"locally used facility 0"},{id:"local7",label:"locally used facility 0"}],s=[{id:"emerg",label:"system is unusable"},{id:"alert",label:"action must be taken immediately"},{id:"crit",label:"critical conditions"},{id:"error",label:"error conditions"},{id:"warn",label:"warning conditions"},{id:"notice",label:"normal but significant condition"},{id:"info",label:"informational messages"},{id:"debug",label:"debug-level messages"}],r=[],l=[];a.forEach(function(e,i){return r[e.id]=i}),s.forEach(function(e,i){return l[e.id]=i}),i.exports.LEVEL=s,i.exports.FACILITY=a,i.exports.LEVELS=l,i.exports.FACILITIES=r,i.exports.get=function(e,i){return"number"==typeof e&&void 0===i?{level:7&e,facility:e>>3}:"number"==typeof e&&"number"==typeof i?8*e+i:"string"==typeof e&&"number"==typeof i?8*(r[e]||0)+i:"number"==typeof e&&"string"==typeof i?8*e+(l[i]||0):"string"==typeof e&&"string"==typeof i?8*(r[e]||0)+(l[i]||0):{level:0,facility:0}}},{}]},{},[1]); \ No newline at end of file +"use strict";!function s(l,n,o){function c(i,e){if(!n[i]){if(!l[i]){var t="function"==typeof require&&require;if(!e&&t)return t(i,!0);if(d)return d(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var r=n[i]={exports:{}};l[i][0].call(r.exports,function(e){return c(l[i][1][e]||e)},r,r.exports,s,l,n,o)}return n[i].exports}for(var d="function"==typeof require&&require,e=0;e/,prinmr:/^\d+ /,prival:/<(\d+)>/,month:/^[A-Za-z]{3} /,day:/^\d{1,2}/,time:/^\d+:\d+:\d+ /,ts:/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\S+ /,invalid:/[^a-zA-Z0-9\.\$\-_#%\/\[\]\(\)]/,sdata:/\[(\S+)( [^\=]+\=\"[^\"]*\")+\]/g,asdata:/^\s*[^\[]+\[/,bsdata:/^\s*\[/,cef:/^CEF:\d+/},C={cef:!0,fields:!0,pid:!0,generateTimestamp:!0};function L(e){do{var i=e.shift();if(void 0===i)return i;i=i.trim()}while(!i);return i}function O(e){var i=!0,t=!1,a=void 0;try{for(var r,s=e[Symbol.iterator]();!(i=(r=s.next()).done);i=!0){var l=r.value.trim();if(l)return l}}catch(e){t=!0,a=e}finally{try{i||null==s.return||s.return()}finally{if(t)throw a}}}function S(e,i){if(e.host)if(e.appName)if(e.pid){if(e.messageid)return!!e.structuredData||(e.structuredData=i.trim(),!1);e.messageid=i.trim()}else e.pid=i.trim();else e.appName=i.trim();else e.host=i.trim()}i.exports=function(e,i){try{return function(e,i){i=i?Object.assign({},C,i):C;var t=e.match(F.pri),s={originalMessage:e};if(t){s.pri=t[0],s.prival=parseInt(s.pri.match(F.prival)[1]);var a=T.get(s.prival);s.facilityval=a.facility,s.levelval=a.level,s.facility=T.FACILITY[a.facility].id,s.level=T.LEVEL[a.level].id}else s.pri="",s.prival=null;for(var r=e.substring(s.pri.length).split(" "),l=!1;e.length&&!l;){var n=L(r)+" ",o=O(r);if(n.match(F.prinmr))s.version=parseInt(n),s.type="RFC5424",(n=L(r)+" ").match(F.ts)&&(s.ts=new Date(Date.parse(n.match(F.ts)[0].trim())));else if(n.match(F.month)&&o&&o.match(F.day)){s.type="BSD";var c=n.trim(),d=L(r),u=L(r),f=(new Date).getYear()+1900,m="";4!==u.length||Number.isNaN(+u)||(f=+u,u=L(r)),I(r[0].trim())&&(m=L(r)),s.ts=new Date(Date.parse("".concat(f," ").concat(c," ").concat(d," ").concat(u," ").concat(m).trim()))}else s.type="UNKNOWN",r.unshift(n.trim());l=!0}if(!s.ts&&i.generateTimestamp&&(s.ts=new Date),s.type){var p=function(e){r.unshift(e),s.message=r.join(" "),l=!0};for(l=!1;e.length&&!l;)if(n=L(r))if(n.endsWith(":")){var g=n.replace(/:$/,"").trim();g.match(F.invalid)?p(n):(S(s,g),s.message=r.join(" "),l=!0)}else if(r.length)if(n.match(F.invalid))p(n);else{var h=S(s,n.replace(/: $/,"").trim());!0===h?(r.unshift(n),s.message=r.join(" "),l=!0):!1===h&&(s.message=r.join(" "),l=!0)}else p(n);else l=!0}else s.message=r.join(" ");if(s.chain=(s.host||"").split("/"),s.host=s.chain.pop(),"RFC5424"==s.type){var y=F.bsdata.test(s.message),v=F.asdata.test(s.message),b=s.message.match(F.sdata)||[],N=0;if(s.structuredData=b.map(function(e){var a={},r=null;return N=s.message.indexOf(e)+e.length+1,e.replace(/(^\[)|(\]$)/g,"").split(" ").forEach(function(e,i){if(e.trim())if(0==i)a.$id=e;else{var t=e.split("=");t[0]&&t[1]&&'"'!=t[1]?(r=t.shift(),a[r]=t.join("=").replace(/\"/g,"")):t[0]&&void 0===t[1]?a[r]+=" "+(t[0]||"").replace(/\"/g,""):!t[0]||t[1].length&&'"'!=t[1]||(a[r]+=" "+(t[0]||"").replace(/\"/g,"")+"=")}}),a}),s.structuredData.length){var E=s.message.indexOf("[");y?(0<=E&&(s.header=e.substring(0,e.length-s.message.length)),s.message=s.message.substring(N)):v&&0<=E&&(s.header=e.substring(0,e.length-s.message.length),s.message=s.message.substring(0,E))}}if(!1!==i.cef&&F.cef.test(s.message)){s.type="CEF";var x=j.parse(s.message);s.cef=x.headers,s.fields=x.fields}else if(!1!==i.fields&&"UNKNOWN"!=s.type){var w=[];s.message.split(",").forEach(function(e){var i=e.split("=");2==i.length&&(w[i[0]]=i[1])}),s.fields=w}if(s.header=s.header||e.substring(0,e.length-s.message.length),s.message=s.message.trim(),i.pid&&s.appName&&s.appName.endsWith("]")){var D=s.appName.indexOf("[");0<=D&&(s.pid=s.appName.substring(D+1,s.appName.length-1),s.appName=s.appName.substring(0,D))}return s}(e,i)}catch(e){return{err:e}}}},{"./cef.js":2,"./isValidTimeZone.js":3,"./pri.js":5}],5:[function(e,i,t){var a=[{id:"kern",label:"kernel messages"},{id:"user",label:"user-level messages"},{id:"mail",label:"mail system"},{id:"daemon",label:"system daemons"},{id:"auth",label:"security/authorization messages"},{id:"syslog",label:"messages generated internally by syslogd"},{id:"lpr",label:"line printer subsystem"},{id:"news",label:"network news subsystem"},{id:"uucp",label:"UUCP subsystem"},{id:"cron",label:"clock daemon"},{id:"authpriv",label:"security/authorization messages"},{id:"ftp",label:"FTP daemon"},{id:"ntp",label:"NTP subsystem"},{id:"security",label:"log audit"},{id:"console",label:"log alert"},{id:"solaris-cron",label:"clock daemon"},{id:"local0",label:"locally used facility 0"},{id:"local1",label:"locally used facility 0"},{id:"local2",label:"locally used facility 0"},{id:"local3",label:"locally used facility 0"},{id:"local4",label:"locally used facility 0"},{id:"local5",label:"locally used facility 0"},{id:"local6",label:"locally used facility 0"},{id:"local7",label:"locally used facility 0"}],r=[{id:"emerg",label:"system is unusable"},{id:"alert",label:"action must be taken immediately"},{id:"crit",label:"critical conditions"},{id:"error",label:"error conditions"},{id:"warn",label:"warning conditions"},{id:"notice",label:"normal but significant condition"},{id:"info",label:"informational messages"},{id:"debug",label:"debug-level messages"}],s=[],l=[];a.forEach(function(e,i){return s[e.id]=i}),r.forEach(function(e,i){return l[e.id]=i}),i.exports.LEVEL=r,i.exports.FACILITY=a,i.exports.LEVELS=l,i.exports.FACILITIES=s,i.exports.get=function(e,i){return"number"==typeof e&&void 0===i?{level:7&e,facility:e>>3}:"number"==typeof e&&"number"==typeof i?8*e+i:"string"==typeof e&&"number"==typeof i?8*(s[e]||0)+i:"number"==typeof e&&"string"==typeof i?8*e+(l[i]||0):"string"==typeof e&&"string"==typeof i?8*(s[e]||0)+(l[i]||0):{level:0,facility:0}}},{}]},{},[1]); \ No newline at end of file diff --git a/package.json b/package.json index d50ddb4..8fa028f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nsyslog-parser-2", - "version": "0.9.9", + "version": "0.9.10", "description": "Fork of David Gómez Matarrodona's Syslog Parser. Accepts RFC 3164 (BSD), RFC 5424 and CEF formats", "author": "David Gómez Matarrodona ", "url": "https://github.com/hanvyj/nsyslog-parser", diff --git a/parser.js b/parser.js index c7fef26..d9e2518 100644 --- a/parser.js +++ b/parser.js @@ -6,8 +6,8 @@ const RXS = { "pri" : /^<\d+>/, "prinmr" : /^\d+ /, "prival" : /<(\d+)>/, - "month" : /^[A-Za-z][a-z]{2} /, - "day" : /^\d{1,2} /, + "month" : /^[A-Za-z]{3} /, + "day" : /^\d{1,2}/, "time" : /^\d+:\d+:\d+ /, "ts" : /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\S+ /, "invalid" : /[^a-zA-Z0-9\.\$\-_#%\/\[\]\(\)]/, @@ -24,7 +24,12 @@ const DOPS = { generateTimestamp: true } -function peek(arr) { +/** + * Removes the first non whitespace item from the array and returns the item + * @param {string[]} arr the array to shift the item from + * @returns the first non whitespace item of the array + */ +function shiftItem(arr) { do { var item = arr.shift(); if(item===undefined) return item; @@ -34,6 +39,21 @@ function peek(arr) { return item; } +/** + * Gets the first non whitespace item from the array without mutating the array + * @param {string[]} arr the array to peek for the first item + * @returns the first non whitespace item of the array + */ +function peekItem(arr) { + for (const item of arr) { + let trimmedItem = item.trim(); + if (trimmedItem) { + return trimmedItem; + } + } + return undefined; +} + function assign(entry,item) { if(!entry.host) entry.host = item.trim(); else if(!entry.appName) entry.appName = item.trim(); @@ -78,33 +98,34 @@ function parse(line,opts) { // Date search var endparse = false; while(line.length && !endparse) { - var item = peek(items)+" "; + var item = shiftItem(items)+" "; + var nextItem = peekItem(items); // RFC RFC5424 if(item.match(RXS.prinmr)) { entry.version = parseInt(item); entry.type = "RFC5424"; - item = peek(items)+" "; + item = shiftItem(items)+" "; if(item.match(RXS.ts)) { entry.ts = new Date(Date.parse(item.match(RXS.ts)[0].trim())); } } // BSD - else if(item.match(RXS.month)) { + else if(item.match(RXS.month) && nextItem && nextItem.match(RXS.day)) { entry.type = "BSD"; const month = item.trim(); - const day = peek(items); - let time = peek(items); + const day = shiftItem(items); + let time = shiftItem(items); let year = new Date().getYear() + 1900 let timezone = ""; // Check if the time is actually a year field and it is in the form "MMM dd yyyy HH:mm:ss" if (time.length === 4 && !Number.isNaN(+time)) { year = +time; - time = peek(items); + time = shiftItem(items); } // Check if we have a timezone if (isValidTimeZone(items[0].trim())) { - timezone = peek(items); + timezone = shiftItem(items); } entry.ts = new Date(Date.parse(`${year} ${month} ${day} ${time} ${timezone}`.trim())); @@ -130,7 +151,7 @@ function parse(line,opts) { } while(line.length && !endparse) { - var item = peek(items); + var item = shiftItem(items); if(!item) { endparse = true; } diff --git a/parser.test.js b/parser.test.js index c762804..d2e2d28 100644 --- a/parser.test.js +++ b/parser.test.js @@ -31,6 +31,24 @@ test.each([ fields: [], header: "<34>Oct 11 22:14:15 mymachine su: ", }, + { + originalMessage: + "<34>OCT 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8", + pri: "<34>", + prival: 34, + facilityval: 4, + levelval: 2, + facility: "auth", + level: "crit", + type: "BSD", + ts: dateAsCurrentYear("2019-10-11T21:14:15.000Z"), + host: "mymachine", + appName: "su", + message: "'su root' failed for lonvick on /dev/pts/8", + chain: [], + fields: [], + header: "<34>OCT 11 22:14:15 mymachine su: ", + }, { originalMessage: "<34>Oct 11 22:14:15.123 UTC mymachine su: 'su root' failed for lonvick on /dev/pts/8",