| @@ -0,0 +1,95 @@ | |||
| vlanmang | |||
| ======== | |||
| There are two parts to the tool. The first part is the SNMPSwitch class. | |||
| The second part is the configuration sync part. | |||
| The SNMPSwitch class is used to configure the switch, such as creating | |||
| VLANs (todo) and configuring what parts belong to which VLANs. | |||
| The configuration sync part is done in two steps, first is to collect | |||
| the differences between what the configuration is and what it should | |||
| be. This is done by the function checkchanges. This function generates | |||
| a list of changes that need to be made to the switches to make them match | |||
| what is configured. Then the second part, which is implemented as part | |||
| of the main function, is to apply those changes. | |||
| Usage | |||
| ----- | |||
| The vlanmang command will import the Python module named data, aka | |||
| `data.py`. The easiest way is if there is a file named data.py in the | |||
| current directory, if there is, it will use that. Note that this file is | |||
| run as Python code, so it can write files, read files, or any thing else | |||
| that a Python program can do. This means that putting untrusted data | |||
| from users should never be done unless properly escaped, or handled | |||
| appropriately. | |||
| The file consists of declarations of how the switches should be | |||
| configured, and the credentials necessary to verify configuration and | |||
| make the necessary changes. One slightly unusual part of the tool is | |||
| that you have to declare ports that you do not care about. This is to | |||
| help ensure that you have a configuration specified for all the ports you | |||
| care about, not just some of them. The common ports you will ignore are | |||
| cpu interfaces and extra lag interfaces. You can specify the ports by | |||
| the names the switch knows them by (the ifName column in SNMP) for | |||
| convience, or they can be specified by their index in ifTable. | |||
| Example | |||
| ------- | |||
| Here is an example data.py file: | |||
| ``` | |||
| import vlanmang | |||
| from pysnmp.hlapi import usmDESPrivProtocol | |||
| # VLANs | |||
| base = 1 | |||
| guest = 23 | |||
| dmz = 58 | |||
| # Range inclusive of the end points | |||
| def rng(s, e): | |||
| return range(s, e + 1) | |||
| lag1 = 'ch1' # sometimes switches don't give useful names | |||
| switchvlans = { | |||
| base: { | |||
| 'u': rng(1, 10), | |||
| 't': lag1, | |||
| }, | |||
| guest: { | |||
| 'u': rng(11, 19), | |||
| 't': lag1, | |||
| }, | |||
| dmz: { | |||
| 'u': rng(20, 24), | |||
| 't': lag1, | |||
| }, | |||
| # You can put your passwords in another file for security | |||
| from passwords import switchvlankey | |||
| # Use SNMPv3, defaulting to SHA1 auth and DES encryption, the best | |||
| # supported by NetGear switches. | |||
| authdata = dict(username='admin', authKey=key, privKey=key, | |||
| privProtocol=usmDESPrivProtocol) | |||
| switch = vlanmang.SwitchConfig('203.0.113.10', authdata, switchvlangs, | |||
| rng(25,26) + # part of lag1 | |||
| [ 'ch%d' % x for x in rng(2,8) ] # ignore the extra lag interfaces | |||
| ) | |||
| ``` | |||
| Once that file is created and in the current directory, simply run the | |||
| program `vlanmang`, and it will query the switch and print out a list of | |||
| changes that need to be made to the switch to make it match the | |||
| configuration specified. If the changes look correct, type the entire | |||
| word `yes` in, and press enter and the necessary changes will be made. | |||
| The `NOTES.md` file has notes about dealing with particular switches. | |||
| Please consult this if you are having troubles. Just because a switch | |||
| isn't listed doesn't mean it doesn't have any issues, it is likely that | |||
| it has not be tested, or if it has, the information has not been | |||
| submitted for inclusion. | |||