Giter VIP home page Giter VIP logo

pycsco's Introduction

Python Helper Modules for working with Cisco NX-OS Switches

This is a python package that simplifies working with Cisco NX-OS switches that support NX-API.

Note: testing thus far has been with Cisco 9396 switches running 6.1(2)I3(1) and Nexus 3064s running 6.0(2)U4(1).

Install

Option 1

sudo pip install pycsco

Using pip also installs a package called xmltodict that is used to convert xml into JSON objects.

Option 2

Clone this repository, modify your PYTHONPATH, and do all that fun stuff!

INITIALIZE DEVICE

>>> 
>>> import json
>>> import xmltodict
>>> 
>>> from pycsco.nxos.device import Device
>>> 
>>> switch = Device(ip='192.168.200.50',username='cisco',password='!cisco123!')
>>>

EXTRACTING DATA

>>> get_sh_ver = switch.show('show version') 
>>> # this returns a tuple of 2 xml objects.  the first is headers, etc. and the second is the data we want
>>>
>>> sh_ver_dict = xmltodict.parse(get_sh_ver[1]) 
>>> # converting the second element to a python dictionary
>>> 
>>> 
>>> print json.dumps(sh_ver_dict, indent=4)
{
    "ins_api": {
        "type": "cli_show", 
        "version": "1.0", 
        "sid": "eoc", 
        "outputs": {
            "output": {
                "body": {
                    "header_str": "Cisco Nexus Operating System (NX-OS) Software\nTAC support: http://www.cisco.com/tac\nCopyright (C) 2002-2014, Cisco and/or its affiliates.\nAll rights reserved.\nThe copyrights to certain works contained in this software are\nowned by other third parties and used and distributed under their own\nlicenses, such as open source.  This software is provided \"as is,\" and unless\notherwise stated, there is no warranty, express or implied, including but not\nlimited to warranties of merchantability and fitness for a particular purpose.\nCertain components of this software are licensed under\nthe GNU General Public License (GPL) version 2.0 or \nGNU General Public License (GPL) version 3.0  or the GNU\nLesser General Public License (LGPL) Version 2.1 or \nLesser General Public License (LGPL) Version 2.0. \nA copy of each such license is available at\nhttp://www.opensource.org/licenses/gpl-2.0.php and\nhttp://opensource.org/licenses/gpl-3.0.html and\nhttp://www.opensource.org/licenses/lgpl-2.1.php and\nhttp://www.gnu.org/licenses/old-licenses/library.txt.", 
                    "bios_ver_str": "07.15", 
                    "kickstart_ver_str": "6.1(2)I3(1)", 
                    "bios_cmpl_time": "06/29/2014", 
                    "kick_file_name": "bootflash:///n9000-dk9.6.1.2.I3.1.bin", 
                    "kick_cmpl_time": "9/27/2014 23:00:00", 
                    "kick_tmstmp": "09/28/2014 06:23:37", 
                    "chassis_id": "Nexus9000 C9396PX Chassis", 
                    "cpu_name": "Intel(R) Core(TM) i3-3227U C", 
                    "memory": "16402544", 
                    "mem_type": "kB", 
                    "proc_board_id": "SAL1819S6BE", 
                    "host_name": "N9K1", 
                    "bootflash_size": "21693714", 
                    "kern_uptm_days": "3", 
                    "kern_uptm_hrs": "2", 
                    "kern_uptm_mins": "8", 
                    "kern_uptm_secs": "17", 
                    "rr_reason": "Unknown", 
                    "rr_sys_ver": "6.1(2)I3(1)", 
                    "rr_service": null, 
                    "manufacturer": "Cisco Systems, Inc."
                }, 
                "input": "show version", 
                "msg": "Success", 
                "code": "200"
            }
        }
    }
}
>>> 
>>> simple = sh_ver_dict['ins_api']['outputs']['output']['body']
>>> 
>>> print simple['rr_sys_ver']
6.1(2)I3(1)
>>> 
>>> print simple['kick_file_name']
bootflash:///n9000-dk9.6.1.2.I3.1.bin

PUSHING CONFIGS

