source: n4d-client-exe-consumer/trunk/fuentes/install-files/usr/share/n4d/python-plugins/ClientExeConsumer.py @ 4612

Last change on this file since 4612 was 4612, checked in by hectorgh, 2 years ago

adding allow_none to xmlrpc client

File size: 4.1 KB
Line 
1import xmlrpclib
2import tempfile
3import os
4import os.path
5import stat
6import time
7import subprocess
8import netifaces
9 
10class ClientExeConsumer:
11       
12        LOG_FILE="/var/log/n4d/client-consumer"
13
14
15        def startup(self,options):
16       
17                if not self.check_semiclient():
18               
19                        if objects['VariablesManager'].get_variable('CLIENT_EXE_SERVER') is None:
20                                objects['VariablesManager'].init_variable('CLIENT_EXE_SERVER')
21                       
22                        # one shots
23                       
24                        try:
25                       
26                                self.read_log()
27                                ret=self.get_oneshots()
28                                self.execute_and_delete(ret)
29                               
30                        except Exception as e:
31                                print e
32                       
33                # boot scripts
34               
35                try:
36                        mac=self.get_mac_from_ip(self.get_ip_from_cmdline())
37                        self.execute_boot_scripts(mac)
38                except Exception as e:
39                        print e
40               
41        #def startup
42
43
44
45        def read_log(self):
46               
47                self.md5_log=[]
48               
49                try:
50                        f=open(ClientExeConsumer.LOG_FILE)
51                        lines=f.readlines()
52                        f.close()
53                except:
54                        lines=[]
55                        try:
56                                f=open(ClientExeConsumer.LOG_FILE,"w")
57                                f.close()
58                        except:
59                                return -1
60               
61                for item in lines:
62                        line=item.strip("\n")
63                        if len(line)>0:
64                                self.md5_log.append(line)
65               
66        #def read_log
67       
68        def get_oneshots(self):
69               
70                ret_list=[]
71               
72                try:
73                        srv=objects["VariablesManager"].get_variable("CLIENT_EXE_SERVER")
74
75                        if srv!=None and type(srv)==type(""):
76                                c=xmlrpclib.ServerProxy("https://"+srv+":9779",allow_none=True)
77                                ret=c.get_available_oneshots("","ClientExeManager",self.md5_log)
78                                if type(ret)==type([]):
79                               
80                                        for item in ret:
81                                                md5,content=item
82                                                content=content.encode("utf-8")
83                                                id,file_name=tempfile.mkstemp(prefix="n4d-cec-")
84                                                os.close(id)
85                                                st=os.stat(file_name)
86                                                os.chmod(file_name,st.st_mode | stat.S_IEXEC)
87                                                script=open(file_name,"w")
88                                                script.write(content)
89                                                script.close()
90                                                ret_list.append(file_name)
91                                                self.add_md5(md5)
92                               
93                except Exception as e:
94                        print e
95                        pass
96               
97                return ret_list
98               
99               
100        #def get_exes
101       
102        def add_md5(self,md5):
103               
104                self.read_log()
105                if md5 not in self.md5_log:
106                        f=open(ClientExeConsumer.LOG_FILE,"a")
107                        f.write(md5+"\n")
108                        f.close()
109                        self.md5_log.append(md5)
110                       
111        #def add_md5
112       
113        def execute_and_delete(self,file_list,delete=True):
114               
115                for item in file_list:
116                        print ("[ClientExeConsumer] Executing " + item +" ...")
117                        os.system(item)
118                        if delete:
119                                os.remove(item)
120                               
121        #def execute_and_delete
122       
123       
124        def check_semiclient(self):
125               
126                return os.path.exists("/etc/lts.conf")
127               
128        #def check_semiclient
129       
130       
131        def force_execution(self,force_all=False):
132       
133                if not self.check_semiclient():
134       
135                        try:
136                                if force_all:
137                                        self.md5_log=[]
138                               
139                                ret=self.get_exes()
140                                self.execute_and_delete(ret)
141                               
142                                if force_all:
143                                        self.read_log()
144                       
145                                return [True,""]
146                        except Exception as e:
147                                print(e)
148                                return [False,str(e)]
149                               
150                else:
151                        return [False,"Semiclient found"]
152               
153        #def force_execution
154       
155       
156        def get_mac_from_ip(self,ip):
157       
158       
159                for item in netifaces.interfaces():
160                        info=netifaces.ifaddresses(item)
161                        try:
162                                if info[netifaces.AF_INET][0]["addr"]==ip:
163                                        return info[netifaces.AF_LINK][0]["addr"]
164                        except Exception as e:
165                                print e
166                               
167                return None
168               
169        #def get_mac_from_ip
170       
171        def get_ip_from_cmdline(self):
172               
173                path="/proc/cmdline"
174               
175                if os.path.exists(path):
176                        f=open(path)
177                       
178                        for line in f.readlines():
179                                if "ip=" in line:
180                                        tmp=line.split("ip=")[1]
181                                        tmp=tmp.split(" ")[0]
182                                        ip=tmp.split(":")[0]
183                                       
184                                        return ip
185                                       
186                return None
187               
188        #def get_ip_from_cmdline
189
190       
191        def execute_boot_scripts(self,mac):
192               
193                srv=objects["VariablesManager"].get_variable("CLIENT_EXE_SERVER")
194               
195                if srv==None:
196                        srv="server"
197               
198                c=xmlrpclib.ServerProxy("https://%s:9779"%srv,allow_none=True)
199                ret=c.get_boot_scripts("","ClientExeManager",mac)
200
201                if ret["status"]==True:
202                               
203                        f_list=[]
204                               
205                        for file_content in ret["data"]:
206                                       
207                                tmp=tempfile.mkstemp()
208                                f=open(tmp[1],"w")
209                                       
210                                for line in file_content:
211                                        f.write(line)
212                                f.close()
213                                os.close(tmp[0])
214                                f_list.append(f.name)
215                                       
216                        for f in f_list:
217                                os.system("chmod +x %s; %s || true"%(f,f))
218                                os.remove(f)
219                               
220        #def execute_boot_scripts
221       
222       
223       
224#class ClientExeConsumer
225
226if __name__=="__main__":
227       
228        cec=ClientExeConsumer()
229        cec.startup(None)
Note: See TracBrowser for help on using the repository browser.