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

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