Example #1
0
 def testCommandoResultsBad(self):
     commands = ["show run | in cisco"]
     commando = Commando(devices=[self.device.nodeName])
     data = commando.parse_template(results=[no_template_data], device=self.device, commands=commands)
     self.assertTrue(len(data) > 0)
     self.assertTrue(isinstance(data, list))
     self.assertTrue(isinstance(data[0], str))
     self.assertEquals(commando.parsed_results, {})
Example #2
0
 def testCommandoResultsGood(self):
     commands = ["show version"]
     commando = Commando(devices=[self.device.nodeName])
     data = commando.parse_template(results=[big_cli_data], device=self.device, commands=commands)
     self.assertTrue(len(data) > 0)
     self.assertTrue(isinstance(data, list))
     self.assertTrue(isinstance(data[0], str))
     self.assertTrue(isinstance(commando.parsed_results, dict))
     self.assertEquals(commando.parsed_results.popitem()[1]["show version"]["hardware"], ['CSR1000V'])
 def __init__(self, commands=None, debug=False, timeout=TIMEOUT, **args):
     if commands is None:
         commands = []
     #print "\n\nDEBUG: "+str(debug)
     self.commands = commands
     self.data = {}
     self.debug = debug
     if 'args' in locals():
         args['timeout'] = timeout
     else:
         args = dict(timeout=timeout)
     Commando.__init__(self, **args)
#Importing the necessary module.
from trigger.cmds import Commando

#Asking the user for input.
devices = raw_input('\nEnter devices separated by comma: ')
commands = raw_input('\nEnter commands separated by comma: ')

#Splitting the devices/commands entered by the user.
devices_list = devices.split(',')
commands_list = commands.split(',')

#Running all given commands on all given devices. 
cmd = Commando(devices = devices_list, commands = commands_list, force_cli = True, creds = ('mihai1', 'python1', 'juniper'))

#Executing all the work in real time.
cmd.run()

#Capturing the results as a dictionary of dictionaries.
#Uncomment 'print result', then save and run the script...
#...to see how Commando returns the results initially.
output = cmd.results
#print output

#Using a while loop to allow the user to return and choose another cXdY combination.
while True:
	#Asking the user about the output he wants to obtain.
	print '\nNOTE! The format is always cXdY, where X is the command number and Y is the device number in the lists you enter.\nIf X = a this means that command Y will be executed on ALL devices.\nIf Y = a this means that all commands will be executed on device X.\nIf both X = a and Y = a then all the commands will be executed on all devices.'
	
	user_option_1 = raw_input('\nNow, what do you want to see? Example: To get the output of command 2 on device 1 just type c2d1: ')

	#Identifying the desired command(s) and device(s), based on the user input above.
