From aa92f0fc939f660fd542a808f9d7a878eefd8aed Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 13 Jul 2020 10:26:33 +0200 Subject: [PATCH] WiP: feat(xo-server-icinga2): template filter --- .../xo-server-backup-reports/src/index.js | 21 +++++++++++++++---- .../xo-server-transport-icinga2/src/index.js | 19 +++++++++++++++-- .../xo-server/src/xo-mixins/jobs/index.js | 9 ++------ 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/packages/xo-server-backup-reports/src/index.js b/packages/xo-server-backup-reports/src/index.js index 1009c22ae..6ee73af36 100644 --- a/packages/xo-server-backup-reports/src/index.js +++ b/packages/xo-server-backup-reports/src/index.js @@ -272,7 +272,7 @@ class BackupReportsXoPlugin { } } - async _metadataHandler(log, { name: jobName }, schedule, force) { + async _metadataHandler(log, job, schedule, force) { const xo = this._xo const formatDate = createDateFormatter(schedule?.timezone) @@ -290,7 +290,7 @@ class BackupReportsXoPlugin { `## Global status: ${log.status}`, '', `- **Job ID**: ${log.jobId}`, - `- **Job name**: ${jobName}`, + `- **Job name**: ${job.name}`, `- **Run ID**: ${log.id}`, ...getTemporalDataMarkdown(log.end, log.start, formatDate), n !== 0 && `- **Successes**: ${nSuccesses} / ${n}`, @@ -349,10 +349,12 @@ class BackupReportsXoPlugin { markdown.push('---', '', `*${pkg.name} v${pkg.version}*`) return this._sendReport({ + job, subject: `[Xen Orchestra] ${log.status} − Metadata backup report for ${ log.jobName } ${STATUS_ICON[log.status]}`, markdown: toMarkdown(markdown), + schedule, success: log.status === 'success', nagiosMarkdown: log.status === 'success' @@ -363,10 +365,10 @@ class BackupReportsXoPlugin { }) } - async _ngVmHandler(log, { name: jobName, settings }, schedule, force) { + async _ngVmHandler(log, job, schedule, force) { const xo = this._xo - const mailReceivers = get(() => settings[''].reportRecipients) + const mailReceivers = get(() => job.settings[''].reportRecipients) const { reportWhen, mode } = log.data || {} const formatDate = createDateFormatter(schedule?.timezone) @@ -385,12 +387,17 @@ class BackupReportsXoPlugin { '', `*${pkg.name} v${pkg.version}*`, ] + + const jobName = job.name + return this._sendReport({ subject: `[Xen Orchestra] ${ log.status } − Backup report for ${jobName} ${STATUS_ICON[log.status]}`, + job, mailReceivers, markdown: toMarkdown(markdown), + schedule, success: false, nagiosMarkdown: `[Xen Orchestra] [${ log.status @@ -649,8 +656,10 @@ class BackupReportsXoPlugin { markdown.push('---', '', `*${pkg.name} v${pkg.version}*`) return this._sendReport({ + job, mailReceivers, markdown: toMarkdown(markdown), + schedule, subject: `[Xen Orchestra] ${log.status} − Backup report for ${jobName} ${ STATUS_ICON[log.status] }`, @@ -724,7 +733,9 @@ class BackupReportsXoPlugin { markdown = markdown.join('\n') return this._sendReport({ subject: `[Xen Orchestra] ${globalStatus} ${icon}`, + job, markdown, + schedule, success: false, nagiosMarkdown: `[Xen Orchestra] [${globalStatus}] Error : ${error.message}`, }) @@ -913,6 +924,7 @@ class BackupReportsXoPlugin { markdown = markdown.join('\n') return this._sendReport({ + job, markdown, subject: `[Xen Orchestra] ${globalStatus} − Backup report for ${tag} ${ globalSuccess @@ -921,6 +933,7 @@ class BackupReportsXoPlugin { ? ICON_FAILURE : ICON_SKIPPED }`, + schedule, success: globalSuccess, nagiosMarkdown: globalSuccess ? `[Xen Orchestra] [Success] Backup report for ${tag}` diff --git a/packages/xo-server-transport-icinga2/src/index.js b/packages/xo-server-transport-icinga2/src/index.js index 7eee22d99..f1fdd3267 100644 --- a/packages/xo-server-transport-icinga2/src/index.js +++ b/packages/xo-server-transport-icinga2/src/index.js @@ -1,6 +1,14 @@ -import assert from 'assert' +import assert, { match } from 'assert' import { URL } from 'url' +const RE = /(\\*)\{([^}]+)\}/ +const evalTemplate = (template, fn) => + template.replace(RE, ([, escape, key]) => { + const n = escape.length + const escaped = n % 2 !== 0 + return escaped ? match.slice(n - 1 / 2) : escaped.slice(n / 2) + fn(key) + }) + // ============================================================================= export const configurationSchema = { @@ -83,7 +91,14 @@ class XoServerIcinga2 { this._url = serverUrl.href this._filter = - configuration.filter !== undefined ? configuration.filter : '' + configuration.filter !== undefined + ? compileTemplate(configuration.filter, { + jobId: _ => _.job.id, + jobName: _ => _.job.name, + scheduleId: _ => _.schedule.id, + scheduleName: _ => _.schedule.name, + }) + : '' this._acceptUnauthorized = configuration.acceptUnauthorized } diff --git a/packages/xo-server/src/xo-mixins/jobs/index.js b/packages/xo-server/src/xo-mixins/jobs/index.js index af95a21c1..829af5827 100644 --- a/packages/xo-server/src/xo-mixins/jobs/index.js +++ b/packages/xo-server/src/xo-mixins/jobs/index.js @@ -310,10 +310,7 @@ export default class Jobs { true ) - app.emit('job:terminated', runJobId, { - type: job.type, - status, - }) + app.emit('job:terminated', { job, runJobId, schedule, status }) } finally { this.updateJob({ id, runId: null })::ignoreErrors() delete runningJobs[id] @@ -332,9 +329,7 @@ export default class Jobs { }, true ) - app.emit('job:terminated', runJobId, { - type: job.type, - }) + app.emit('job:terminated', { job, runJobId, schedule }) throw error } }