Script example

Script file port_admin_state_monitor.1.0.py

#-*- coding: utf-8 -*-
#
#Copyright (c) 2017 Hewlett Packard Enterprise Development LP
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing,
#software distributed under the License is distributed on an
#"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#KIND, either express or implied. See the License for the
#specific language governing permissions and limitations
#under the License.

Manifest = {
    'Name': 'port_admin_state_monitor',
    'Description': 'Port Admin Status Monitoring Agent',
    'Version': '1.0',
    'Author': 'Aruba Networks'
}

ParameterDefinitions = {
    'port_id': {
        'Name': 'Port Id',
        'Description': 'Port to be monitored',
        'Type': 'string',
        'Default': '1/1/1'
    }
}

class Policy(NAE):

    def __init__(self):

#Port status
        uri1 = '/rest/v1/system/ports/{}?attributes=admin'
        self.m1 = Monitor(
            uri1,
            'Port admin status',
            [self.params['port_id']])
        self.r1 = Rule('Port disabled administratively')
        self.r1.condition('transition {} from "up" to "down"', [self.m1])
        self.r1.action(self.action_port_down)

#Reset policy status when port is up
        self.r2 = Rule('Port enabled administratively')
        self.r2.condition('transition {} from "down" to "up"', [self.m1])
        self.r2.action(self.action_port_up)

    def action_port_down(self, event):
        ActionSyslog(
            'Port {} is disabled administratively',
            [self.params['port_id']])
        ActionCLI("show lldp configuration {}", [self.params['port_id']])
        ActionCLI("show interface {} extended", [self.params['port_id']])
        if self.get_alert_level() != AlertLevel.CRITICAL:
            self.set_alert_level(AlertLevel.CRITICAL)
        self.logger.debug("### Critical Callback executed")

    def action_port_up(self, event):
        self.logger.info("Current alert level: " + str(self.get_alert_level()))
        if self.get_alert_level() is not None:
            ActionSyslog(
                'Port {} is enabled administratively',
                [self.params['port_id']])
            self.remove_alert_level()
            self.logger.debug('Unset the previous status')

        self.logger.debug('### Normal Callback executed')

Script in base64 encoded format

