Exemplo n.º 1
0
def main():

    # set config file name
    conf_file = '/etc/zabbix/externalscripts/pystormon/conf.d/pystormon.conf'

    # read network device parameters from config and save it to dict
    nd_parameters = configread(conf_file, 'NetworkDevice', 'device_file',
                               'login', 'password', 'name_space')

    # read storage device parameters from config and save it to another dict
    sd_parameters = configread(conf_file, 'StorageDevice',
                               'storage_cim_map_file')

    # form dictionary of matching storage concepts and cim properties
    # more details in https://www.ibm.com/support/knowledgecenter/STHGUJ_8.3.1/com.ibm.storwize.v5000.831.doc/svc_conceptsmaptocimconcepts_3skacv.html
    with open(sd_parameters['storage_cim_map_file'],
              "r") as storage_cim_map_file:
        sc_maps = load(storage_cim_map_file)

    # open config file with list of monitored storages
    device_list_file = open(nd_parameters['device_file'])

    # unpack storage list to variables
    for device_line in device_list_file:
        device_type, device_name, device_ip = device_line.split(':')

        # connect to each storage via WBEM, get conn object
        if device_type == 'storwize':
            device = WBEMDevice(device_name, device_ip, nd_parameters['login'],
                                nd_parameters['password'],
                                nd_parameters['slack_hook'])
            # get namespace from config, root/ibm by default
            namespace = nd_parameters.get('name_space', 'root/ibm')
            conn = device.Connect(namespace)

            # print all properties for all instances (objects) for cim classes from dict sc_maps
            for storage_concept in sc_maps:
                sc_cim_class = sc_maps[storage_concept]['cim_class']
                instances = conn.EnumerateInstances(
                    sc_cim_class, namespace=nd_parameters['name_space'])
                print(storage_concept, sc_cim_class)
                for instance in instances:
                    for prop_name, prop_value in instance.items():
                        print('  %s: %r' % (prop_name, prop_value))

    device_list_file.close()
Exemplo n.º 2
0
def main():

    # get config file name
    conf_file = (
        f'/etc/zabbix/externalscripts/{project}/conf.d/{project}.conf')

    # read network device parameters from config and save it to dict
    nd_parameters = configread(conf_file, 'NetworkDevice', 'device_file',
                               'login', 'password', 'name_space', 'printing')

    # read storage device parameters from config and save it to another dict
    sd_parameters = configread(conf_file, 'StorageDevice',
                               'monitored_properties_file')

    # get printing boolean variable from config for debugging enable/disable
    printing = eval(nd_parameters['printing'])

    # get variables
    login = nd_parameters['login']
    password = nd_parameters['password']

    # form dictionary of matching storage concepts and cim properties
    # more details in https://www.ibm.com/support/knowledgecenter/STHGUJ_8.3.1/com.ibm.storwize.v5000.831.doc/svc_conceptsmaptocimconcepts_3skacv.html
    with open(sd_parameters['monitored_properties_file'],
              "r") as monitored_properties_file:
        monitored_properties = load(monitored_properties_file)

    # open config file with list of monitored storages
    device_list_file = open(nd_parameters['device_file'])

    # unpack storage list to variables
    for device_line in device_list_file:
        device_type, device_name, device_ip = device_line.split(':')
        device_ip = device_ip.rstrip('\n')

        # connect to each storage via WBEM, get conn object
        if device_type == 'storwize':
            device = WBEMDevice(device_name, device_ip, login, password)
            # get namespace from config, root/ibm by default
            namespace = nd_parameters.get('name_space', 'root/ibm')
            conn = device.Connect(namespace)

            # initialize packet for sending to zabbix
            packet = []

            # iterate through dictionary of monitored storage concepts
            for storage_concept in monitored_properties:
                # get values of object perfomance statistic for all object of each type where perfomance class is given
                if 'cim_perfomance_class' in monitored_properties[
                        storage_concept]:
                    storage_objects_perf = storage_objects_get_perf(
                        conn, device_name,
                        monitored_properties[storage_concept]['cim_class'],
                        monitored_properties[storage_concept]
                        ['cim_property_name'],
                        monitored_properties[storage_concept]
                        ['cim_perfomance_class'],
                        monitored_properties[storage_concept]
                        ['cim_properties_perfomance'])

                    # get statistic for each storage object, form data for sending to zabbix
                    for so_name in storage_objects_perf:
                        for perf_counter_name, perf_counter_value in zip(
                                monitored_properties[storage_concept]
                            ['cim_properties_perfomance'],
                                storage_objects_perf[so_name]):
                            trapper_key = f'{perf_counter_name}[{storage_concept}.{so_name}]'
                            trapper_value = perf_counter_value

                            # form list of data for sending to zabbix
                            packet.append(
                                ZabbixMetric(device_name, trapper_key,
                                             trapper_value))

                            # print data for visual check
                            if printing:
                                print(device_name)
                                print(trapper_key)
                                print(trapper_value)

            # trying send data to zabbix
            zabbix_send(packet, printing, software)

    device_list_file.close()
