Exemplo n.º 1
0
def create_default_services():
    for service in ({
            'type': service_classes['swiss_army_knife_service'],
            'name': 'Start',
            'description': 'Start point of a workflow',
            'hidden': True
    }, {
            'type': service_classes['swiss_army_knife_service'],
            'name': 'End',
            'description': 'End point of a workflow',
            'hidden': True
    }, {
            'type': service_classes['configure_bgp_service'],
            'name': 'napalm_configure_bgp_1',
            'description': 'Configure BGP Peering with Napalm',
            'devices': [fetch(Device, name='Washington')],
            'local_as': 100,
            'loopback': 'Lo100',
            'loopback_ip': '100.1.1.1',
            'neighbor_ip': '100.1.2.1',
            'remote_as': 200,
            'vrf_name': 'configure_BGP_test',
            'waiting_time': 0
    }):
        factory(service.pop('type'), **service)
Exemplo n.º 2
0
def create_napalm_workflow():
    tasks = [
        retrieve(Task, name=task_name)
        for task_name in ('task_napalm_create_vrf_TEST',
                          'task_netmiko_check_vrf_TEST',
                          'task_napalm_rollback',
                          'task_netmiko_check_no_vrf_TEST')
    ]
    workflow = factory(
        Workflow, **{
            'name': 'Napalm_VRF_workflow',
            'description': 'Create and delete a VRF with Napalm',
            'tasks': tasks
        })
    for i in range(len(tasks) - 1):
        factory(
            WorkflowEdge, **{
                'name': f'{tasks[i].name} -> {tasks[i + 1].name}',
                'workflow': workflow,
                'type': True,
                'source': tasks[i],
                'destination': tasks[i + 1]
            })
    workflow.start_task, workflow.end_task = tasks[0].id, tasks[-1].id
    factory(
        WorkflowTask, **{
            'name': 'task_napalm_VRF_workflow',
            'job': workflow,
            'do_not_run': 'y',
            'user': retrieve(User, name='cisco')
        })
Exemplo n.º 3
0
def create_default_user():
    factory(
        User, **{
            'name': 'cisco',
            'email': '*****@*****.**',
            'password': '******'
        })
Exemplo n.º 4
0
def create_other_workflow():
    tasks = [
        retrieve(Task, name=task_name) for task_name in (
            'task_script_napalm_getter',
            'task_GET_router8',
        )
    ]
    workflow = factory(
        Workflow, **{
            'name': 'custom_workflow',
            'description': 'ReST call, Napalm getters, etc',
            'tasks': tasks
        })
    for i in range(len(tasks) - 1):
        factory(
            WorkflowEdge, **{
                'name': f'{tasks[i].name} -> {tasks[i + 1].name}',
                'workflow': workflow,
                'type': True,
                'source': tasks[i],
                'destination': tasks[i + 1]
            })
    workflow.start_task, workflow.end_task = tasks[0].id, tasks[-1].id
    factory(
        WorkflowTask, **{
            'name': 'task_custom_workflow',
            'job': workflow,
            'do_not_run': 'y',
            'user': retrieve(User, name='cisco')
        })
