Make the plnet module a script that uses plcsh to get info for a node.
[pyplnet.git] / modprobe.py
1 #
2 # $Id$
3 #
4
5 """Modprobe is a utility to read/modify/write /etc/modprobe.conf"""
6
7 import os
8 import tempfile
9
10 class Modprobe():
11     def __init__(self,filename="/etc/modprobe.conf"):
12         self.conffile = {}
13         self.origconffile = {}
14         for keyword in ("alias","options","install","remove","blacklist","MODULES"):
15             self.conffile[keyword]={}
16         self.filename = filename
17
18     def input(self,filename=None):
19         if filename==None: filename=self.filename
20         fb = file(filename,"r")
21         for line in fb.readlines():
22             parts = line.split()
23             command = parts[0].lower()
24
25             table = self.conffile.get(command,None)
26             if table == None:
27                 print "WARNING: command %s not recognize. Ignoring!" % command
28                 continue
29
30             if command == "alias":
31                 wildcard=parts[1]
32                 modulename=parts[2]
33                 self.aliasset(wildcard,modulename)
34                 options=''
35                 if len(parts)>3:
36                     options=" ".join(parts[3:])
37                     self.optionsset(modulename,options)
38                     self.conffile['MODULES']={}
39                 self.conffile['MODULES'][modulename]=options
40             else:
41                 modulename=parts[1]
42                 rest=" ".join(parts[2:])
43                 self._set(command,modulename,rest)
44                 if command == "options":
45                     self.conffile['MODULES'][modulename]=rest
46
47         self.origconffile = self.conffile.copy()
48                 
49     def _get(self,command,key):
50         return self.conffile[command].get(key,None)
51
52     def _set(self,command,key,value):
53         self.conffile[command][key]=value
54
55     def aliasget(self,key):
56         return self._get('alias',key)
57
58     def optionsget(self,key):
59         return self._get('options',key)
60
61     def aliasset(self,key,value):
62         self._set("alias",key,value)
63
64     def optionsset(self,key,value):
65         self._set("options",key,value)
66         
67     def _comparefiles(self,a,b):
68         try:
69             if not os.path.exists(a): return False
70             fb = open(a)
71             buf_a = fb.read()
72             fb.close()
73
74             if not os.path.exists(b): return False
75             fb = open(b)
76             buf_b = fb.read()
77             fb.close()
78
79             return buf_a == buf_b
80         except IOError, e:
81             return False
82
83     def output(self,filename="/etc/modprobe.conf",program="NodeManager"):
84         (fd, tmpnam) = tempfile.mkstemp(dir=os.path.dirname(filename))
85         fb = os.fdopen(fd, "w")
86         fb.write("# Written out by %s\n" % program)
87
88         for command in ("alias","options","install","remove","blacklist"):
89             table = self.conffile[command]
90             keys = table.keys()
91             keys.sort()
92             for k in keys:
93                 v = table[k]
94                 fb.write("%s %s %s\n" % (command,k,v))
95
96         fb.close()
97         if not self._comparefiles(tmpnam,filename):
98             os.rename(tmpnam,filename)
99             os.chmod(filename,0644)
100             return True
101         else:
102             return False
103
104     def probe(self,name):
105         o = os.popen("/sbin/modprobe %s" % name)
106         o.close()
107
108     def checkmodules(self):
109         syspath="/sys/module"
110         modules = os.listdir(syspath)
111         for module in modules:
112             path="%/%s/parameters"%(syspath,module)
113             if os.path.exists(path):
114                 ps=os.listdir(path)
115                 parameters={}
116                 for p in ps:
117                     fb = file("%s/%s"%(path,p),"r")
118                     parameters[p]=fb.readline()
119                     fb.close()
120          
121 if __name__ == '__main__':
122     import sys
123     if len(sys.argv)>1:
124         m = Modprobe(sys.argv[1])
125     else:
126         m = Modprobe()
127
128     m.input()
129     m.aliasset("bond0","bonding")
130     m.optionsset("bond0","miimon=100")
131     m.output("/tmp/x")