Exemplo n.º 3
0
def main():

    # set config file name
    conf_file = '/etc/zabbix/externalscripts/pystormon/conf.d/pystormon.conf'

    # read network device parameters from config and save it to dict
    nd_parameters = configread(conf_file, 'NetworkDevice', 'device_file',
                               'login', 'password', 'name_space',
                               'zabbix_server', 'slack_hook')

    # read storage device parameters from config and save it to another dict
    sd_parameters = configread(conf_file, 'StorageDevice',
                               'storage_cim_map_file', 'printing')

    # get printing boolean variable from config for debugging enable/disable
    printing = eval(sd_parameters['printing'])

    # form dictionary of matching storage concepts and cim properties
    # more details in https://www.ibm.com/support/knowledgecenter/STHGUJ_8.3.1/com.ibm.storwize.v5000.831.doc/svc_conceptsmaptocimconcepts_3skacv.html
    with open(sd_parameters['storage_cim_map_file'], "r") as storage_cim_map_file:
        sc_maps = load(storage_cim_map_file)

    # open config file with list of monitored storages
    device_list_file = open(nd_parameters['device_file'])

    # unpack storage list to variables
    for device_line in device_list_file:
        device_type, device_name, device_ip = device_line.split(':')

        # connect to each storage via WBEM, get conn object
        if device_type == 'storwize':
            device = WBEMDevice(device_name, device_ip,
                                nd_parameters['login'],
                                nd_parameters['password'],
                                nd_parameters['slack_hook'])
            # get namespace from config, root/ibm by default
            namespace = nd_parameters.get('name_space', 'root/ibm')
            conn = device.Connect(namespace)

            # initialize packet for sending to zabbix
            packet = []

           # iterate through dictionary of monitored storage concepts
            for storage_concept in sc_maps:
                # get values of object perfomance statistic for all object of each type where perfomance class is given
                if 'cim_perfomance_class' in sc_maps[storage_concept]:
                    storage_objects_perf = storage_objects_get_perf(conn,
                                                                    sc_maps[storage_concept]['cim_class'],
                                                                    sc_maps[storage_concept]['cim_property_name'],
                                                                    sc_maps[storage_concept]['cim_perfomance_class'],
                                                                    sc_maps[storage_concept]['cim_properties_perfomance'])

                    # get statistic for each storage object, form data for sending to zabbix
                    for so_name in storage_objects_perf:
                        for perf_counter_name, perf_counter_value in zip(sc_maps[storage_concept]['cim_properties_perfomance'],
                                                                         storage_objects_perf[so_name]):
                            trapper_key = (perf_counter_name + '['
                                           + storage_concept + '.' + so_name + ']')
                            trapper_value = perf_counter_value

                            # form list of data for sending to zabbix
                            packet.append(ZabbixMetric(
                                device_name, trapper_key, trapper_value))

                            # print data for visual check
                            if printing:
                                print(device_name)
                                print(trapper_key)
                                print(trapper_value)

            # trying send data to zabbix
            try:
                zabbix_send_status = ZabbixSender(
                    nd_parameters['zabbix_server']).send(packet)
                if printing:
                    print('Status of sending data to zabbix:\n',
                          zabbix_send_status)
            except ConnectionRefusedError as error:
                if nd_parameters['slack_hook']:
                    slack_post(nd_parameters['slack_hook'],
                               'Unexpected exception in \"ZabbixSender()' +
                               '.send(packet)\": ' + str(error),
                               nd_parameters['zabbix_server'])
                exit(1)

    device_list_file.close()