Exemplo n.º 5
0
def create_payload_transfer_workflow():
    services = []
    for service in [{
            'name': 'GET_Washington',
            'type': service_classes['rest_call_service'],
            'description': 'Use GET ReST call on Washington',
            'username': '******',
            'password': '******',
            'waiting_time': 0,
            'devices': [fetch(Device, name='Washington')],
            'content_match': '',
            'call_type': 'GET',
            'url': 'http://127.0.0.1:5000/rest/object/device/Washington',
            'payload': ''
    }] + [{
            'name': f'{getter}',
            'type': service_classes['napalm_getters_service'],
            'description': f'Getter: {getter}',
            'waiting_time': 0,
            'devices': [fetch(Device, name='Washington')],
            'driver': 'eos',
            'content_match': '',
            'getters': [getter]
    } for getter in ('get_facts', 'get_interfaces', 'get_interfaces_ip',
                     'get_config')
          ] + [{
              'name': 'process_payload1',
              'type': service_classes['swiss_army_knife_service'],
              'description': 'Process Payload in example workflow',
              'waiting_time': 0,
              'devices': [fetch(Device, name='Washington')]
          }]:
        instance = factory(service.pop('type'), **service)
        services.append(instance)
    workflow = factory(
        Workflow, **{
            'name': 'payload_transfer_workflow',
            'description': 'ReST call, Napalm getters, etc',
            'vendor': 'Arista',
            'operating_system': 'eos'
        })
    workflow.jobs.extend(services)

    # create workflow edges with following schema:
    positions = [(-20, 0), (50, 0), (-5, 0), (-5, -10), (15, 10), (15, -10),
                 (30, -10), (30, 0)]
    for index, (x, y) in enumerate(positions):
        job = workflow.jobs[index]
        job.positions['payload_transfer_workflow'] = x * 10, y * 10
    edges = [(0, 2), (2, 3), (2, 4), (3, 5), (5, 6), (6, 7), (4, 7), (7, 1)]
    for x, y in edges:
        factory(
            WorkflowEdge, **{
                'name': f'{workflow.name} {x} -> {y}',
                'workflow': workflow,
                'type': True,
                'source': workflow.jobs[x],
                'destination': workflow.jobs[y]
            })
Exemplo n.º 6
0
def create_default_users():
    factory(
        User, **{
            'name': 'admin',
            'email': '*****@*****.**',
            'password': '******',
            'permissions': ['Admin']
        })
Exemplo n.º 7
0
def create_napalm_script():
    factory(
        NapalmConfigScript, **{
            'name': 'napalm_create_vrf_TEST',
            'description': 'Create a VRF "TEST" with Napalm',
            'vendor': 'Cisco',
            'operating_system': 'IOS',
            'content_type': 'simple',
            'action': 'load_merge_candidate',
            'content': 'ip vrf TEST'
        })
Exemplo n.º 8
0
def create_default_pools():
    for pool in ({
            'name': 'All objects'
    }, {
            'name': 'Devices only',
            'link_name': '^$',
            'link_name_regex': True
    }, {
            'name': 'Links only',
            'device_name': '^$',
            'device_name_regex': True
    }):
        factory(Pool, **pool)
Exemplo n.º 9
0
def create_default_network_topology(app):
    with open(join(app.path, 'projects', 'usa.xls'), 'rb') as f:
        book = open_workbook(file_contents=f.read())
        for object_type in ('Device', 'Link'):
            try:
                sheet = book.sheet_by_name(object_type)
            except XLRDError:
                continue
            properties = sheet.row_values(0)
            for row_index in range(1, sheet.nrows):
                values = dict(zip(properties, sheet.row_values(row_index)))
                cls, kwargs = process_kwargs(app, **values)
                factory(cls, **kwargs).serialized
            db.session.commit()
Exemplo n.º 10
0
def query_netbox():
    nb = netbox_api(
        request.form['netbox_address'],
        token=request.form['netbox_token']
    )
    for device in nb.dcim.devices.all():
        device_ip = device.primary_ip4 or device.primary_ip6
        factory(Device, **{
            'name': device.name,
            'ip_address': str(device_ip).split('/')[0],
            'subtype': request.form['netbox_type'],
            'longitude': 0.,
            'latitude': 0.
        })
    return jsonify({'success': True})