def main():

    module = AnsibleModule(
        argument_spec=dict(
            connection=dict(choices=['ssh', 'offline', 'netmiko_ssh',
                            'trigger_ssh', 'netmiko_telnet', 'telnet'], default='netmiko_ssh'),
            platform=dict(required=False),
            file=dict(required=False),
            local_file=dict(required=False),
            index_file=dict(default='index'),
            template_dir=dict(default=NTC_TEMPLATES_DIR),
            use_templates=dict(required=False, default=True, type='bool'),
            trigger_device_list=dict(type='list', required=False),
            command=dict(required=True),
            host=dict(required=False),
            provider=dict(required=False, type='dict'),
            port=dict(required=False),
            delay=dict(default=1, required=False),
            global_delay_factor=dict(default=1, required=False),
            username=dict(required=False, type='str'),
            password=dict(required=False, type='str', no_log=True),
            secret=dict(required=False, type='str', no_log=True),
            use_keys=dict(required=False, default=False, type='bool'),
            key_file=dict(required=False, default=None),
            optional_args=dict(required=False, type='dict', default={}),
            connection_args=dict(required=False, type='dict', default={}),
        ),
        mutually_exclusive=(
            ['host', 'trigger_device_list'],
        ),
        supports_check_mode=False
    )

    provider = module.params['provider'] or {}

    no_log = ['password', 'secret']
    for param in no_log:
        if provider.get(param):
            module.no_log_values.update(return_values(provider[param]))

    # allow local params to override provider
    for param, pvalue in provider.items():
        if module.params.get(param) != False:
            module.params[param] = module.params.get(param) or pvalue

    if not HAS_TEXTFSM:
        module.fail_json(msg='This module requires TextFSM')

    connection = module.params['connection']
    platform = module.params['platform']
    device_type = platform.split('-')[0]
    raw_file = module.params['file']
    local_file = module.params['local_file']
    index_file = module.params['index_file']
    template_dir = module.params['template_dir']
    command = module.params['command']
    username = module.params['username']
    password = module.params['password']
    secret = module.params['secret']
    use_templates = module.params['use_templates']
    use_keys = module.params['use_keys']
    key_file = module.params['key_file']
    delay = int(module.params['delay'])
    global_delay_factor = int(module.params['global_delay_factor'])
    trigger_device_list = module.params['trigger_device_list']
    optional_args = module.params['optional_args']
    connection_args = module.params['connection_args']
    host = module.params['host']

    if (connection in ['ssh', 'netmiko_ssh', 'netmiko_telnet', 'telnet'] and
            not module.params['host']):
        module.fail_json(msg='specify host when connection='
                             'ssh/netmiko_ssh/netmiko_telnet')

    if connection in ['netmiko_telnet', 'telnet'] and platform != 'cisco_ios':
        module.fail_json(msg='only cisco_ios supports '
                             'telnet/netmiko_telnet connection')

    if platform == 'cisco_ios' and connection in ['netmiko_telnet', 'telnet']:
        device_type = 'cisco_ios_telnet'

    if module.params['port']:
        port = int(module.params['port'])
    else:
        if device_type == 'cisco_ios_telnet':
            port = 23
        else:
            port = 22

    argument_check = { 'platform': platform }
    if connection != 'offline':
        argument_check['username'] = username
        argument_check['password'] = password
        argument_check['host'] = host
        if not host and not trigger_device_list:
            module.fail_json(msg='specify host or trigger_device_list based on connection')

    for key, val in argument_check.items():
        if val is None:
            module.fail_json(msg=str(key) + " is required")

    if connection == 'offline' and not raw_file:
        module.fail_json(msg='specifiy file if using connection=offline')

    if template_dir.endswith('/'):
        template_dir.rstrip('/')

    if use_templates:
        if not os.path.isfile(template_dir + '/' + index_file):
            module.fail_json(msg='could not find or read index file')

        if raw_file and not os.path.isfile(raw_file):
            module.fail_json(msg='could not read raw text file')


    rawtxt = ''
    if connection in ['ssh', 'netmiko_ssh', 'netmiko_telnet', 'telnet']:
        if not HAS_NETMIKO:
            module.fail_json(msg='This module requires netmiko.')

        device_args = dict(
            device_type=device_type,
            ip=host,
            port=port,
            username=username,
            password=password,
            secret=secret,
            use_keys=use_keys,
            key_file=key_file,
            global_delay_factor=global_delay_factor
        )
        if connection_args:
            device_args.update(connection_args)
        device = ConnectHandler(**device_args)
        if secret:
            device.enable()

        rawtxt = device.send_command_timing(command, delay_factor=delay)

    elif connection == 'trigger_ssh':
        if not HAS_TRIGGER:
            module.fail_json(msg='This module requires trigger.')
        kwargs = {}
        kwargs['production_only'] = False
        kwargs['force_cli'] = True
        if optional_args:
            module.deprecate(
                msg="optional_args is deprecated in favor of connection_args."
            )
            kwargs.update(optional_args)
        if connection_args:
            kwargs.update(connection_args)

        if host:
            commando = Commando(devices=[host], commands=[command],
                                creds=(username, password), **kwargs)
            commando.run()
            rawtxt = commando.results[host][command]
        elif trigger_device_list:
            commando = Commando(devices=trigger_device_list, commands=[command],
                                creds=(username, password), **kwargs)
            commando.run()

    elif connection == 'offline':
        with open(raw_file, 'r') as data:
            rawtxt = data.read()

    if local_file:
        with open(local_file, 'w') as f:
            f.write(rawtxt)

    results = {}
    results['response'] = []
    results['response_list'] = []

    if use_templates:
        if rawtxt:
            results['response'] = parse_raw_output(rawtxt, module)
        elif trigger_device_list:
            results['response_list'] = parse_raw_output(commando.results, module)
    elif rawtxt:
        results['response'] = [rawtxt]
    elif trigger_device_list:
        results['response'] = [commando.results]

    module.exit_json(**results)