Exemplo n.º 4
0
    'FRUPartNum', 'FRUIdentity', 'RPM', 'FirmwareLevel'
]

# create dictionary of monitored entities with it WBEMs parameters
disk_types = {'DiskDrive': ['IBMTSSVC_DiskDrive', 'Name', disk_params_names]}

# parse the storage list
for device_line in device_list_file:
    device_params = device_line.split(':')
    device_type = device_params[0]
    device_name = device_params[1]
    device_ip = device_params[2]

    # connect to storage via WBEM, get conn object
    if device_type == 'storwize':
        device = WBEMDevice(device_name, device_ip, nd_parameters['login'],
                            nd_parameters['password'])
        namespace = nd_parameters.get('name_space', 'root/ibm')
        conn = device.Connect(namespace)

        packet = []

        # get values of disk parameters for all disks of each type
        for disk_type in disk_types:
            disk_params = disks_get_params(conn, disk_types[disk_type][0],
                                           disk_types[disk_type][1],
                                           disk_types[disk_type][2])

            # get status for each parameter for each storage disk
            for disk_name in disk_params:
                for param_name in disk_params[disk_name]:
                    trapper_key = param_name + '[' + disk_type + '.' + disk_name + ']'
def main():

    # set config file name
    conf_file = '/etc/zabbix/externalscripts/pystormon/conf.d/pystormon.conf'

    # read network device parameters from config and save it to dict
    nd_parameters = configread(conf_file, 'NetworkDevice', 'device_file',
                               'login', 'password', 'name_space',
                               'zabbix_server', 'slack_hook')

    # read storage device parameters from config and save it to another dict
    sd_parameters = configread(conf_file, 'StorageDevice',
                               'storage_cim_map_file', 'printing')

    # get printing boolean variable from config for debugging enable/disable
    printing = eval(sd_parameters['printing'])

    # form dictionary of matching storage concepts and cim properties
    # more details in https://www.ibm.com/support/knowledgecenter/STHGUJ_8.3.1/com.ibm.storwize.v5000.831.doc/svc_conceptsmaptocimconcepts_3skacv.html
    with open(sd_parameters['storage_cim_map_file'],
              "r") as storage_cim_map_file:
        sc_maps = load(storage_cim_map_file)

    # open config file with list of monitored storages
    device_list_file = open(nd_parameters['device_file'])

    # unpack storage list to variables
    for device_line in device_list_file:
        device_type, device_name, device_ip = device_line.split(':')

        # connect to each storage via WBEM, get conn object
        if device_type == 'storwize':
            device = WBEMDevice(device_name, device_ip, nd_parameters['login'],
                                nd_parameters['password'],
                                nd_parameters['slack_hook'])
            # get namespace from config, root/ibm by default
            namespace = nd_parameters.get('name_space', 'root/ibm')
            conn = device.Connect(namespace)

            # initialize packet for sending to zabbix
            packet = []

            # iterate through dictionary of monitored storage concepts
            for storage_concept in sc_maps:
                # get list of storage objects
                so_names = storage_objects_discovery(
                    conn, sc_maps[storage_concept]['cim_class'],
                    sc_maps[storage_concept]['cim_property_name'])

                so_names_dict = {}
                so_names_list = []

                # create list of disk types and names in JSON
                for so_name in so_names:
                    so_name_json = {
                        "{#SO_TYPE}": storage_concept,
                        "{#SO_NAME}": so_name
                    }
                    so_names_list.append(so_name_json)

                # form data for send to zabbix
                so_names_dict['data'] = so_names_list

                trapper_key = sc_maps[storage_concept]['zabbix_discovery_key']
                trapper_value = str(so_names_dict).replace("\'", "\"")

                # form packet for sending to zabbix
                packet.append(
                    ZabbixMetric(device_name, trapper_key, trapper_value))

                # print data for visual check
                if printing:
                    print(device_name)
                    print(trapper_key)
                    print(trapper_value)

            # trying send data to zabbix
            try:
                zabbix_send_status = ZabbixSender(
                    nd_parameters['zabbix_server']).send(packet)
                if printing:
                    print('Status of sending data to zabbix:\n',
                          zabbix_send_status)
            except ConnectionRefusedError as error:
                if nd_parameters['slack_hook']:
                    slack_post(
                        nd_parameters['slack_hook'],
                        'Unexpected exception in \"ZabbixSender()' +
                        '.send(packet)\": ' + str(error),
                        nd_parameters['zabbix_server'])
                exit(1)

    device_list_file.close()
