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

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

adding sh files

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