Example #6
0
def main():

    module = AnsibleModule(
        argument_spec=dict(
            connection=dict(choices=['ssh', 'offline', 'netmiko_ssh',
                            'trigger_ssh'], default='netmiko_ssh'),
            platform=dict(required=True),
            file=dict(required=False),
            index_file=dict(default='index'),
            template_dir=dict(default='ntc-templates/templates'),
            trigger_device_list=dict(type='list', required=False),
            command=dict(required=True),
            host=dict(required=False),
            port=dict(default=22, required=False),
            delay=dict(default=1, required=False),
            username=dict(required=False, type='str'),
            password=dict(required=False, type='str'),
            secret=dict(required=False, type='str'),
            use_keys=dict(required=False, default=False, type='bool'),
            key_file=dict(required=False, default=None),
            optional_args=dict(required=False, type='dict', default={}),
        ),
        required_together=(
            ['password', 'username'],
        ),
        mutually_exclusive=(
            ['host', 'trigger_device_list'],
        ),
        supports_check_mode=False
    )

    if not HAS_TEXTFSM:
        module.fail_json(msg='This module requires TextFSM')

    connection = module.params['connection']
    platform = module.params['platform']
    device_type = platform.split('-')[0]
    raw_file = module.params['file']
    index_file = module.params['index_file']
    template_dir = module.params['template_dir']
    command = module.params['command']
    username = module.params['username']
    password = module.params['password']
    secret = module.params['secret']
    use_keys = module.params['use_keys']
    key_file = module.params['key_file']
    port = int(module.params['port'])
    delay = int(module.params['delay'])
    trigger_device_list = module.params['trigger_device_list']
    optional_args = module.params['optional_args']
    host = module.params['host']

    if connection in ['ssh', 'netmiko_ssh'] and not module.params['host']:
        module.fail_json(msg='specify host when connection=ssh/netmiko_ssh')

    if connection != 'offline':
        if not host and not trigger_device_list:
            module.fail_json(msg='specify host or trigger_device_list based on connection')

    if connection == 'offline' and not raw_file:
        module.fail_json(msg='specifiy file if using connection=offline')

    if template_dir.endswith('/'):
        template_dir.rstrip('/')

    if not os.path.isfile(template_dir + '/' + index_file):
        module.fail_json(msg='could not find or read index file')

    if raw_file and not os.path.isfile(raw_file):
        module.fail_json(msg='could not read raw text file')

    rawtxt = ''
    if connection in ['ssh', 'netmiko_ssh']:
        if not HAS_NETMIKO:
            module.fail_json(msg='This module requires netmiko.')

        device = ConnectHandler(
            device_type=device_type,
            ip=host,
            port=port,
            username=username,
            password=password,
            secret=secret,
            use_keys=use_keys,
            key_file=key_file
        )
        if secret:
            device.enable()

        rawtxt = device.send_command(command, delay_factor=delay)

    elif connection == 'trigger_ssh':
        if not HAS_TRIGGER:
            module.fail_json(msg='This module requires trigger.')
        kwargs = {}
        kwargs['production_only'] = False
        kwargs['force_cli'] = True
        if optional_args:
            kwargs.update(optional_args)

        if host:
            commando = Commando(devices=[host], commands=[command],
                                creds=(username, password), **kwargs)
            commando.run()
            rawtxt = commando.results[host][command]
        elif trigger_device_list:
            commando = Commando(devices=trigger_device_list, commands=[command],
                                creds=(username, password), **kwargs)
            commando.run()

    elif connection == 'offline':
        with open(raw_file, 'r') as data:
            rawtxt = data.read()

    results = {}
    results['response'] = []
    results['response_list'] = []
    if rawtxt:
        results['response'] = parse_raw_output(rawtxt, module)
    else:
        results['response_list'] = parse_raw_output(commando.results, module)

    module.exit_json(**results)
#Importing the necessary module.
from trigger.cmds import Commando

#Asking the user for input.
devices = raw_input('\nEnter devices separated by comma: ')
commands = raw_input('\nEnter commands separated by comma: ')

#Splitting the devices/commands entered by the user.
devices_list = devices.split(',')
commands_list = commands.split(',')

#Running all given commands on all given devices.
cmd = Commando(devices=devices_list, commands=commands_list)

#Executing all the work in real time.
cmd.run()

#Capturing the results as a dictionary of dictionaries.
#Uncomment 'print result', then save and run the script...
#...to see how Commando returns the results initially.
output = cmd.results
#print output

#Using a while loop to allow the user to return and choose another cXdY combination.
while True:
    #Asking the user about the output he wants to obtain.
    print '\nNOTE! The format is always cXdY, where X is the command number and Y is the device number in the lists you enter.\nIf X = a this means that command Y will be executed on ALL devices.\nIf Y = a this means that all commands will be executed on device X.\nIf both X = a and Y = a then all the commands will be executed on all devices.'

    user_option_1 = raw_input(
        '\nNow, what do you want to see? Example: To get the output of command 2 on device 1 just type c2d1: '
    )
Example #8
0
from trigger.cmds import Commando
#from trigger.netdevices import NetDevices
import signal