Exemplo n.º 11
0
def create_napalm_workflow():
    services = []
    for service in ({
            'type': service_classes['napalm_configuration_service'],
            'name': 'napalm_create_vrf_test',
            'description': 'Create a VRF "test" with Napalm',
            'waiting_time': 0,
            'devices': [fetch(Device, name='Washington')],
            'driver': 'eos',
            'vendor': 'Arista',
            'operating_system': 'eos',
            'content_type': 'simple',
            'action': 'load_merge_candidate',
            'content': 'vrf definition test\n'
    }, {
            'type': service_classes['napalm_rollback_service'],
            'name': 'Napalm eos Rollback',
            'driver': 'eos',
            'description': 'Rollback a configuration with Napalm eos',
            'devices': [fetch(Device, name='Washington')],
            'waiting_time': 0
    }):
        instance = factory(service.pop('type'), **service)
        services.append(instance)
    services.insert(1, fetch(Job, name='netmiko_check_vrf_test'))
    services.append(fetch(Job, name=f'netmiko_check_no_vrf_test'))
    workflow = factory(
        Workflow, **{
            'name': 'Napalm_VRF_workflow',
            'description': 'Create and delete a VRF with Napalm',
            'vendor': 'Arista',
            'operating_system': 'eos'
        })
    workflow.jobs.extend(services)
    edges = [(0, 2), (2, 3), (3, 4), (4, 5), (5, 1)]
    for x, y in edges:
        factory(
            WorkflowEdge, **{
                'name': f'{workflow.name} {x} -> {y}',
                'workflow': workflow,
                'type': True,
                'source': workflow.jobs[x],
                'destination': workflow.jobs[y]
            })
    positions = [(-20, 0), (20, 0), (0, -15), (0, -5), (0, 5), (0, 15)]
    for index, (x, y) in enumerate(positions):
        workflow.jobs[index].positions['Napalm_VRF_workflow'] = x * 10, y * 10
Exemplo n.º 12
0
def create_netmiko_scripts():
    for script in (
        {
            'type': NetmikoConfigScript,
            'name': 'netmiko_create_vrf_TEST',
            'description': 'Create a VRF "TEST" with Netmiko',
            'vendor': 'Cisco',
            'operating_system': 'IOS',
            'content_type': 'simple',
            'driver': 'cisco_ios',
            'global_delay_factor': '1.0',
            'content': 'ip vrf TEST'
        },
        {
            'type': NetmikoValidationScript,
            'name': 'netmiko_check_vrf_TEST',
            'description': 'Check that the vrf "TEST" is configured',
            'vendor': 'Cisco',
            'operating_system': 'IOS',
            'driver': 'cisco_ios',
            'command1': 'show ip vrf',
            'content_match1': 'TEST'
        },
        {
            'type': NetmikoConfigScript,
            'name': 'netmiko_delete_vrf_TEST',
            'description': 'Delete VRF "TEST"',
            'vendor': 'Cisco',
            'operating_system': 'IOS',
            'content_type': 'simple',
            'driver': 'cisco_ios',
            'global_delay_factor': '1.0',
            'content': 'no ip vrf TEST'
        },
        {
            'type': NetmikoValidationScript,
            'name': 'netmiko_check_no_vrf_TEST',
            'description': 'Check that the vrf "TEST" is NOT configured',
            'vendor': 'Cisco',
            'operating_system': 'IOS',
            'driver': 'cisco_ios',
            'command1': 'show ip vrf',
            'content_match1': '^((?!TEST).)*$',
            'content_match_regex1': 'y'
        },
    ):
        factory(script.pop('type'), **script)
Exemplo n.º 13
0
def create_other_scripts():
    factory(
        NapalmGettersScript, **{
            'name': 'script_napalm_getter',
            'description': 'Getters: facts / Interfaces / Interfaces IP',
            'content_match': '',
            'getters': ['get_facts', 'get_interfaces', 'get_interfaces_ip']
        })
    factory(
        RestCallScript, **{
            'name': 'GET_router8',
            'description': 'Use GET ReST call on router8',
            'content_match': '',
            'call_type': 'GET',
            'url': 'http://127.0.0.1:5000/rest/object/device/router8',
            'payload': ''
        })
Exemplo n.º 14
0
def create_netmiko_tasks():
    scripts = [
        retrieve(Script, name=script_name)
        for script_name in ('netmiko_create_vrf_TEST',
                            'netmiko_check_vrf_TEST',
                            'netmiko_delete_vrf_TEST',
                            'netmiko_check_no_vrf_TEST')
    ]
    for script in scripts:
        factory(
            ScriptTask, **{
                'name': f'task_{script.name}',
                'devices': [retrieve(Device, name='router8')],
                'waiting_time': 3 if script.name == 'delete_vrf_TEST' else 0,
                'job': script,
                'do_not_run': 'y',
                'user': retrieve(User, name='cisco')
            })
