Netwalk is a Python library born out of a large remadiation project aimed at making network device discovery and management as fast and painless as possible.
Can be installed via pip with pip install git+ssh://git@github.com/icovada/netwalk.git
A collection of scripts with extra features and examples is stored in the extras
folder
A lot of the code is covered by tests. More will be added in the future
This object type defines an entire switched network and can be manually populated, have switches added one by one or you can give it one or more seed devices and it will go and scan everything for you.
from netwalk import Fabric sitename = Fabric() sitename.init_from_seed_device(seed_hosts=["10.10.10.1"], credentials=[("cisco","cisco"),("customer","password")] napalm_optional_args=[{'secret': 'cisco'}, {'transport': 'telnet'}])
This code will start searching from device 10.10.10.1 and will try to log in via SSH with cisco/cisco and then customer/password.
Once connected to the switch it will pull and parse the running config, the mac address table and the cdp neighbours, then will start cycling through all neighbours recursively until the entire fabric has been discovered
Note: you may also pass a list of napalm_optional_args
, check the NAPALM optional args guide for explanation and examples
You can tell Fabric to discover another switch on its own or you can add a Switch
object to .switches
. WHichever way, do not forget to call refresh_global_information
to recalculate neighborships and global mac address table
sitename.add_switch(host="10.10.10.1", credentials=[("cisco","cisco")) sitename.refresh_global_information()
Note: you may also pass a list of napalm_optional_args
, check the optional args guide for explanation and examples
sitename
will now contain two main attributes:
switches
, a dictionary of {'hostname': Switch}
mac_table
, another dictionary containing a list of all macs in the fabric, the interface closest to themThis object defines a switch. It can be created in two ways:
from netwalk import Switch sw01 = Switch(hostname="10.10.10.1") sw01.retrieve_data(username="cisco", password="cisco"})
Note: you may also pass a list of napalm_optional_args
, check the optional args guide for explanation and examples
This will connect to the switch and pull all the data much like add_switch()
does in Fabric
You may also generate the Switch device from a show run you have extracted somewhere else. This will not give you mac address table or neighborship discovery but will generate all Interfaces in the switch
from netwalk import Switch showrun = """ int gi 0/1 switchport mode access ... int gi 0/24 switchport mode trunk """ sw01 = Switch(hostname="10.10.10.1", config=showrun)
A Switch
object has the following attributes:
hostname
: the IP or hostname to connect toconfig
: string containing plain text show runinterfaces
: dictionary of {'interface name', Interface}
}mac_table
: a dictionary containing the switch's mac address tableAn Interface object defines a switched interface ("switchport" in Cisco language) and can hold data about its configuration such as:
name
description
mode
: either "access" or "trunk"allowed_vlan
: a set()
of vlans to tagnative_vlan
voice_vlan
switch
: pointer to parent Switchis_up
: if the interface is activeis_enabled
: shutdown ot notconfig
: its configurationmac_count
: number of MACs behind ittype_edge
: also known as "portfast"bpduguard
Printing an interface yelds its configuration based on its current attributes
assert int.allowed_vlan == int.neighbors[0].allowed_vlan
from netaddr import EUI host_mac = EUI('00:01:02:03:04:05') assert fabric.mac_table[host_mac]['interface'].native_vlan == 10
Owner
Contributors
Categories
Programming Languages
PythonLicense
Code Exchange Community
Get help, share code, and collaborate with other developers in the Code Exchange community.View Community