MEMEK<br />
<b>Notice</b>:  Undefined index: dl in <b>/var/www/html/web/simple.mini.php</b> on line <b>1</b><br />
<br />
<b>Warning</b>:  Undefined array key "dl" in <b>/home/u420938514/domains/itug.com.br/public_html/untitled.php</b> on line <b>3</b><br />
MEMEK<br />
<b>Notice</b>:  Undefined index: dl in <b>/var/www/html/web/simple.mini.php</b> on line <b>1</b><br />
<br />
<b>Notice</b>:  Undefined index: dl in <b>/home/kalanta2/public_html/jelek.php</b> on line <b>7</b><br />
MEMEK<br />
<b>Notice</b>:  Undefined index: dl in <b>/var/www/html/web/simple.mini.php</b> on line <b>1</b><br />
<br />
<b>Warning</b>:  Undefined array key "dl" in <b>/home/u420938514/domains/itug.com.br/public_html/untitled.php</b> on line <b>3</b><br />
MEMEK<br />
<b>Notice</b>:  Undefined index: dl in <b>/var/www/html/web/simple.mini.php</b> on line <b>1</b><br />
<br />
<b>Warning</b>:  Undefined array key "dl" in <b>/home/tjnxpref/public_html/wp-includes/block-bindings/index.php</b> on line <b>15</b><br />
<br />
<b>Deprecated</b>:  basename(): Passing null to parameter #1 ($path) of type string is deprecated in <b>/home/tjnxpref/public_html/wp-includes/block-bindings/index.php</b> on line <b>15</b><br />
#!/usr/bin/env python
# -*- coding: utf-8 -*-
""" General Utilities from importing nagios objects. Currently .csv files are supported

Either execute this script standalone from the command line or use it as a python library like so:

>>> from pynag.Utils import importer
>>> pynag_objects = importer.import_from_csv_file(filename='foo', seperator=',') # doctest: +SKIP
>>> for i in pynag_objects: # doctest: +SKIP
...     i.save() # doctest: +SKIP
"""

from __future__ import absolute_import
from __future__ import print_function
import optparse
import os

import pynag.Model
from six.moves import map

# Default host is used when you try to add a service to a
# Host that does not exist
DEFAULT_HOST_ATTRIBUTES = {
    'use': 'generic-host',
    'check_command': 'check-host-alive',
    'check_interval': '1',
    'max_check_attempts': '3',
    'retry_interval': '2',
}


options = optparse.OptionParser()
options.add_option(
    '--destination_filename',
    dest='destination_filename',
    default=None,
    help='Destination file where objects will be saved',
)
options.add_option(
    '--seperator',
    dest='seperator',
    default=',',
    help='Use this as seperator for columns (default: ,)',
)
options.add_option(
    '--dry_run',
    dest='dry_run',
    default=False,
    action='store_true',
    help='If specified, only print object definitions to screen',
)
options.add_option(
    '--object_type',
    dest='object_type',
    default=None,
    help='Assume this object type (e.g. "host") if its not specified in file'
)


def parse_arguments():
    """ Parse command line arguments """
    (opts, args) = options.parse_args()
    return opts, args


def main():
    (opts, args) = parse_arguments()

    if not args:
        options.error("You must specify at least one .csv file as an argument")
    for i in args:
        if not os.path.isfile(i):
            options.error("Could not find file: %s" % i)
    pynag_objects = []
    for i in args:
        tmp = import_from_csv_file(filename=i, seperator=opts.seperator, object_type=opts.object_type)
        pynag_objects += tmp

    if opts.dry_run:
        print(len(pynag_objects))
        for i in pynag_objects:
            print(i)
    else:
        for i in pynag_objects:
            i.save(filename=opts.destination_filename)


def dict_to_pynag_objects(dict_list, object_type=None):
    """Take a list of dictionaries, return a list of pynag.Model objects.

    Args:
        dict_list: List of dictionaries that represent pynag objects
        object_type: Use this object type as default, if it is not specified in dict_list
    Returns:
        List of pynag objects
    """
    result = []
    for i in dict_list:
        dictionary = i.copy()
        object_type = dictionary.pop("object_type", object_type)
        if not object_type:
            raise ValueError('One column needs to specify object type')
        Class = pynag.Model.string_to_class[object_type]
        pynag_object = Class(**dictionary)
        result.append(pynag_object)
    return result


def parse_csv_file(filename, seperator=','):
    """ Parse filename and return a dict representing its contents """
    with open(filename) as f:
        data = f.read()
        return parse_csv_string(data, seperator=seperator)


def parse_csv_string(csv_string, seperator=','):
    """ Parse csv string and return a dict representing its contents """
    result = []
    lines = csv_string.splitlines()
    headers = None
    for line in lines:
        # Skip empty lines
        if not line:
            continue
        # If this is first line
        if not headers:
            headers = [x.strip() for x in line.split(seperator)]
            continue
        mydict = {}
        result.append(mydict)
        columns = [x.strip() for x in line.split(seperator)]
        for i, column in enumerate(columns):
            header = headers[i]
            mydict[header] = column
    return result


def import_from_csv_file(filename, seperator=',', object_type=None):
    """ Parses filename and returns a list of pynag objects.

    Args:
        filename: Path to a file
        seperator: use this symbol to seperate columns in the file
        object_type: Assume this object_type if there is no object_type column
    """
    dicts = parse_csv_file(filename=filename, seperator=seperator)
    pynag_objects = dict_to_pynag_objects(dicts, object_type=object_type)
    return pynag_objects

if __name__ == '__main__':
    main()