Exemplo n.º 15
0
def add_edge(wf_id, type, source, dest):
    workflow_edge = factory(
        WorkflowEdge, **{
            'name': f'{wf_id}-{type}:{source}->{dest}',
            'workflow': fetch(Workflow, id=wf_id),
            'type': type == 'true',
            'source': fetch(Job, id=source),
            'destination': fetch(Job, id=dest)
        })
    return jsonify(workflow_edge.serialized)
Exemplo n.º 16
0
def create_napalm_tasks():
    device = retrieve(Device, name='router8')
    user = retrieve(User, name='cisco')
    factory(
        ScriptTask, **{
            'name': 'task_napalm_create_vrf_TEST',
            'job': retrieve(Script, name='napalm_create_vrf_TEST'),
            'devices': [device],
            'do_not_run': 'y',
            'user': user
        })
    factory(
        ScriptTask, **{
            'name': 'task_napalm_rollback',
            'job': retrieve(Script, name='Napalm Rollback'),
            'devices': [device],
            'do_not_run': 'y',
            'user': user
        })
Exemplo n.º 17
0
def create_other_tasks():
    device = retrieve(Device, name='router8')
    user = retrieve(User, name='cisco')
    factory(
        ScriptTask, **{
            'name': 'task_script_napalm_getter',
            'waiting_time': '0',
            'job': retrieve(Script, name='script_napalm_getter'),
            'devices': [device],
            'do_not_run': 'y',
            'user': user
        })
    factory(
        ScriptTask, **{
            'name': 'task_GET_router8',
            'job': retrieve(Script, name='GET_router8'),
            'devices': [],
            'do_not_run': 'y',
            'user': user
        })
Exemplo n.º 18
0
def add_edge(wf_id, type, source, dest):
    source_task = retrieve(Task, id=source)
    destination_task = retrieve(Task, id=dest)
    workflow_edge = factory(WorkflowEdge, **{
        'name': f'{source_task.name} -> {destination_task.name}',
        'workflow': retrieve(Workflow, id=wf_id),
        'type': type,
        'source': source_task,
        'destination': destination_task
    })
    return jsonify(workflow_edge.serialized)
Exemplo n.º 19
0
def edit_workflow():
    form = dict(request.form.to_dict())
    for property in boolean_properties:
        if property not in form:
            form[property] = 'off'
    form['devices'] = [
        fetch(Device, id=id) for id in request.form.getlist('devices')
    ]
    form['pools'] = [
        fetch(Pool, id=id) for id in request.form.getlist('pools')
    ]
    return jsonify(factory(Workflow, **form).serialized)
Exemplo n.º 20
0
def scheduler(workflow_id=None):
    data = request.form.to_dict()
    data['job'] = retrieve(Job, id=data['job'])
    data['devices'] = [
        retrieve(Device, id=id) for id in request.form.getlist('devices')
    ]
    data['pools'] = [
        retrieve(Pool, id=id) for id in request.form.getlist('pools')
    ]
    data['user'] = current_user
    cls = WorkflowTask if data['job'].type == 'workflow' else ScriptTask
    task = factory(cls, **data)
    return jsonify(task.serialized)
Exemplo n.º 21
0
def query_opennms():
    parameters = db.session.query(Parameters).one()
    login, password = parameters.opennms_login, request.form['password']
    parameters.update(**request.form.to_dict())
    db.session.commit()
    json_devices = http_get(
        parameters.opennms_devices,
        headers={'Accept': 'application/json'},
        auth=(login, password)
    ).json()['node']
    devices = {
        device['id']:
            {
            'name': device.get('label', device['id']),
            'description': device['assetRecord'].get('description', ''),
            'location': device['assetRecord'].get('building', ''),
            'vendor': device['assetRecord'].get('manufacturer', ''),
            'model': device['assetRecord'].get('modelNumber', ''),
            'operating_system': device.get('operatingSystem', ''),
            'os_version': device['assetRecord'].get('sysDescription', ''),
            'longitude': device['assetRecord'].get('longitude', 0.),
            'latitude': device['assetRecord'].get('latitude', 0.),
            'subtype': request.form['subtype']
        } for device in json_devices
    }

    for device in list(devices):
        link = http_get(
            f'{parameters.opennms_rest_api}/nodes/{device}/ipinterfaces',
            headers={'Accept': 'application/json'},
            auth=(login, password)
        ).json()
        for interface in link['ipInterface']:
            if interface['snmpPrimary'] == 'P':
                devices[device]['ip_address'] = interface['ipAddress']
                factory(Device, **devices[device])
    db.session.commit()
    return jsonify({'success': True})