Exemplo n.º 6
0
def main():

    # set project name as current directory name
    project = os.path.abspath(__file__).split('/')[-2]

    software = sys.argv[0]

    if len(sys.argv) == 1:
        print((
            f'Please add argument(s) to call of program for search Storage CIM classes: \n'
            f'Example of syntax: {software} Array Volume'))
        exit(1)

    search_strings = sys.argv[1:]

    # get config file name
    conf_file = (
        f'/etc/zabbix/externalscripts/{project}/conf.d/{project}.conf')

    # read network device parameters from config and save it to dict
    nd_parameters = configread(conf_file, 'NetworkDevice', 'device_file',
                               'login', 'name_space', 'password')

    sd_parameters = configread(conf_file, 'StorageDevice',
                               'detected_properties_file')

    # get variables
    login = nd_parameters['login']
    password = nd_parameters['password']

    # open config file with list of monitored storages
    device_list_file = open(nd_parameters['device_file'])

    # open properties file for writing
    detected_properties_file = open(sd_parameters['detected_properties_file'],
                                    'w')

    # unpack storage list to variables
    for device_line in device_list_file:
        device_type, device_name, device_ip = device_line.split(':')
        device_ip = device_ip.rstrip('\n')

        # connect to each storage via WBEM, get conn object
        if device_type == 'storwize':
            device = WBEMDevice(device_name, device_ip, login, password)
            # get namespace from config, root/ibm by default
            namespace = nd_parameters.get('name_space', 'root/ibm')

            print(f'Connecting to {device_name} ...')
            conn = device.Connect(namespace)

            # try to get all cim classes from storage via WBEM
            try:
                sc_cim_classes = conn.EnumerateClassNames(
                    namespace=nd_parameters['name_space'],
                    DeepInheritance=True)
            except _exceptions.AuthError as error:
                print((
                    f'{project}_error: exception in {software}: can\'t exec query on {device_name}: {error} '
                    f'Check your username/password and permissions of user.'),
                      file=sys.stderr)
                exit(1)
            except _exceptions.ConnectionError as error:
                print((
                    f'{project}_error: exception in {software}: can\'t exec query on {device_name}: {error}. '
                    f'Check the connection to storage or try later.'),
                      file=sys.stderr)
                exit(1)
            except _exceptions.HTTPError as error:
                print((
                    f'{project}_error: exception in {software}: WBEM server return code 400 (Bad Request) on {device_name}: {error}. '
                    f'Check the your request.'),
                      file=sys.stderr)
                exit(1)
            except:
                print(
                    f'{project}_error: exception in {software}: {sys.exc_info()}',
                    file=sys.stderr)
                exit(1)

            # try to get all instances for each cim class from storage via WBEM
            for sc_cim_class in sc_cim_classes:
                for search_string in search_strings:
                    if sc_cim_class.find(search_string) > 0:
                        try:
                            instances = conn.EnumerateInstances(
                                sc_cim_class,
                                namespace=nd_parameters['name_space'])
                        except _exceptions.AuthError as error:
                            print((
                                f'{project}_error: exception in {software}: can\'t exec query on {device_name}: {error} '
                                f'Check your username/password and permissions of user.'
                            ),
                                  file=sys.stderr)
                            exit(1)
                        except _exceptions.ConnectionError as error:
                            print((
                                f'{project}_error: exception in {software}: can\'t exec query on {device_name}: {error}. '
                                f'Check the connection to storage or try later.'
                            ),
                                  file=sys.stderr)
                            exit(1)
                        except _exceptions.HTTPError as error:
                            print((
                                f'{project}_error: exception in {software}: WBEM server return code 400 (Bad Request) on {device_name}: {error}. '
                                f'Check the your request.'),
                                  file=sys.stderr)
                            exit(1)
                        except:
                            print(
                                f'{project}_error: exception in {software}: {sys.exc_info()}',
                                file=sys.stderr)
                            exit(1)

                        for instance in instances:
                            for prop_name, prop_value in instance.items():
                                output_string = (
                                    f'Device: {device_name}, CIM class: {sc_cim_class}\n'
                                    f'Property: {prop_name}, Value: {prop_value}\n'
                                )
                                print(output_string)
                                detected_properties_file.write(
                                    f'{output_string} \n')

    device_list_file.close()
    detected_properties_file.close()
