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

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

Add ubuntu repos with other repos

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