source: epi/trunk/fuentes/epi-cli/__init__.py @ 6135

Last change on this file since 6135 was 6135, checked in by jrpelegrina, 3 years ago

Fix files

File size: 10.6 KB
Line 
1#!/usr/bin/env python3
2
3import os
4import subprocess
5import sys
6import html2text
7import syslog
8
9import epi.epimanager as EpiManager
10import signal
11signal.signal(signal.SIGINT,signal.SIG_IGN)
12
13class EPIC(object):
14
15        def __init__(self,app):
16
17                self.epicore=EpiManager.EpiManager(app)
18                signal.signal(signal.SIGINT,self.handler_signal)
19
20                if len(self.epicore.epiFiles)==0:
21                        msg_log='APP epi file not exist'
22                        print ('  [EPIC]: '+msg_log)
23                        self.write_log(msg_log)
24                        sys.exit(1)
25                else:
26                        msg_log='APP epi file loaded by EPIC: ' + app
27                        self.write_log(msg_log) 
28
29
30        #def __init__           
31
32        def get_info(self):
33
34                #self.epicore.get_pkg_info()
35
36                order=len(self.epicore.epiFiles)
37                depends=""
38                pkgs=""
39               
40                for item in self.epicore.epiFiles:
41                        order=order-1
42                        tmp=self.epicore.epiFiles[order]
43                        if tmp["type"]!="file":
44                                for item in tmp["pkg_list"]:
45                                        if order>0:
46                                                depends=depends+item["name"]+" "
47                                        else:   
48                                                pkgs=pkgs+item["name"] +" "
49                        else:
50                                if order>0:
51                                        depends=depends+tmp["name"]+" "                                 
52                                else:
53                                        pkgs=pkgs+tmp["name"]   
54
55                return depends,pkgs     
56
57        #def get_info                   
58
59
60
61        def showInfo(self,checked=None):
62               
63                checksystem=True
64                if not checked:
65                        print ('  [EPIC]: Searching information...')
66                        self.epicore.get_pkg_info()
67                        #checksystem=self.checking_system()
68
69                if checksystem:
70                        depends,pkgs=self.get_info()
71
72                        epi_conf=self.epicore.epiFiles[0]
73                        status=epi_conf["status"]
74                       
75                        if epi_conf["script"]["modes"]["remove"]:
76                                self.uninstall="Yes"
77                        else:
78                                self.uninstall="No"
79
80                        print ("  [EPIC]: Information availabled:")
81                        print ("     Application: " + pkgs)
82                        print ("     Status: " + status)
83                        print ("     Uninstall process availabled: " + self.uninstall)
84                        if len(depends)>0:
85                                print ("     Additional application required: " + depends)
86
87
88                        return 0
89                else:
90                        return 1       
91
92        #def showInfo   
93
94        def checking_system(self,action=None):
95
96                check=True
97                print ('  [EPIC]: Checking system...')
98
99                self.connection=self.epicore.check_connection()
100
101                if self.connection:
102                        self.epicore.check_root()
103                        self.epicore.get_pkg_info()
104                        self.required_root=self.epicore.required_root()
105                        self.required_x=self.check_required_x()
106                        if self.required_root:
107                                msg_log="You need root privileges to " + action + " the application"
108                                print ('  [EPIC]: '+msg_log)
109                                self.write_log(msg_log)
110                                check=False
111                        if self.required_x:
112                                msg_log="Can not " + action + " the application via terminal. Use BLAS for this"
113                                print ('  [EPIC]: '+ msg_log)
114                                self.write_log(msg_log)
115                                check=False
116                else:
117                        msg_log="Internet connection not detected"
118                        print ('  [EPIC]: '+msg_log)
119                        self.write_log(msg_log)
120                        check=False
121
122                return check
123
124        #def checking_system
125
126        def check_required_x(self):
127
128                cont=0
129                for item in self.epicore.epiFiles:
130                        if self.epicore.epiFiles[item]["required_x"]:
131                                cont=cont+1
132                if cont>0:
133                        return True
134                else:
135                        return False   
136
137        def add_repository_keys(self,order):
138
139                print('  [EPIC]: Gathering information....')
140               
141                cmd=self.epicore.add_repository_keys(order)
142                if cmd !="":
143                        p=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
144                        output=p.communicate()
145                        error=self.readErrorOutput(output[1])
146                        if error:
147                                msg_log='Installation aborted. Error gathering information: ' +'\n'+str(output[1])
148                                print('  [EPIC]: '+msg_log)
149                                self.write_log(msg_log)
150                                return False
151                        else:
152                                msg_log='Gathering information: OK'
153                                self.write_log(msg_log)
154                                return True     
155
156                else:
157                        return True             
158
159        #def add_repository_keys               
160
161        def download_app(self):
162
163                cmd=self.epicore.download_app()
164
165                if cmd !="":
166                        print('  [EPIC]: Downloading application....')
167                        os.system(cmd)
168                        result=self.epicore.check_download()
169                        if result:
170                                msg_log='Downloading application: OK'
171                                self.write_log(msg_log)
172                                return True     
173                        else:
174                                msg_log='Installation aborted. Error downloading application'
175                                print('  [EPIC]: '+msg_log)
176                                self.write_log(msg_log)
177                                return False   
178                else:
179                        return True             
180
181        #def download_app               
182
183
184        def preinstall_app(self):
185
186                cmd=self.epicore.preinstall_app()
187
188                if cmd !="":
189                        print('  [EPIC]: Preparing installation...')
190                        p=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
191                        output=p.communicate()
192                        error=self.readErrorOutput(output[1])
193                        if error:
194                                msg_log
195                                print('  [EPIC]: Installation aborted. Error preparing system:' +'\n'+str(output[1]))
196                                self.write_log(msg_log)
197                                return False
198                        else:
199                                result=self.epicore.check_preinstall()
200                                if result:
201                                        msg_log='Preparing installation: OK'
202                                        self.write_log(msg_log)
203                                        return True     
204                                else:
205                                        msg_log='Installation aborted. Error preparing system'
206                                        print('  [EPIC]: '+msg_log)
207                                        self.write_log(msg_log)
208
209                                        return False   
210                else:
211                        return True             
212
213        #def preinstall_app             
214
215
216        def install_app(self):
217       
218                cmd=self.epicore.install_app()
219
220                if cmd !="":
221                        print('  [EPIC]: Installing application...')
222                        p=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
223                        output=p.communicate()
224                        error=self.readErrorOutput(output[1])
225                        if error:
226                                msg_log='Installation aborted. Error installing application:' +'\n'+str(output[1])
227                                print('  [EPIC]: '+msg_log)
228                                self.write_log(msg_log)
229                                return False
230                        else:
231                                dpkg_status,result=self.epicore.check_install_remove("install")
232                                if result:
233                                        msg_log='Installing application: OK'
234                                        self.write_log(msg_log)
235                                        return True     
236                                else:
237                                        msg_log='Installation aborted. Error installing application'
238                                        print('  [EPIC]: '+msg_log)
239                                        self.write_log(msg_log)
240                                        return False   
241                else:
242                        return True             
243
244        #def install_app               
245
246        def postinstall_app(self):
247       
248                cmd=self.epicore.postinstall_app()     
249
250                if cmd !="":
251                        print('  [EPIC]: Ending installation...')
252                        p=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
253                        output=p.communicate()
254                        error=self.readErrorOutput(output[1])
255                        if error:
256                                msg_log='Installation aborted. Error ending installation:' +'\n'+str(output[1])
257                                print('  [EPIC]: '+msg_log)
258                                self.write_log(msg_log)
259                                return False
260                        else:
261                                result=self.epicore.check_postinstall()
262                                if result:
263                                        msg_log='Ending installation. OK'
264                                        self.write_log(msg_log)
265                                        return True     
266                                else:
267                                        msg_log='Installation aborted. Error ending installation'
268                                        print('  [EPIC]: '+msg_log)
269                                        self.write_log(msg_log)
270                                        return False   
271                else:
272                        return True             
273
274        #def postinstall_app                   
275
276
277        def install(self,mode):
278
279                checksystem=self.checking_system('install')
280                error=False
281
282                if checksystem:
283                        self.showInfo(True)
284                        if not mode:
285                                response=input('  [EPIC]: Do you want to install the application (yes/no)): ').lower()
286                        else:
287                                response='yes' 
288
289                        if response.startswith('y'):
290                                msg_log='Installing application by CLI'
291                                self.write_log(msg_log)
292                                order=len(self.epicore.epiFiles)
293                                if order>1:
294                                        print ('****************************************************************')
295                                        print ('*********************** INSTALLING DEPENDS *********************')
296                                        print ('****************************************************************')
297
298                                for item in self.epicore.epiFiles:
299                                        order=order-1
300                                        self.epicore.zerocenter_feedback(order,'init')
301                                        if order==0:
302                                                print ('****************************************************************')
303                                                print ('******************** INSTALLING APPLICATION ********************')
304                                                print ('****************************************************************')
305
306                                        result=self.add_repository_keys(order)
307                                        if result:
308                                                result=self.download_app()
309                                                if result:
310                                                        result=self.preinstall_app()
311                                                        if result:
312                                                                result=self.install_app()
313                                                                if result:
314                                                                        result=self.postinstall_app()
315                                                                        if result:
316                                                                                self.epicore.zerocenter_feedback(order,'install',result)
317                                                                                self.epicore.remove_repo_keys()
318                                                                        else:
319                                                                                error=True     
320
321                                                                else:
322                                                                        error=True
323                                                        else:
324                                                                error=True
325                                                               
326                                                else:
327                                                        error=True
328                                        else:
329                                                error=True
330
331                                if error:
332                                        self.epicore.zerocenter_feedback(order,'install',result)
333                                        self.epicore.remove_repo_keys()
334                                        return 1
335
336                                msg_log='Installation completed successfully'
337                                print('  [EPIC]: '+msg_log)
338                                self.write_log(msg_log)
339                                self.epicore.remove_repo_keys()
340
341
342                        else:
343                                msg_log='Installation cancelled'
344                                print ('  [EPIC]: '+msg_log)
345                                self.write_log(msg_log)
346                                self.epicore.remove_repo_keys()
347                                return 0
348
349                else:
350                        return 1       
351
352        #def install           
353
354
355        def uninstall_process(self):
356
357                cmd=self.epicore.unistall_app(0)
358
359                if cmd !="":
360                        print('  [EPIC]: Uninstall application...')
361                        p=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
362                        output=p.communicate()
363                        error=self.readErrorOutput(output[1])
364                        if error:
365                                msg_log='Uninstalled process ending with errors:' +'\n'+str(output[1])
366                                print('  [EPIC]: '+msg_log)
367                                self.write_log(msg_log)
368                                return False
369                        else:
370                                dpkg_status,result=self.epicore.check_install_remove("uninstall")
371                                if result:
372                                        return True     
373                                else:
374                                        msg_log='Uninstalled process ending with errors'
375                                        print('  [EPIC]: '+msg_log)
376                                        self.write_log(msg_log)
377                                        return False   
378                else:
379                        return True     
380
381        #def uninstall_process                         
382
383        def uninstall(self,mode):
384       
385                checksystem=self.checking_system('uninstall')
386                error=False
387
388                if checksystem:
389                        self.showInfo(True)
390                        if self.uninstall=='Yes':
391                                if not mode:
392                                        response=input('  [EPIC]: Do you want to uninstall the application (yes/no)): ').lower()
393                                else:
394                                        response='yes'
395
396                                if response.startswith('y'):
397
398                                        msg_log='Uninstall application by CLI'
399                                        self.write_log(msg_log)
400
401                                        result=self.uninstall_process()
402                                        if result:
403                                                self.epicore.zerocenter_feedback(0,'uninstall',result)
404                                                msg_log='Application successfully uninstalled'
405                                                print('  [EPIC]: '+msg_log)
406                                                self.write_log(msg_log)
407                                                return 0
408                                        else:
409                                                self.epicore.zerocenter_feedback(0,'uninstall',result)
410                                                return 1
411                                else:
412                                        msg_log='Uninstall process canceled'
413                                        print ('  [EPIC]: '+msg_log)
414                                        self.write_log(msg_log)
415                                        return 0
416               
417                        else:
418                                msg_log='Uninstall process not availabled'
419                                print ('  [EPIC]: '+msg_log)
420                                self.write_log(msg_log)
421                                return 0
422 
423                else:
424                        return 1
425
426        #def uninstall                                                                 
427
428
429        def readErrorOutput(self,output):
430
431                cont=0
432                if type(output) is bytes:
433                        output=output.decode()
434                lines=output.split('\n')
435                for line in lines:
436                        if "E: " in line:
437                                cont=cont+1
438
439                if cont>0:
440                        return True
441                else:
442                        return False   
443
444        # def readErrorOutput           
445
446        def handler_signal(self,signal,frame):
447
448                print("\n  [EPIC]: Cancel process with Ctrl+C signal")
449                self.epicore.remove_repo_keys()
450                msg_log="Cancel process with Ctrl+C signal"
451                self.write_log(msg_log)
452                sys.exit(0)
453       
454        #def handler_signal             
455
456        def write_log(self,msg):
457
458                syslog.openlog("EPI")
459                syslog.syslog(msg)
460                                                                                                                               
461                return
462
463        #def write_log 
Note: See TracBrowser for help on using the repository browser.