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

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

n4d files

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