Exemplo n.º 22
0
def import_topology():
    objects, file = defaultdict(list), request.files['file']
    if allowed_file(secure_filename(file.filename), {'xls', 'xlsx'}):
        book = open_workbook(file_contents=file.read())
        for object_type in ('Device', 'Link'):
            try:
                sheet = book.sheet_by_name(object_type)
            except XLRDError:
                continue
            properties = sheet.row_values(0)
            for row_index in range(1, sheet.nrows):
                values = dict(zip(properties, sheet.row_values(row_index)))
                cls, kwargs = process_kwargs(app, **values)
                objects[object_type].append(factory(cls, **kwargs).serialized)
            db.session.commit()
    return jsonify(objects)
Exemplo n.º 23
0
def save_service(cls_name):
    form = dict(request.form.to_dict())
    form['devices'] = [
        fetch(Device, id=id) for id in request.form.getlist('devices')
    ]
    form['pools'] = [
        fetch(Pool, id=id) for id in request.form.getlist('pools')
    ]
    for key in request.form:
        if property_types.get(key, None) == list:
            form[key] = request.form.getlist(key)
    for property in boolean_properties:
        if property not in form:
            form[property] = 'off'
    try:
        return jsonify(factory(service_classes[cls_name], **form).serialized)
    except JSONDecodeError:
        return jsonify('JSONDecodeError')
Exemplo n.º 24
0
def create_script(script_type):
    script = retrieve(Script, name=request.form['name'])
    form = dict(request.form.to_dict())
    form['getters'] = request.form.getlist('getters')
    if not script:
        if script_type in ('netmiko_config', 'napalm_config'):
            if form['content_type'] != 'simple':
                file = request.files['file']
                filename = secure_filename(file.filename)
                if allowed_file(filename, {'yaml', 'yml'}):
                    parameters = yaml_load(file.read())
                    template = Template(form['content'])
                    form['content'] = ''.join(template.render(**parameters))
        elif script_type == 'file_transfer':
            source_file_name = form['source_file']
            source_file_path = join(current_app.path, 'file_transfer',
                                    source_file_name)
            form['source_file'] = source_file_path
    return jsonify(factory(type_to_class[script_type], **form).serialized)
Exemplo n.º 25
0
def process_user():
    user_data = request.form.to_dict()
    user_data['permissions'] = request.form.getlist('permissions')
    return jsonify(factory(User, **user_data).serialized)
Exemplo n.º 26
0
def create_new_user():
    user_data = request.form.to_dict()
    if 'permissions' in user_data:
        abort(403)
    return jsonify(factory(User, **user_data).serialized)
Exemplo n.º 27
0
Arquivo: rest.py Projeto: taycom/eNMS
 def post(self, cls_name):
     return factory(**request.get_json(force=True, silent=True)).serialized
Exemplo n.º 28
0
def save_log_rule():
    tasks = [retrieve(Task, id=id) for id in request.form.getlist('tasks')]
    log_rule = factory(LogRule, **request.form.to_dict())
    log_rule.tasks = tasks
    db.session.commit()
    return jsonify(log_rule.serialized)
Exemplo n.º 29
0
def process_pool():
    form = request.form.to_dict()
    for property in boolean_properties:
        if property not in form:
            form[property] = 'off'
    return jsonify(factory(Pool, **form).serialized)
Exemplo n.º 30
0
def edit_object():
    cls, kwargs = process_kwargs(app, **request.form.to_dict())
    obj = factory(cls, **kwargs)
    return jsonify(obj.serialized)