signal.signal(signal.SIGPIPE, signal.SIG_DFL)  # IOError: Broken pipe
signal.signal(signal.SIGINT, signal.SIG_DFL)  # KeyboardInterrupt: Ctrl-C
"""
Execute the following on a list of Cisco devices:
"""
#nd = NetDevices()
#[d for d in nd.all() if d.operatingSystem == 'IOS']
#device_list = d.match(site='Hearst Service Center')
device_list = ['hsc28-bc1-sw1', 'hsc28-bc1-sw2']
command_list = ['show clock']

cmd = Commando(devices=device_list, commands=command_list)

cmd.run()  # Commando exposes this to start the event loop

print('\nUnparsed Results:\n')
json.dumps(cmd.results, indent=4)

print('\nParsed Results:\n')
json.dumps(cmd.parsed_results, indent=4)

#def main():
#    """A simple syntax check and dump of all we see and know!"""
#    print 'Syntax ok.'
#    if len(sys.argv) > 1:
#        from trigger.netdevices import NetDevices
#        nd = NetDevices()
Example #9
0
def main():

    module = AnsibleModule(argument_spec=dict(
        connection=dict(
            choices=['ssh', 'offline', 'netmiko_ssh', 'trigger_ssh'],
            default='netmiko_ssh'),
        platform=dict(required=True),
        file=dict(required=False),
        index_file=dict(default='index'),
        template_dir=dict(default='ntc-templates/templates'),
        trigger_device_list=dict(type='list', required=False),
        command=dict(required=True),
        host=dict(required=False),
        port=dict(default=22, required=False),
        delay=dict(default=1, required=False),
        username=dict(required=False, type='str'),
        password=dict(required=False, type='str'),
        secret=dict(required=False, type='str'),
        use_keys=dict(required=False, default=False, type='bool'),
        key_file=dict(required=False, default=None),
        optional_args=dict(required=False, type='dict', default={}),
    ),
                           required_together=(['password', 'username'], ),
                           mutually_exclusive=(['host',
                                                'trigger_device_list'], ),
                           supports_check_mode=False)

    if not HAS_TEXTFSM:
        module.fail_json(msg='This module requires TextFSM')

    connection = module.params['connection']
    platform = module.params['platform']
    device_type = platform.split('-')[0]
    raw_file = module.params['file']
    index_file = module.params['index_file']
    template_dir = module.params['template_dir']
    command = module.params['command']
    username = module.params['username']
    password = module.params['password']
    secret = module.params['secret']
    use_keys = module.params['use_keys']
    key_file = module.params['key_file']
    port = int(module.params['port'])
    delay = int(module.params['delay'])
    trigger_device_list = module.params['trigger_device_list']
    optional_args = module.params['optional_args']
    host = module.params['host']

    if connection in ['ssh', 'netmiko_ssh'] and not module.params['host']:
        module.fail_json(msg='specify host when connection=ssh/netmiko_ssh')

    if connection != 'offline':
        if not host and not trigger_device_list:
            module.fail_json(
                msg='specify host or trigger_device_list based on connection')

    if connection == 'offline' and not raw_file:
        module.fail_json(msg='specifiy file if using connection=offline')

    if template_dir.endswith('/'):
        template_dir.rstrip('/')

    if not os.path.isfile(template_dir + '/' + index_file):
        module.fail_json(msg='could not find or read index file')

    if raw_file and not os.path.isfile(raw_file):
        module.fail_json(msg='could not read raw text file')

    rawtxt = ''
    if connection in ['ssh', 'netmiko_ssh']:
        if not HAS_NETMIKO:
            module.fail_json(msg='This module requires netmiko.')

        device = ConnectHandler(device_type=device_type,
                                ip=host,
                                port=port,
                                username=username,
                                password=password,
                                secret=secret,
                                use_keys=use_keys,
                                key_file=key_file)
        if secret:
            device.enable()

        rawtxt = device.send_command(command, delay_factor=delay)

    elif connection == 'trigger_ssh':
        if not HAS_TRIGGER:
            module.fail_json(msg='This module requires trigger.')
        kwargs = {}
        kwargs['production_only'] = False
        kwargs['force_cli'] = True
        if optional_args:
            kwargs.update(optional_args)

        if host:
            commando = Commando(devices=[host],
                                commands=[command],
                                creds=(username, password),
                                **kwargs)
            commando.run()
            rawtxt = commando.results[host][command]
        elif trigger_device_list:
            commando = Commando(devices=trigger_device_list,
                                commands=[command],
                                creds=(username, password),
                                **kwargs)
            commando.run()

    elif connection == 'offline':
        with open(raw_file, 'r') as data:
            rawtxt = data.read()

    results = {}
    results['response'] = []
    results['response_list'] = []
    if rawtxt:
        results['response'] = parse_raw_output(rawtxt, module)
    else:
        results['response_list'] = parse_raw_output(commando.results, module)

    module.exit_json(**results)
