Ad Widget

Collapse

Zabbix MS Teams Integration 6.4

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • mbriceno
    Junior Member
    • Aug 2023
    • 1

    #1

    Zabbix MS Teams Integration 6.4

    Hi fellas

    I am doing an integration with MS teams to my ZABBIX server.

    I am getting this issue:



    I am using this XML ms_teams

    <?xml version="1.0" encoding="UTF-8"?>
    <zabbix_export>
    <version>5.0</version>
    <date>2022-06-07T04:48:40Z</date>
    <media_types>
    <media_type>
    <name>MS Teams</name>
    <type>WEBHOOK</type>
    <parameters>
    <parameter>
    <name>alert_message</name>
    <value>{ALERT.MESSAGE}</value>
    </parameter>
    <parameter>
    <name>alert_subject</name>
    <value>{ALERT.SUBJECT}</value>
    </parameter>
    <parameter>
    <name>event_date</name>
    <value>{EVENT.DATE}</value>
    </parameter>
    <parameter>
    <name>event_id</name>
    <value>{EVENT.ID}</value>
    </parameter>
    <parameter>
    <name>event_nseverity</name>
    <value>{EVENT.NSEVERITY}</value>
    </parameter>
    <parameter>
    <name>event_opdata</name>
    <value>{EVENT.OPDATA}</value>
    </parameter>
    <parameter>
    <name>event_recovery_date</name>
    <value>{EVENT.RECOVERY.DATE}</value>
    </parameter>
    <parameter>
    <name>event_recovery_time</name>
    <value>{EVENT.RECOVERY.TIME}</value>
    </parameter>
    <parameter>
    <name>event_severity</name>
    <value>{EVENT.SEVERITY}</value>
    </parameter>
    <parameter>
    <name>event_source</name>
    <value>{EVENT.SOURCE}</value>
    </parameter>
    <parameter>
    <name>event_status</name>
    <value>{EVENT.STATUS}</value>
    </parameter>
    <parameter>
    <name>event_tags</name>
    <value>{EVENT.TAGS}</value>
    </parameter>
    <parameter>
    <name>event_time</name>
    <value>{EVENT.TIME}</value>
    </parameter>
    <parameter>
    <name>event_update_action</name>
    <value>{EVENT.UPDATE.ACTION}</value>
    </parameter>
    <parameter>
    <name>event_update_date</name>
    <value>{EVENT.UPDATE.DATE}</value>
    </parameter>
    <parameter>
    <name>event_update_message</name>
    <value>{EVENT.UPDATE.MESSAGE}</value>
    </parameter>
    <parameter>
    <name>event_update_status</name>
    <value>{EVENT.UPDATE.STATUS}</value>
    </parameter>
    <parameter>
    <name>event_update_time</name>
    <value>{EVENT.UPDATE.TIME}</value>
    </parameter>
    <parameter>
    <name>event_update_user</name>
    <value>{USER.FULLNAME}</value>
    </parameter>
    <parameter>
    <name>event_value</name>
    <value>{EVENT.VALUE}</value>
    </parameter>
    <parameter>
    <name>host_ip</name>
    <value>{HOST.IP}</value>
    </parameter>
    <parameter>
    <name>host_name</name>
    <value>{HOST.NAME}</value>
    </parameter>
    <parameter>
    <name>teams_endpoint</name>
    <value><PLACE WEBHOOK URL HERE></value>
    </parameter>
    <parameter>
    <name>trigger_description</name>
    <value>{TRIGGER.DESCRIPTION}</value>
    </parameter>
    <parameter>
    <name>trigger_id</name>
    <value>{TRIGGER.ID}</value>
    </parameter>
    <parameter>
    <name>use_default_message</name>
    <value>false</value>
    </parameter>
    <parameter>
    <name>zabbix_url</name>
    <value>{$ZABBIX.URL}</value>
    </parameter>
    </parameters>
    <script>var SEVERITY_COLORS = [
    '#97AAB3', // Not classified.
    '#7499FF', // Information.
    '#FFC859', // Warning.
    '#FFA059', // Average.
    '#E97659', // High.
    '#E45959', // Disaster.
    '#009900', // Resolved.
    '#000000' // Default.
    ];

    try {
    var params = JSON.parse(value);

    if (typeof params.teams_endpoint !== 'string' || params.teams_endpoint.trim() === '') {
    throw 'Cannot get teams_endpoint';
    }
    else if (!params.teams_endpoint.startsWith('http')) {
    throw 'Invalid MS Teams webhook URL: ' + params.teams_endpoint;
    }

    params.zabbix_url = (params.zabbix_url.endsWith('/'))
    ? params.zabbix_url.slice(0, -1) : params.zabbix_url;

    if ([0, 1, 2, 3].indexOf(parseInt(params.event_source)) === -1) {
    throw 'Incorrect "event_source" parameter given: "' + params.event_source + '".\nMust be 0-3.';
    }

    // Set "use_default_message" to true for non trigger-based events.
    if (params.event_source !== '0') {
    params.use_default_message = 'true';
    }

    // Check {EVENT.VALUE} for trigger-based and internal events.
    if (params.event_value !== '0' && params.event_value !== '1'
    && (params.event_source === '0' || params.event_source === '3')) {
    throw 'Incorrect "event_value" parameter given: "' + params.event_value + '".\nMust be 0 or 1.';
    }

    // Check {EVENT.UPDATE.STATUS} only for trigger-based events.
    if (params.event_update_status !== '0' && params.event_update_status !== '1' && params.event_source === '0') {
    throw 'Incorrect "event_update_status" parameter given: "' + params.event_update_status + '".\nMust be 0 or 1.';
    }

    if (params.event_value == 0) {
    params.event_nseverity = '6';
    }

    if (!SEVERITY_COLORS[params.event_nseverity]) {
    params.event_nseverity = '7';
    }

    var request = new CurlHttpRequest(),
    facts = [],
    body = {
    themeColor: SEVERITY_COLORS[params.event_nseverity].replace('#', ''),
    summary: params.alert_subject,
    sections: [
    {
    markdown: 'false',
    activityTitle: params.alert_subject,
    activitySubtitle: 'On ' + params.host_name + ' [' + params.host_ip + ']',
    text: (params.use_default_message.toLowerCase() == 'true')
    ? params.alert_message
    : params.trigger_description
    }
    ],
    potentialAction: [
    {
    '@type': 'OpenUri',
    name: (params.event_source === '0')
    ? 'Event Info'
    : 'Zabbix Home',
    targets: [
    {
    os: 'default',
    uri: (params.event_source === '0')
    ? params.zabbix_url + '/tr_events.php?triggerid=' +
    params.trigger_id + '&eventid=' + params.event_id
    : params.zabbix_url
    }
    ]
    }
    ]
    };

    if (params.use_default_message.toLowerCase() !== 'true') {
    // Problem message.
    if (params.event_value === '1' && params.event_update_status === '0') {
    facts.push({
    name: 'Event time',
    value: params.event_time + ' ' + params.event_date
    });
    }
    // Update message.
    else if (params.event_update_status === '1') {
    body.sections[0].text = params.event_update_user + ' ' + params.event_update_action + '.';

    if (params.event_update_message) {
    body.sections[0].text += '<br>Message:<br>' + params.event_update_message;
    }

    facts.push({
    name: 'Event update time',
    value: params.event_update_time + ' ' + params.event_update_date
    });
    }
    // Resolved message.
    else {
    facts.push({
    name: 'Recovery time',
    value: params.event_recovery_time + ' ' + params.event_recovery_date
    });
    }

    if (params.event_severity && params.event_severity !== '{EVENT.SEVERITY}') {
    facts.push({
    name: 'Severity',
    value: params.event_severity
    });
    }


    if (params.event_opdata && params.event_opdata !== '{EVENT.OPDATA}') {
    facts.push({
    name: 'Operational data',
    value: params.event_opdata
    });
    }

    if (params.event_tags && params.event_tags !== '{EVENT.TAGS}') {
    facts.push({
    name: 'Event tags',
    value: params.event_tags
    });
    }

    Object.keys(params)
    .forEach(function (key) {
    if (key.startsWith('fact_') && params[key] !== '') {
    facts.push({
    name: key.substring(5),
    value: params[key]
    });
    }
    else if (key.startsWith('openUri_') && params[key] !== '' && !params[key].startsWith('{')) {
    body.potentialAction.push({
    '@type': 'OpenUri',
    name: key.substring(8),
    targets: [
    {
    os: 'default',
    uri: params[key]
    }
    ]
    });
    }
    });
    body.sections[0].facts = facts;
    }

    body.sections[0].text = body.sections[0].text.replace(/(?:\r\n|\r|\n)/g, '<br>');

    request.AddHeader('Content-Type: application/json');

    if (typeof params.HTTPProxy === 'string' && params.HTTPProxy !== '') {
    request.SetProxy(params.HTTPProxy);
    }

    Zabbix.Log(4, '[ MS Teams Webhook ] JSON: ' + JSON.stringify(body));

    var response = request.Post(params.teams_endpoint, JSON.stringify(body));

    Zabbix.Log(4, '[ MS Teams Webhook ] Response: ' + response);

    if (response === '1') {
    return 'OK';
    }
    else {
    Zabbix.Log(4, '[ MS Teams Webhook ] FAILED with response: ' + response);
    throw response;
    }
    }
    catch (error) {
    Zabbix.Log(3, '[ MS Teams Webhook ] ERROR: ' + error);
    throw 'Sending failed: ' + error;
    }</script>
    <message_templates>
    <message_template>
    <event_source>DISCOVERY</event_source>
    <operation_mode>PROBLEM</operation_mode>
    <subject>Discovery: {DISCOVERY.DEVICE.STATUS} {DISCOVERY.DEVICE.IPADDRESS}</subject>
    <message>Discovery rule: {DISCOVERY.RULE.NAME}

    Device IP: {DISCOVERY.DEVICE.IPADDRESS}
    Device DNS: {DISCOVERY.DEVICE.DNS}
    Device status: {DISCOVERY.DEVICE.STATUS}
    Device uptime: {DISCOVERY.DEVICE.UPTIME}

    Device service name: {DISCOVERY.SERVICE.NAME}
    Device service port: {DISCOVERY.SERVICE.PORT}
    Device service status: {DISCOVERY.SERVICE.STATUS}
    Device service uptime: {DISCOVERY.SERVICE.UPTIME}</message>
    </message_template>
    <message_template>
    <event_source>AUTOREGISTRATION</event_source>
    <operation_mode>PROBLEM</operation_mode>
    <subject>Autoregistration: {HOST.HOST}</subject>
    <message>Host name: {HOST.HOST}
    Host IP: {HOST.IP}
    Agent port: {HOST.PORT}</message>
    </message_template>
    <message_template>
    <event_source>TRIGGERS</event_source>
    <operation_mode>PROBLEM</operation_mode>
    <subject>Problem: {EVENT.NAME}</subject>
    <message>Problem started at {EVENT.TIME} on {EVENT.DATE}
    Problem name: {EVENT.NAME}
    Host: {HOST.NAME}
    Severity: {EVENT.SEVERITY}
    Operational data: {EVENT.OPDATA}
    Original problem ID: {EVENT.ID}
    {TRIGGER.URL}</message>
    </message_template>
    <message_template>
    <event_source>TRIGGERS</event_source>
    <operation_mode>RECOVERY</operation_mode>
    <subject>Resolved: {EVENT.NAME}</subject>
    <message>Problem has been resolved in {EVENT.DURATION} at {EVENT.RECOVERY.TIME} on {EVENT.RECOVERY.DATE}
    Problem name: {EVENT.NAME}
    Host: {HOST.NAME}
    Severity: {EVENT.SEVERITY}
    Original problem ID: {EVENT.ID}
    {TRIGGER.URL}</message>
    </message_template>
    <message_template>
    <event_source>TRIGGERS</event_source>
    <operation_mode>UPDATE</operation_mode>
    <subject>Updated problem: {EVENT.NAME}</subject>
    <message>{USER.FULLNAME} {EVENT.UPDATE.ACTION} problem at {EVENT.UPDATE.DATE} {EVENT.UPDATE.TIME}.
    {EVENT.UPDATE.MESSAGE}

    Current problem status is {EVENT.STATUS}, acknowledged: {EVENT.ACK.STATUS}.</message>
    </message_template>
    </message_templates>
    </media_type>
    </media_types>
    </zabbix_export>
    ​​
    Any solution tho this issue?

    Thank you
  • bewog
    Junior Member
    • Apr 2023
    • 6

    #2
    Unreadable.

    Comment

    Working...