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

Last change on this file since 3961 was 3961, checked in by daduve, 3 years ago

n4d files

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