source: lliurex-remote-installer/trunk/fuentes/lliurex-remote-installer-server.install/usr/share/n4d/python-plugins/LliureXRemoteInstaller.py @ 3962

Last change on this file since 3962 was 3962, checked in by daduve, 2 years ago

n4d files

File size: 14.9 KB
Line 
1import subprocess
2import os
3import os.path
4import shutil
5
6class LliureXRemoteInstaller:
7       
8        N4D_VAR="LLX_REMOTE_INSTALLER"
9        initial_dict={'deb': {'url': 'http://server/llx-remote/', 'packages': []}, 'sh': {'url': 'http://server/llx-remote/', 'packages': []}, 'apt': {}}
10       
11        #VALOR VARIABLE DEL REPO ADDAPLICATION_SOURCES
12        dir_sources="/etc/apt/sources.list.d/"
13        file_sources="llxremoteinstaller_sources"
14        file_sources=str(dir_sources)+str(file_sources)
15       
16       
17        #VALORES DE LOS DICCIONARIOS
18        DEB='deb'
19        APT='apt'
20        SH='sh'
21        LIST='packages'
22        URL='url'
23        SHARE_DIRECTORY='/var/www/llx-remote'
24       
25        def __init__(self):
26                pass
27               
28        #def __init__
29       
30        def test_var (self,namevar=None,user=None,passwd=None):
31                try:
32                        print "------------------------------------"
33                        print "Lliurex Remote Installer Test Var"
34                        print "------------------------------------"
35                        import xmlrpclib as x
36                        c=x.ServerProxy("https://server:9779")
37                        u=(user,passwd)
38                        VALOR=c.get_variable(u,"VariablesManager",namevar)
39                        #print VALOR
40                        if not os.path.exists(self.SHARE_DIRECTORY):
41                                os.makedirs(self.SHARE_DIRECTORY)
42                                proc=subprocess.Popen(["LANGUAGE=en_EN; chown 775 %s; sudo setfacl -m g:adm:rwx -d -m g:adm:rwx %s" %self.SHARE_DIRECTORY],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0]
43                                proc.wait()
44                                os.system("sudo setfacl -m g:adm:rwx -d -m g:adm:rwx %s"%self.SHARE_DIRECTORY)
45                                print "[LLXRemoteInstaller] (test_var) New directory to shared files is created: %s"%(self.SHARE_DIRECTORY)
46                        else:
47                                print "[LLXRemoteInstaller] (test_var) Directory to shared files exists: %s"%(self.SHARE_DIRECTORY)
48                                os.system("sudo setfacl -m g:adm:rwx -d -m g:adm:rwx %s"%self.SHARE_DIRECTORY)
49                                #os.chmod(self.SHARE_DIRECTORY, 755)
50                        print "[LLXRemoteInstaller] (test_var) Value for variable %s: %s"%(namevar,VALOR)
51                        if  VALOR in ["",None,'None']:
52                                objects["VariablesManager"].add_variable(namevar,self.initial_dict,"",namevar,[],False,False)
53                                COMMENT = ("[LLXRemoteInstaller] (test_var) Added variable %s to VariablesManager" %namevar)
54                                print ("%s" %COMMENT)
55                                return [True,str(COMMENT)]
56                        else:
57                                COMMENT=("[LLXRemoteInstaller] (test_var) %s Variable exists in your system, it hasn't been created again" %namevar)
58                                print ("%s" %COMMENT)
59                                return [True,str(COMMENT)]
60                               
61                except Exception as e:
62                        return [False,str(e)]
63                       
64        #def_test_var
65       
66       
67        def reset_var (self,namevar=None):
68                try:
69                       
70                        import xmlrpclib as x
71                        c=x.ServerProxy("https://server:9779")
72                        data=None
73                        objects["VariablesManager"].set_variable(namevar,data)
74                        COMMENT=("[LLXRemoteInstaller] (reset_var) %s has been updated" %namevar)
75                        print ("%s" %COMMENT)
76                        return [True,str(COMMENT)]
77                               
78                except Exception as e:
79                        return [False,str(e)]
80               
81        #def_reset_var
82
83
84
85        def update_var_dict (self,namevar=None,dict={},user=None,passwd=None):
86                try:
87                        print "[LLXRemoteInstaller] (update_var_list) Test if_exists variable %s"%namevar
88                        if self.test_var(namevar,user, passwd)[0]:
89                                print "[LLXRemoteInstaller] (update_var_list) Variable %s is now in your system"%namevar
90                                import xmlrpclib as x
91                                c=x.ServerProxy("https://server:9779")
92                                if objects["VariablesManager"].set_variable(namevar,dict)[0]:
93                                        COMMENT="[LLXRemoteInstaller] (update_var_list) %s has been updated with this list of APP %s" %(namevar,dict)
94                                        print ("%s" %COMMENT)
95                                        return [True,str(COMMENT)]
96                        else:
97                                COMMENT="[LLXRemoteInstaller] (update_var_list) Cannot updated variable"
98                                print ("%s" %COMMENT)
99                                return [False,str(COMMENT)]
100                               
101                except Exception as e:
102                        return [False,str(e)]
103               
104        #def_add_list
105       
106       
107       
108        def app_repo_exist (self,app=None):
109                try:
110                        #exist=os.system("LANGUAGE=en_EN; apt-cache policy %s | grep -i candidate" %app)
111                        exist=subprocess.Popen(["LANGUAGE=en_EN; apt-cache policy %s | grep -i candidate" %app],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0]
112                        print ("[LLXRemoteInstaller] (app_repo_exist) APP candidate in your repo is: %s"%exist)
113                        if exist == None or exist == "":
114                                COMMENT="[LLXRemoteInstaller] (app_repo_exist) APP: %s doesn't exist in your repository, you can't add it to install list" %app
115                                print ("%s" %COMMENT)
116                                return [False,str(COMMENT)]
117                        else:
118                                COMMENT="[LLXRemoteInstaller] (app_repo_exist) APP: %s is avaiable from your repo, it has been added to your install list" %app
119                                print ("%s" %COMMENT)
120                                return [True,str(COMMENT)]
121                               
122                except Exception as e:
123                        return [False,str(e)]
124               
125        #def_app_repo_exist
126       
127       
128       
129        def app_deb_exist (self,app=None, url=None):
130                try:
131                        url_all=str(url)+str(app)
132                        print ("[LLXRemoteInstaller] (app_deb_exist) VAR URL_ALL: %s"%url_all)
133                        import urllib
134                        if urllib.urlopen(url_all).code == 200:
135                                COMMENT="[LLXRemoteInstaller](app_deb_exist) APP: %s is avaiable and added to list to install it" %app
136                                print ("%s" %COMMENT)
137                                return [True,str(COMMENT)]
138                        else:
139                                COMMENT="[LLXRemoteInstaller] (app_deb_exist) Can't find APP: %s to download it from URL %s, you can't added to install it" %(app,url)
140                                print ("%s" %COMMENT)
141                                return [False,str(COMMENT)]
142                               
143                except Exception as e:
144                        return [False,str(e)]
145               
146        #def_app_deb_exist
147       
148       
149       
150        def repo_add (self,sources_private=None):
151                try:
152                        if sources_private not in ["",None,[]]:
153                                COMMENT="[LLXRemoteInstaller](repo_add) REPO IS PARTICULAR %s" %sources_private
154                                print ("%s" %COMMENT)
155                                print "[LLXRemoteInstaller](repo_add) Creating new file %s" %self.file_sources
156                                mode = 'a' if os.path.exists(self.file_sources) else 'w'
157                                f_used=open(self.file_sources,mode)
158                                print "open(%s,%s)"%(self.file_sources,mode)
159                                f_used.write(sources_private+'\n')
160                                f_used.close()
161                                print "[LLXRemoteInstaller](repo_add) File created now read it" 
162                                #NOW READ THE NEW SOURCES.LIST
163                                sources=[]
164                                file=open(self.file_sources)
165                                f=file.read().splitlines()
166                                for line in f:
167                                        sources.append(line)
168                                        print "[LLXRemoteInstaller](repo_add) Line added: %s" %line
169                                file.close()
170                       
171                        COMMENT="[LLXRemoteInstaller](repo_add) Your repo LLXRemoteInstaller has new lines %s"%sources 
172                        print ("%s" %COMMENT)
173                        return [True,str(COMMENT),sources]
174       
175                               
176                except Exception as e:
177                        print e
178                        return [False,str(e)]
179               
180        #def_repo_update
181       
182        def remove_file (self,file=None):
183                try:
184                       
185                        COMMENT="[LLXRemoteInstaller](remove_file) Reemoving file %s"%file     
186                        print ("%s" %COMMENT)
187                        if os.path.exists(file):
188                                #print "Borrandoooooooooooooooooooooooooooooo"
189                                os.remove(file)
190                       
191                                COMMENT="[LLXRemoteInstaller](remove_file) File %s has been deleted from server"%file
192                                print ("%s" %COMMENT)
193                                return [True,str(COMMENT)]
194                        else:
195                                COMMENT="[LLXRemoteInstaller](remove_file) ERROR: Cannot delete file %s from server"%file
196                                print ("%s" %COMMENT)
197                                return [False,str(COMMENT)]
198                       
199                except Exception as e:
200                        return [False,str(e)]
201               
202        #def_repo_restore
203       
204        def repo_restore (self,file=None):
205                try:
206                       
207                        COMMENT="[LLXRemoteInstaller](repo_restore) Repo %s to test APT Aplications is deleted and restore to initial state"%file       
208                        print ("%s" %COMMENT)
209                        if os.path.exists(file):
210                                #print "Borrandoooooooooooooooooooooooooooooo"
211                                os.remove(file)
212                        self.repo_update()
213                       
214                        COMMENT="[LLXRemoteInstaller](repo_restore) Repo from AddApplications has deleted"     
215                        print ("%s" %COMMENT)
216                        return [True,str(COMMENT)]
217                       
218                except Exception as e:
219                        return [False,str(e)]
220               
221        #def_repo_restore
222       
223       
224        def repo_update (self):
225                try:
226                        COMMENT="[LLXRemoteInstaller](repo_restore) Actualizando los indices, espera........"
227                        print ("%s" %COMMENT)
228                        proc = subprocess.Popen('apt-get update', shell=True, stdin=None, stdout=open("/dev/null", "w"), stderr=None, executable="/bin/bash")
229                        proc.wait()
230                        COMMENT="[LLXRemoteInstaller](repo_restore) Se han actualizado los indices"
231                        print ("%s" %COMMENT)
232                        return [True,str(COMMENT)]
233                       
234                except Exception as e:
235                        return [False,str(e)]
236               
237        #def_repo_restore
238       
239       
240        def test_apt_list (self,dict=None):
241               
242                try:
243                        list_apt=[]
244                        list_apt_ok=[]
245                        list_apt_testing=[]
246                        restore=False
247                        for x in dict[self.APT]:
248                                print "[LLXRemoteInstaller](test_apt_list) Comprobando el PPA: %s"%x
249                                #print "[LLXRemoteInstaller](dict_ok) Comprobando el listado de APP: %s"%list_apt
250                                url=dict[self.APT][x][self.URL]
251                                list_apt_testing=dict[self.APT][x][self.LIST]
252                                if url not in ["",None] and list_apt_testing not in ["",[],None]:
253                                        if self.repo_add(url)[0]:
254                                                COMMENT="[LLXRemoteInstaller](test_apt_list) Repo esta ADDED"
255                                                print COMMENT
256                                                list_apt=list_apt+list_apt_testing
257                                                restore=True
258                                                print "[LLXRemoteInstaller](test_apt_list) Anyadimos las APT del repo anterior, nueva lista: %s"%(list_apt)
259                                        else:
260                                                self.repo_restore(self.file_sources)
261                                                COMMENT="[LLXRemoteInstaller](test_apt_list) Repo no se puede ADDED - PROBLEM"
262                                                return [False,list_apt,COMMENT]
263                       
264                        if list_apt not in ["",None,[]] :
265                                if self.repo_update()[0]:
266                                        for app in list_apt:
267                                                print "[LLXRemoteInstaller](test_apt_list) Comprobando si es avaiable el APT: %s"%app
268                                                if self.app_repo_exist(app)[0]:
269                                                        list_apt_ok.append(app)
270                                        list_apt=list_apt_ok
271                                        COMMENT="[LLXRemoteInstaller](test_apt_list) El listado de APT disponibles en el repo es: %s"%(list_apt)
272                                        print COMMENT
273                                else:
274                                        self.repo_restore(self.file_sources)
275                                        COMMENT="[LLXRemoteInstaller](test_apt_list) No se puede actualizar el repo - PROBLEM"
276                                        return [False,list_apt,COMMENT]
277                                       
278                               
279                        else:
280                                COMMENT="[LLXRemoteInstaller](test_apt_list) No hacemos nada con este REPO esta vacio de contenido"
281                                print COMMENT
282                               
283                        #UPDATE DICT
284                        list_apt_deleted=[]
285                        for x in dict[self.APT]:
286                                list_apt_testing=[]
287                                for app in dict[self.APT][x][self.LIST]:
288                                        if app in list_apt:
289                                                list_apt_testing.append(app)
290                                        else:
291                                                list_apt_deleted.append(app)
292                                dict[self.APT][x][self.LIST]=list_apt_testing
293                               
294                        #Solo hago un update y restore del sources si este ha sido cambiado anteriormente.
295                        if restore:     
296                                self.repo_restore(self.file_sources)
297                        return [True,dict,list_apt,list_apt_deleted,COMMENT]
298                       
299                except Exception as e:
300                        return [False,str(e)]
301               
302               
303        #def test_apt_list
304       
305        def test_deb_list (self,dict=None):
306               
307                try:
308               
309                        #TEST DE LOS DEBS
310                        list_debs=dict[self.DEB][self.LIST]
311                        url=dict[self.DEB][self.URL]
312                        #url=self.SHARE_DIRECTORY
313                        print "[LLXRemoteInstaller](test_deb_list) El listado de DEBS es %s i lo comprobaremos en la URL: %s"%(list_debs,url)
314                        list_debs_ok=[]
315                        list_debs_fail=[]
316                        for app in list_debs:
317                                print "[LLXRemoteInstaller](test_deb_list) Comprobando si es avaiable el DEB: %s"%app
318                                if self.app_deb_exist(app,url)[0]:
319                                        list_debs_ok.append(app)
320                                else:
321                                        list_debs_fail.append(app)
322                        list_debs=list_debs_ok
323                        dict[self.DEB][self.LIST]=list_debs
324                        print "[LLXRemoteInstaller](test_deb_list) Listado avaiable de DEBS: %s"%list_debs_ok
325                        print "[LLXRemoteInstaller](test_deb_list) Listado Unavaiable de DEBS: %s"%list_debs_fail
326                        return [True,dict,list_debs_ok,list_debs_fail]
327                except Exception as e:
328                        return [False,str(e)]
329               
330               
331        #def test_deb_list
332       
333        def test_list (self,dict=None,type=None):
334               
335                try:
336               
337                        #TEST DE LOS DEBS
338                        list_debs=dict[type][self.LIST]
339                        url=dict[type][self.URL]
340                        #url=self.SHARE_DIRECTORY
341                        print "[LLXRemoteInstaller](test_list) El listado de SH es %s y lo comprobaremos en la URL: %s"%(list_debs,url)
342                        list_debs_ok=[]
343                        list_debs_fail=[]
344                        list_tupla_ok=[]
345                        for app_tupla in list_debs:
346                                app=app_tupla[0]
347                                md5=app_tupla[1]
348                                print "[LLXRemoteInstaller](test_list) Comprobando si es avaiable el SH: %s"%app
349                                if self.app_deb_exist(app,url)[0]:
350                                        list_debs_ok.append(app)
351                                        list_tupla_ok.append([app,md5])
352                                else:
353                                        list_debs_fail.append(app)
354                        list_debs=list_tupla_ok
355                        dict[type][self.LIST]=list_debs
356                        print "[LLXRemoteInstaller](test_list) Listado avaiable de SH: %s"%list_debs_ok
357                        print "[LLXRemoteInstaller](test_list) Listado Unavaiable de SH: %s"%list_debs_fail
358                        return [True,dict,list_debs_ok,list_debs_fail]
359                except Exception as e:
360                        return [False,str(e)]
361               
362               
363        #def test_deb_list
364       
365       
366       
367       
368       
369       
370        def dict_ok (self, dict={}):
371                try:
372                        if os.path.exists(self.file_sources):
373                                os.remove(self.file_sources)
374                        COMMENT="[LLXRemoteInstaller](dict_ok) Comprobando la lista de la GUI........"
375                        print ("%s" %COMMENT)
376                       
377                        #TEST DE LOS DEBS
378                        list_debs=dict[self.DEB][self.LIST]
379                        #url=dict[self.DEB][self.URL]
380                       
381                        print "[LLXRemoteInstaller](dict_ok) El listado de DEBS es %s i lo comprobaremos en la URL: %s"%(list_debs,url)
382                        list_debs_ok=[]
383                        for app in list_debs:
384                                print "[LLXRemoteInstaller](dict_ok) Comprobando si es avaiable el DEB: %s"%app
385                                if self.app_deb_exist(app,url)[0]:
386                                        list_debs_ok.append(app)
387                        list_debs=list_debs_ok
388                        dict[self.DEB][self.LIST]=list_debs
389                        print "[LLXRemoteInstaller](dict_ok) El listado de DEBS disponibles es: %s"%list_debs
390                       
391                        #TEST DE LOS SH
392                        list_sh=dict[self.SH][self.LIST]
393                        url=dict[self.SH][self.URL]
394                        print "[LLXRemoteInstaller](dict_ok) El listado de SCRIPTS es %s i lo comprobaremos en la URL: %s"%(list_debs,url)
395                        list_sh_ok=[]
396                        for app_tupla in list_sh:
397                                app=app_tupla[0]
398                                md5=app_tupla[1]
399                                print "[LLXRemoteInstaller](dict_ok) Comprobando si es avaiable el SCRIPTS: %s"%app
400                                if self.app_deb_exist(app,url)[0]:
401                                        list_sh_ok.append([app,md5])
402                        list_sh=list_sh_ok
403                        dict[self.SH][self.LIST]=list_sh
404                        print "[LLXRemoteInstaller](dict_ok) El listado de SCRIPTS disponibles es: %s"%list_sh
405                       
406                       
407                        list_apt_resume=[]
408                        #TEST DE LAS APT
409                        for x in dict[self.APT]:
410                                list_apt=None
411                                list_apt_ok=[]
412                                print "[LLXRemoteInstaller](dict_ok) Comprobando el PPA: %s"%x
413                                list_apt=dict[self.APT][x][self.LIST]
414                                #print "[LLXRemoteInstaller](dict_ok) Comprobando el listado de APP: %s"%list_apt
415                                url=dict[self.APT][x][self.URL]
416                                print "[LLXRemoteInstaller](dict_ok) El listado de APT es %s lo comprobaremos en la URL: %s"%(list_apt,url)
417                               
418                                if list_apt not in ["",None,[]] or url not in ["",None]:
419                                        #print "entro aqui dos"
420                                        if self.repo_add(url)[0]:
421                                                print "[LLXRemoteInstaller](dict_ok) Repo esta ADDED"
422                                                if self.repo_update()[0]:
423                                                        print "[LLXRemoteInstaller](dict_ok) Repo is UPDATED"
424                                                        pass
425                                                else:
426                                                        return [False,"false el repo_update"]
427                                                        #return [False,self.repo_update()[1]]
428                                        else:
429                                                #return [False,self.repo_add()[1]]
430                                                return [False,"false el repo_add"]
431                                       
432                                        for app in list_apt:
433                                                print "[LLXRemoteInstaller](dict_ok) Comprobando si es avaiable el APT: %s"%app
434                                                if self.app_repo_exist(app)[0]:
435                                                        list_apt_ok.append(app)
436                                                        list_apt_resume.append(app)
437                                        list_apt=list_apt_ok
438                                        dict[self.APT][x][self.LIST]=list_apt
439                                        print "[LLXRemoteInstaller](dict_ok) El listado de APT disponibles en el repo %s es: %s"%(x,list_apt)
440                                else:
441                                        print "[LLXRemoteInstaller](dict_ok) No hacemos nada con este REPO %s esta vacio de contenido"%x
442                       
443                        self.repo_restore(self.file_sources)   
444                        COMMENT="[LLXRemoteInstaller](dict_ok) El listado de disponibles es ** DEBS: %s  ** SH: %s  **  APT: %s"%(list_debs,list_sh,list_apt_resume)
445                        print ("%s" %COMMENT)
446                        return [True,str(COMMENT),dict,list_apt_resume]
447                       
448                except Exception as e:
449                        return [False,str(e)]
450               
451        #def_dict_ok
452       
Note: See TracBrowser for help on using the repository browser.