Iy0qLSBjb2Rpbmc6IHV0Zi04IC0qLQ0KIw0KI0NvcHlyaWdodCAoYykgMjAxNyBIZXdsZXR0IFBhY2thcmQgRW50ZXJwcmlzZSBEZXZlbG9wbWVudCBMUA0KIw0KI0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KI3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCiNZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCiMNCiNodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCiMNCiNVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQojc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCiMiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCiNLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KI3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCiN1bmRlciB0aGUgTGljZW5zZS4NCg0KTWFuaWZlc3QgPSB7DQogICAgJ05hbWUnOiAncG9ydF9hZG1pbl9zdGF0ZV9tb25pdG9yJywNCiAgICAnRGVzY3JpcHRpb24nOiAnUG9ydCBBZG1pbiBTdGF0dXMgTW9uaXRvcmluZyBBZ2VudCcsDQogICAgJ1ZlcnNpb24nOiAnMS4wJywNCiAgICAnQXV0aG9yJzogJ0FydWJhIE5ldHdvcmtzJw0KfQ0KDQpQYXJhbWV0ZXJEZWZpbml0aW9ucyA9IHsNCiAgICAncG9ydF9pZCc6IHsNCiAgICAgICAgJ05hbWUnOiAnUG9ydCBJZCcsDQogICAgICAgICdEZXNjcmlwdGlvbic6ICdQb3J0IHRvIGJlIG1vbml0b3JlZCcsDQogICAgICAgICdUeXBlJzogJ3N0cmluZycsDQogICAgICAgICdEZWZhdWx0JzogJzEvMS8xJw0KICAgIH0NCn0NCg0KY2xhc3MgUG9saWN5KE5BRSk6DQoNCiAgICBkZWYgX19pbml0X18oc2VsZik6DQoNCiNQb3J0IHN0YXR1cw0KICAgICAgICB1cmkxID0gJy9yZXN0L3YxL3N5c3RlbS9wb3J0cy97fT9hdHRyaWJ1dGVzPWFkbWluJw0KICAgICAgICBzZWxmLm0xID0gTW9uaXRvcigNCiAgICAgICAgICAgIHVyaTEsDQogICAgICAgICAgICAnUG9ydCBhZG1pbiBzdGF0dXMnLA0KICAgICAgICAgICAgW3NlbGYucGFyYW1zWydwb3J0X2lkJ11dKQ0KICAgICAgICBzZWxmLnIxID0gUnVsZSgnUG9ydCBkaXNhYmxlZCBhZG1pbmlzdHJhdGl2ZWx5JykNCiAgICAgICAgc2VsZi5yMS5jb25kaXRpb24oJ3RyYW5zaXRpb24ge30gZnJvbSAidXAiIHRvICJkb3duIicsIFtzZWxmLm0xXSkNCiAgICAgICAgc2VsZi5yMS5hY3Rpb24oc2VsZi5hY3Rpb25fcG9ydF9kb3duKQ0KDQojUmVzZXQgcG9saWN5IHN0YXR1cyB3aGVuIHBvcnQgaXMgdXANCiAgICAgICAgc2VsZi5yMiA9IFJ1bGUoJ1BvcnQgZW5hYmxlZCBhZG1pbmlzdHJhdGl2ZWx5JykNCiAgICAgICAgc2VsZi5yMi5jb25kaXRpb24oJ3RyYW5zaXRpb24ge30gZnJvbSAiZG93biIgdG8gInVwIicsIFtzZWxmLm0xXSkNCiAgICAgICAgc2VsZi5yMi5hY3Rpb24oc2VsZi5hY3Rpb25fcG9ydF91cCkNCg0KICAgIGRlZiBhY3Rpb25fcG9ydF9kb3duKHNlbGYsIGV2ZW50KToNCiAgICAgICAgQWN0aW9uU3lzbG9nKA0KICAgICAgICAgICAgJ1BvcnQge30gaXMgZGlzYWJsZWQgYWRtaW5pc3RyYXRpdmVseScsDQogICAgICAgICAgICBbc2VsZi5wYXJhbXNbJ3BvcnRfaWQnXV0pDQogICAgICAgIEFjdGlvbkNMSSgic2hvdyBsbGRwIGNvbmZpZ3VyYXRpb24ge30iLCBbc2VsZi5wYXJhbXNbJ3BvcnRfaWQnXV0pDQogICAgICAgIEFjdGlvbkNMSSgic2hvdyBpbnRlcmZhY2Uge30gZXh0ZW5kZWQiLCBbc2VsZi5wYXJhbXNbJ3BvcnRfaWQnXV0pDQogICAgICAgIGlmIHNlbGYuZ2V0X2FsZXJ0X2xldmVsKCkgIT0gQWxlcnRMZXZlbC5DUklUSUNBTDoNCiAgICAgICAgICAgIHNlbGYuc2V0X2FsZXJ0X2xldmVsKEFsZXJ0TGV2ZWwuQ1JJVElDQUwpDQogICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCIjIyMgQ3JpdGljYWwgQ2FsbGJhY2sgZXhlY3V0ZWQiKQ0KDQogICAgZGVmIGFjdGlvbl9wb3J0X3VwKHNlbGYsIGV2ZW50KToNCiAgICAgICAgc2VsZi5sb2dnZXIuaW5mbygiQ3VycmVudCBhbGVydCBsZXZlbDogIiArIHN0cihzZWxmLmdldF9hbGVydF9sZXZlbCgpKSkNCiAgICAgICAgaWYgc2VsZi5nZXRfYWxlcnRfbGV2ZWwoKSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIEFjdGlvblN5c2xvZygNCiAgICAgICAgICAgICAgICAnUG9ydCB7fSBpcyBlbmFibGVkIGFkbWluaXN0cmF0aXZlbHknLA0KICAgICAgICAgICAgICAgIFtzZWxmLnBhcmFtc1sncG9ydF9pZCddXSkNCiAgICAgICAgICAgIHNlbGYucmVtb3ZlX2FsZXJ0X2xldmVsKCkNCiAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCdVbnNldCB0aGUgcHJldmlvdXMgc3RhdHVzJykNCg0KICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnIyMjIE5vcm1hbCBDYWxsYmFjayBleGVjdXRlZCcp