Example #10
0
def main():

    module = AnsibleModule(
        argument_spec=dict(
            connection=dict(choices=["ssh", "offline", "netmiko_ssh", "trigger_ssh"], default="netmiko_ssh"),
            platform=dict(required=True),
            file=dict(required=False),
            local_file=dict(required=False),
            index_file=dict(default="index"),
            template_dir=dict(default="ntc-templates/templates"),
            use_templates=dict(required=False, default=True, type="bool"),
            trigger_device_list=dict(type="list", required=False),
            command=dict(required=True),
            host=dict(required=False),
            port=dict(default=22, required=False),
            delay=dict(default=1, required=False),
            username=dict(required=False, type="str"),
            password=dict(required=False, type="str"),
            secret=dict(required=False, type="str"),
            use_keys=dict(required=False, default=False, type="bool"),
            key_file=dict(required=False, default=None),
            optional_args=dict(required=False, type="dict", default={}),
        ),
        required_together=(["password", "username"],),
        mutually_exclusive=(["host", "trigger_device_list"],),
        supports_check_mode=False,
    )

    if not HAS_TEXTFSM:
        module.fail_json(msg="This module requires TextFSM")

    connection = module.params["connection"]
    platform = module.params["platform"]
    device_type = platform.split("-")[0]
    raw_file = module.params["file"]
    local_file = module.params["local_file"]
    index_file = module.params["index_file"]
    template_dir = module.params["template_dir"]
    command = module.params["command"]
    username = module.params["username"]
    password = module.params["password"]
    secret = module.params["secret"]
    use_templates = module.params["use_templates"]
    use_keys = module.params["use_keys"]
    key_file = module.params["key_file"]
    port = int(module.params["port"])
    delay = int(module.params["delay"])
    trigger_device_list = module.params["trigger_device_list"]
    optional_args = module.params["optional_args"]
    host = module.params["host"]

    if connection in ["ssh", "netmiko_ssh"] and not module.params["host"]:
        module.fail_json(msg="specify host when connection=ssh/netmiko_ssh")

    if connection != "offline":
        if not host and not trigger_device_list:
            module.fail_json(msg="specify host or trigger_device_list based on connection")

    if connection == "offline" and not raw_file:
        module.fail_json(msg="specifiy file if using connection=offline")

    if template_dir.endswith("/"):
        template_dir.rstrip("/")

    if use_templates:
        if not os.path.isfile(template_dir + "/" + index_file):
            module.fail_json(msg="could not find or read index file")

        if raw_file and not os.path.isfile(raw_file):
            module.fail_json(msg="could not read raw text file")

    rawtxt = ""
    if connection in ["ssh", "netmiko_ssh"]:
        if not HAS_NETMIKO:
            module.fail_json(msg="This module requires netmiko.")

        device = ConnectHandler(
            device_type=device_type,
            ip=host,
            port=port,
            username=username,
            password=password,
            secret=secret,
            use_keys=use_keys,
            key_file=key_file,
        )
        if secret:
            device.enable()

        rawtxt = device.send_command_expect(command, delay_factor=delay)

    elif connection == "trigger_ssh":
        if not HAS_TRIGGER:
            module.fail_json(msg="This module requires trigger.")
        kwargs = {}
        kwargs["production_only"] = False
        kwargs["force_cli"] = True
        if optional_args:
            kwargs.update(optional_args)

        if host:
            commando = Commando(devices=[host], commands=[command], creds=(username, password), **kwargs)
            commando.run()
            rawtxt = commando.results[host][command]
        elif trigger_device_list:
            commando = Commando(devices=trigger_device_list, commands=[command], creds=(username, password), **kwargs)
            commando.run()

    elif connection == "offline":
        with open(raw_file, "r") as data:
            rawtxt = data.read()

    if local_file:
        with open(local_file, "w") as f:
            f.write(rawtxt)

    results = {}
    results["response"] = []
    results["response_list"] = []

    if use_templates:
        if rawtxt:
            results["response"] = parse_raw_output(rawtxt, module)
        elif trigger_device_list:
            results["response_list"] = parse_raw_output(commando.results, module)
    elif rawtxt:
        results["response"] = [rawtxt]
    elif trigger_device_list:
        results["response"] = [commando.results]

    module.exit_json(**results)