Add trunk version.
[pyplnet.git] / modprobe.py
diff --git a/modprobe.py b/modprobe.py
new file mode 100644 (file)
index 0000000..d7fa2e3
--- /dev/null
@@ -0,0 +1,130 @@
+#
+# $Id$
+#
+
+"""Modprobe is a utility to read/modify/write /etc/modprobe.conf"""
+
+import os
+
+class Modprobe():
+    def __init__(self,filename="/etc/modprobe.conf"):
+        self.conffile = {}
+        self.origconffile = {}
+        for keyword in ("alias","options","install","remove","blacklist","MODULES"):
+            self.conffile[keyword]={}
+        self.filename = filename
+
+    def input(self,filename=None):
+        if filename==None: filename=self.filename
+        fb = file(filename,"r")
+        for line in fb.readlines():
+            parts = line.split()
+            command = parts[0].lower()
+
+            table = self.conffile.get(command,None)
+            if table == None:
+                print "WARNING: command %s not recognize. Ignoring!" % command
+                continue
+
+            if command == "alias":
+                wildcard=parts[1]
+                modulename=parts[2]
+                self.aliasset(wildcard,modulename)
+                options=''
+                if len(parts)>3:
+                    options=" ".join(parts[3:])
+                    self.optionsset(modulename,options)
+                    self.conffile['MODULES']={}
+                self.conffile['MODULES'][modulename]=options
+            else:
+                modulename=parts[1]
+                rest=" ".join(parts[2:])
+                self._set(command,modulename,rest)
+                if command == "options":
+                    self.conffile['MODULES'][modulename]=rest
+
+        self.origconffile = self.conffile.copy()
+                
+    def _get(self,command,key):
+        return self.conffile[command].get(key,None)
+
+    def _set(self,command,key,value):
+        self.conffile[command][key]=value
+
+    def aliasget(self,key):
+        return self._get('alias',key)
+
+    def optionsget(self,key):
+        return self._get('options',key)
+
+    def aliasset(self,key,value):
+        self._set("alias",key,value)
+
+    def optionsset(self,key,value):
+        self._set("options",key,value)
+        
+    def _comparefiles(self,a,b):
+        try:
+            if not os.path.exists(a): return False
+            fb = open(a)
+            buf_a = fb.read()
+            fb.close()
+
+            if not os.path.exists(b): return False
+            fb = open(b)
+            buf_b = fb.read()
+            fb.close()
+
+            return buf_a == buf_b
+        except IOError, e:
+            return False
+
+    def output(self,filename="/etc/modprobe.conf",program="NodeManager"):
+        tmpnam = os.tmpnam()
+        fb = file(tmpnam,"w")
+        fb.write("# Written out by %s\n" % program)
+
+        for command in ("alias","options","install","remove","blacklist"):
+            table = self.conffile[command]
+            keys = table.keys()
+            keys.sort()
+            for k in keys:
+                v = table[k]
+                fb.write("%s %s %s\n" % (command,k,v))
+
+        fb.close()
+        if not self._comparefiles(tmpnam,filename):
+            os.rename(tmpnam,filename)
+            os.chmod(filename,0644)
+            return True
+        else:
+            return False
+
+    def probe(self,name):
+        o = os.popen("/sbin/modprobe %s" % name)
+        o.close()
+
+    def checkmodules(self):
+        syspath="/sys/module"
+        modules = os.listdir(syspath)
+        for module in modules:
+            path="%/%s/parameters"%(syspath,module)
+            if os.path.exists(path):
+                ps=os.listdir(path)
+                parameters={}
+                for p in ps:
+                    fb = file("%s/%s"%(path,p),"r")
+                    parameters[p]=fb.readline()
+                    fb.close()
+         
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv)>1:
+        m = Modprobe(sys.argv[1])
+    else:
+        m = Modprobe()
+
+    m.input()
+    m.aliasset("bond0","bonding")
+    m.optionsset("bond0","miimon=100")
+    m.output("/tmp/x")