diff --git a/infra/n8n/weekly-organization-report-outlook.js b/infra/n8n/weekly-organization-report-outlook.js new file mode 100644 index 0000000..bd84e8b --- /dev/null +++ b/infra/n8n/weekly-organization-report-outlook.js @@ -0,0 +1,41 @@ +const esc = (value) => String(value ?? '') + .replace(/&/g, '&').replace(//g, '>') + .replace(/"/g, '"').replace(/'/g, ''') + .replace(/[^\x20-\x7e]/g, (character) => `${character.codePointAt(0)};`); +const now = new Date(); +const end = new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate())); +end.setUTCDate(end.getUTCDate() - ((end.getUTCDay() + 6) % 7)); +const start = new Date(end.getTime() - 7 * 86400000); +const formatDate = (value) => new Date(value).toLocaleString('de-DE', { timeZone: 'Europe/Berlin', dateStyle: 'medium', timeStyle: 'short' }); +const groups = new Map(); +for (const item of items) { + const payload = item.json.payload || {}, ninja = payload.NinjaOne || payload.ninjaOne || {}; + const id = String(ninja.OrganizationId || ninja.organizationId || 'unknown'); + if (!groups.has(id)) groups.set(id, { id, name: String(ninja.OrganizationName || ninja.organizationName || `Organisation ${id}`), devices: [] }); + groups.get(id).devices.push({ name: item.json.machine_name || payload.MachineName || 'Unbekannt', state: String(item.json.alert_state || payload.AlertState || 'unknown').toLowerCase(), payload }); +} +const output = []; +for (const group of groups.values()) { + let warnings = 0, criticals = 0, totalEvents = 0, cveCritical = 0; + const ips = new Set(), rows = []; + for (const device of group.devices.sort((a, b) => a.name.localeCompare(b.name))) { + if (device.state === 'warning') warnings++; + if (device.state === 'critical') criticals++; + cveCritical += Number((device.payload.VulnerabilityCorrelation || {}).CriticalCount || 0); + const events = (device.payload.Events || []).filter((event) => { const timestamp = new Date(event.Timestamp); return !Number.isNaN(timestamp) && timestamp >= start && timestamp < end; }); + totalEvents += events.length; + if (!events.length) { rows.push(`
${risk[0]}OfficeCom Sentinel Sicherheitsbericht${esc(group.name)} | ${esc(start.toLocaleDateString('de-DE'))} bis ${esc(end.toLocaleDateString('de-DE'))} | |||||||
Automatisch erstellt am ${esc(formatDate(now))} durch OfficeCom Sentinel. |