Exemplo n.º 7
0
def main():

    # get script name
    software = sys.argv[0]

    # set project name as current directory name
    project = os.path.abspath(__file__).split('/')[-2]

    # get config file name
    conf_file = (
        f'/etc/zabbix/externalscripts/{project}/conf.d/{project}.conf')

    # read network device parameters from config and save it to dict
    nd_parameters = configread(conf_file, 'NetworkDevice', 'device_file',
                               'login', 'password', 'name_space')

    # read storage device parameters from config and save it to another dict
    sd_parameters = configread(conf_file, 'StorageDevice',
                               'monitored_properties_file')

    # form dictionary of matching storage concepts and cim properties
    # more details in https://www.ibm.com/support/knowledgecenter/STHGUJ_8.3.1/com.ibm.storwize.v5000.831.doc/svc_conceptsmaptocimconcepts_3skacv.html
    with open(sd_parameters['monitored_properties_file'],
              "r") as monitored_properties_file:
        monitored_properties = load(monitored_properties_file)

    # get variables
    login = nd_parameters['login']
    password = nd_parameters['password']

    # open config file with list of monitored storages
    device_list_file = open(nd_parameters['device_file'])

    # unpack storage list to variables
    for device_line in device_list_file:
        device_type, device_name, device_ip = device_line.split(':')
        device_ip = device_ip.rstrip('\n')

        # connect to each storage via WBEM, get conn object
        if device_type == 'storwize':
            device = WBEMDevice(device_name, device_ip, login, password)
            # get namespace from config, root/ibm by default
            namespace = nd_parameters.get('name_space', 'root/ibm')
            conn = device.Connect(namespace)

            # print all properties for all instances (objects) for cim classes from dict sc_maps
            for storage_concept in monitored_properties:
                storage_cim_class = monitored_properties[storage_concept][
                    'cim_class']

                # try to request storage via WBEM
                try:
                    instances = conn.EnumerateInstances(
                        storage_cim_class,
                        namespace=nd_parameters['name_space'])
                except _exceptions.AuthError as error:
                    print((
                        f'{project}_error: exception in {software}: can\'t exec query on {device_name}: {error} '
                        f'Check your username/password and permissions of user.'
                    ),
                          file=sys.stderr)
                    exit(1)
                except _exceptions.ConnectionError as error:
                    print((
                        f'{project}_error: exception in {software}: can\'t exec query on {device_name}: {error}. '
                        f'Check the connection to storage or try later.'),
                          file=sys.stderr)
                    exit(1)
                except _exceptions.HTTPError as error:
                    print((
                        f'{project}_error: exception in {software}: WBEM server return code 400 (Bad Request) on {device_name}: {error}. '
                        f'Check the your request.'),
                          file=sys.stderr)
                    exit(1)
                except:
                    print(
                        f'{project}_error: exception in {software}: {sys.exc_info()}',
                        file=sys.stderr)
                    exit(1)

                for instance in instances:
                    for prop_name, prop_value in instance.items():
                        print((
                            f'Device: {device_name}, Concept: {storage_concept}, '
                            f'CIM class: {storage_cim_class}\nProperty: {prop_name}, '
                            f'Value: {prop_value}\n'))

    device_list_file.close()