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

Last change on this file since 4611 was 4611, checked in by daduve, 4 years ago

Adding support to lliurex.net and mirror in server

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