---
func/minion/modules/vlan.py | 139 +++++++++++++++++++++++++++++++++++++++++++
1 files changed, 139 insertions(+), 0 deletions(-)
create mode 100644 func/minion/modules/vlan.py
diff --git a/func/minion/modules/vlan.py b/func/minion/modules/vlan.py
new file mode 100644
index 0000000..a88a1dc
--- /dev/null
+++ b/func/minion/modules/vlan.py
@@ -0,0 +1,139 @@
+#!/usr/bin/python
+#
+# Copyright 2008, Stone-IT
+# Jasper Capel <capel@xxxxxxxxxxxx>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 USA
+
+import func_module
+import os
+
+class Vlan(func_module.FuncModule):
+ version = "0.0.1"
+ api_version = "0.0.1"
+ description = "Func module for VLAN management"
+
+ # A list of VLAN IDs that should be ignored.
+ # You can use this if you have VLAN IDs which are reserved for internal
+ # use, which should never be touched by func.
+ ignorevlans = [ ]
+ vconfig = "/sbin/vconfig"
+ ip = "/sbin/ip"
+
+ def list(self):
+ # Returns a dictionary, elements look like this:
+ # key: interface, value: [id1, id2, id3]
+
+ retlist = {}
+
+ f = open("/proc/net/vlan/config")
+
+ # Read the config, throw the header lines away
+ # Lines look like:
+ # bond1.1003 | 1003 | bond1
+ lines = f.readlines()[2:]
+
+ for line in lines:
+ elements = line.split("|")
+ vlanid = int(elements[1].strip())
+ interface = elements[2].strip()
+
+ if interface not in retlist:
+ # New list in dictionary
+ retlist[interface] = [ vlanid ]
+ else:
+ # Append to existing list in dictionary
+ retlist[interface].append(vlanid)
+
+ return retlist
+
+ def add(self, interface, vlanid):
+ vlanid = int(vlanid)
+ # Adds a vlan with vlanid on interface
+ if vlanid not in self.ignorevlans:
+ exitcode = os.spawnv(os.P_WAIT, self.vconfig, [ self.vconfig, "add", interface, str(vlanid)] )
+ else:
+ exitcode = -1
+
+ return exitcode
+
+ def delete(self, interface, vlanid):
+ # Deletes a vlan with vlanid from interface
+ vintfname = interface + "." + str(vlanid)
+ if int(vlanid) not in self.ignorevlans:
+ exitcode = os.spawnv(os.P_WAIT, self.vconfig, [ self.vconfig, "rem", vintfname] )
+ else:
+ exitcode = -1
+
+ return exitcode
+
+ def up(self, interface, vlanid):
+ # Marks a vlan interface as up
+ vintfname = interface + "." + str(vlanid)
+ if int(vlanid) not in self.ignorevlans:
+ exitcode = os.spawnv(os.P_WAIT, self.ip, [ self.ip, "link", "set", vintfname, "up" ])
+ else:
+ exitcode = -1
+
+ return exitcode
+
+ def down(self, interface, vlanid):
+ # Marks a vlan interface as down
+ vintfname = interface + "." + str(vlanid)
+ if int(vlanid) not in self.ignorevlans:
+ exitcode = os.spawnv(os.P_WAIT, self.ip, [ self.ip, "link", "set", vintfname, "down" ])
+ else:
+ exitcode = -1
+
+ return exitcode
+
+ def makeitso(self, configuration):
+ # Applies the supplied configuration to the system.
+ # Configuration is a dictionary, elements should look like this:
+ # key: interface, value: [id1, id2, id3]
+ currentconfig = self.list()
+
+ # First, remove all VLANs present in current configuration, that are
+ # not present in new configuration.
+ for interface, vlans in currentconfig.iteritems():
+ if interface not in configuration:
+ # Remove all the vlans from this interface
+ for vlan in vlans:
+ self.delete(interface, vlan)
+
+ else:
+ for vlan in vlans:
+ if vlan not in configuration[interface]:
+ # VLAN not in new configuration, remove it.
+ self.delete(interface, vlan)
+
+ # Second, add all VLANs present in new configuration, that are not
+ # present in current configuration
+ for interface, vlans in configuration.iteritems():
+ if interface not in currentconfig:
+ # Add all VLANs for this interface
+ for vlan in vlans:
+ self.add(interface, vlan)
+
+ else:
+ for vlan in vlans:
+ if vlan not in currentconfig[interface]:
+ # VLAN not in current configuration, add it.
+ self.add(interface, vlan)
+
+ # Todo: Compare the current configuration to the supplied configuration
+ return self.list()
+