>>> commands = ['interface Ethernet1/1', 'no switchport', 'ip address 1.1.1.1/24', 'shutdown']
>>> 
>>> cmds_to_string = ' ; '.join(commands)  
>>> # requirement to have semi-colon between commands
>>> 
>>> print cmds_to_string
interface Ethernet1/1 ; no switchport ; ip address 1.1.1.1/24 ; shutdown
>>> 
>>> switch.config(cmds_to_string)  # can see the xml based tuple returned
(<httplib.HTTPMessage instance at 0x7ffe8b93f488>, '<?xml version="1.0"?>\n<ins_api>\n  <type>cli_conf</type>\n  <version>1.0</version>\n  <sid>eoc</sid>\n  <outputs>\n    <output>\n      <body></body>\n      <code>200</code>\n      <msg>Success</msg>\n    </output>\n    <output>\n      <body></body>\n      <code>200</code>\n      <msg>Success</msg>\n    </output>\n    <output>\n      <body></body>\n      <code>200</code>\n      <msg>Success</msg>\n    </output>\n    <output>\n      <body></body>\n      <code>200</code>\n      <msg>Success</msg>\n    </output>\n  </outputs>\n</ins_api>\n')
>>> 
>>> status = switch.config(cmds_to_string)
>>> 
>>> print json.dumps(xmltodict.parse(status[1]), indent=4)  
>>> # see return data for each command
{
    "ins_api": {
        "type": "cli_conf", 
        "version": "1.0", 
        "sid": "eoc", 
        "outputs": {
            "output": [
                {
                    "body": null, 
                    "code": "200", 
                    "msg": "Success"
                }, 
                {
                    "body": null, 
                    "code": "200", 
                    "msg": "Success"
                }, 
                {
                    "body": null, 
                    "code": "200", 
                    "msg": "Success"
                }, 
                {
                    "body": null, 
                    "code": "200", 
                    "msg": "Success"
                }
            ]
        }
    }
}
>>> 

USING HELPER FUNCTIONS

>>> from pycsco.nxos.utils.nxapi_lib import get_list_of_vlans
>>> 
>>> get_list_of_vlans(switch)
['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '99']
>>> 
>>> from pycsco.nxos.utils.nxapi_lib import get_vlan
>>> 
>>> get_vlan(switch,'4')
{'vlan_state': 'active', 'admin_state': 'up', 'name': 'db', 'vlan_id': '4'}
>>> 
>>> 
>>> from pycsco.nxos.utils.nxapi_lib import get_neighbors
>>>
>>> neigh = get_neighbors(switch,'cdp')
>>> 
>>> print json.dumps(neigh, indent=4)
[
    {
        "neighbor_interface": "FastEthernet0/22", 
        "platform": "Cisco WS-C3550-24", 
        "local_interface": "mgmt0", 
        "neighbor": "c3550"
    }, 
    {
        "neighbor_interface": "Ethernet1/2", 
        "platform": "N9K-C9396PX", 
        "local_interface": "Ethernet1/2", 
        "neighbor": "N9K2"
    }, 
    {
        "neighbor_interface": "Ethernet2/12", 
        "platform": "N9K-C9396PX", 
        "local_interface": "Ethernet2/12", 
        "neighbor": "N9K2"
    }
]
>>> 

Other Functions Supported

>>> from pycsco.nxos.utils.nxapi_lib import *
>>> 
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'cmd_list_to_string', 'create_dir', 'delete_dir', 'feature_enabled', 'get_active_vpc_peer_link', 'get_existing_portchannel_to_vpc_mappings', 'get_facts', 'get_feature_list', 'get_hsrp_group', 'get_hsrp_groups_on_interfaces', 'get_interface', 'get_interface_detail', 'get_interface_mode', 'get_interface_running_config', 'get_interface_type', 'get_interfaces_dict', 'get_ipv4_interface', 'get_list_of_vlans', 'get_min_links', 'get_mtu', 'get_neighbors', 'get_portchannel', 'get_portchannel_list', 'get_portchannel_vpc_config', 'get_switchport', 'get_system_mtu', 'get_udld_global', 'get_udld_interface', 'get_vlan', 'get_vpc', 'get_vpc_running_config', 'get_vrf', 'get_vrf_list', 'interface_is_portchannel', 'is_default', 'is_interface_copper', 'peer_link_exists', 'switch_files_list', 'vlan_range_to_list']

Using Help

>>> 
>>> help(get_neighbors)

Help on function get_neighbors in module pycsco.nxos.utils.nxapi_lib:

get_neighbors(device, neigh_type)
    Gets neighbors of a device
    
    Args:
        device (Device): This is the device object of an NX-API enabled device
            using the Device class within device.py
        neigh_type (str): lldp or cdp
    
    Returns:
        list: ordered list of dicts (dict per neigh)
(END)
>>>

pycsco's People

Contributors

jedelman8 avatar mzbenami avatar jonasstenling avatar ahill00 avatar bobbygr avatar ggabriele avatar jimrollenhagen avatar mirceaulinic avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.