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

Last change on this file since 7557 was 7557, checked in by jrpelegrina, 17 months ago

Added checking of valid epi file

File size: 10.5 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.valid_json=self.epicore.read_conf(app)
19                signal.signal(signal.SIGINT,self.handler_signal)
20
21                if len(self.epicore.epiFiles)==0:
22                        if self.valid_json:
23                                msg_log='APP epi file not exist'
24                        else:
25                                msg_log='APP epi file it is not a valid json'   
26                        print ('  [EPIC]: '+msg_log)
27                        self.write_log(msg_log)
28                        sys.exit(1)
29                else:
30                        msg_log='APP epi file loaded by EPIC: ' + app
31                        self.write_log(msg_log) 
32
33
34        #def __init__           
35
36        def get_info(self):
37
38
39                order=len(self.epicore.epiFiles)
40                depends=""
41                pkgs=""
42               
43                for item in self.epicore.epiFiles:
44                        order=order-1
45                        tmp=self.epicore.epiFiles[order]
46                        for item in tmp["pkg_list"]:
47                                if order>0:
48                                        depends=depends+item["name"]+" "
49                                else:   
50                                        pkgs=pkgs+item["name"] +" "
51                       
52                return depends,pkgs     
53
54        #def get_info                   
55
56
57
58
59        def showInfo(self,checked=None):
60               
61                checksystem=True
62                if not checked:
63                        print ('  [EPIC]: Searching information...')
64                        self.epicore.get_pkg_info()
65
66                if checksystem:
67                        depends,pkgs=self.get_info()
68
69                        epi_conf=self.epicore.epiFiles[0]
70                        status=epi_conf["status"]
71                       
72                        try:
73                                if epi_conf["script"]["remove"]:
74                                        self.uninstall="Yes"
75                        except Exception as e:
76                                self.uninstall="No"
77
78                        print ("  [EPIC]: Information availabled:")
79                        print ("     Application: " + pkgs)
80                        print ("     Status: " + status)
81                        print ("     Uninstall process availabled: " + self.uninstall)
82                        if len(depends)>0:
83                                print ("     Additional application required: " + depends)
84
85
86                        return 0
87                else:
88                        return 1       
89
90        #def showInfo   
91
92        def checking_system(self,action=None):
93
94                check=True
95                print ('  [EPIC]: Checking system...')
96
97                self.connection=self.epicore.check_connection()
98
99                if self.connection:
100                        self.epicore.check_root()
101                        self.epicore.get_pkg_info()
102                        self.required_root=self.epicore.required_root()
103                        self.required_x=self.check_required_x()
104                        if self.required_root:
105                                msg_log="You need root privileges to " + action + " the application"
106                                print ('  [EPIC]: '+msg_log)
107                                self.write_log(msg_log)
108                                check=False
109                        if self.required_x:
110                                msg_log="Can not " + action + " the application via terminal. Use epi-gtk for this"
111                                print ('  [EPIC]: '+ msg_log)
112                                self.write_log(msg_log)
113                                check=False
114                else:
115                        msg_log="Internet connection not detected"
116                        print ('  [EPIC]: '+msg_log)
117                        self.write_log(msg_log)
118                        check=False
119
120                return check
121
122        #def checking_system
123
124        def check_required_x(self):
125
126                cont=0
127                for item in self.epicore.epiFiles:
128                        if self.epicore.epiFiles[item]["required_x"]:
129                                cont=cont+1
130                if cont>0:
131                        return True
132                else:
133                        return False   
134
135        #def check_required_x           
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='Installation aborted. Error preparing system:' '\n' + str(output[1])
195                                print('  [EPIC]: ' +msg_log)
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                                                                        else:
318                                                                                error=True     
319
320                                                                else:
321                                                                        error=True
322                                                        else:
323                                                                error=True
324                                                               
325                                                else:
326                                                        error=True
327                                        else:
328                                                error=True
329
330                                        if error:
331                                                self.epicore.zerocenter_feedback(order,'install',result)
332                                                self.epicore.remove_repo_keys()
333                                                return 1
334
335                                msg_log='Installation completed successfully'
336                                print('  [EPIC]: '+msg_log)
337                                self.write_log(msg_log)
338                                self.epicore.remove_repo_keys()
339
340
341                        else:
342                                msg_log='Installation cancelled'
343                                print ('  [EPIC]: '+msg_log)
344                                self.write_log(msg_log)
345                                self.epicore.remove_repo_keys()
346                                return 0
347
348                else:
349                        return 1       
350
351        #def install           
352
353
354        def uninstall_process(self):
355
356                cmd=self.epicore.uninstall_app(0)
357
358                if cmd !="":
359                        print('  [EPIC]: Uninstall application...')
360                        p=subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE)
361                        output=p.communicate()
362                        error=self.readErrorOutput(output[1])
363                        if error:
364                                msg_log='Uninstalled process ending with errors:' +'\n'+str(output[1])
365                                print('  [EPIC]: '+msg_log)
366                                self.write_log(msg_log)
367                                return False
368                        else:
369                                dpkg_status,result=self.epicore.check_install_remove("uninstall")
370                                if result:
371                                        return True     
372                                else:
373                                        msg_log='Uninstalled process ending with errors'
374                                        print('  [EPIC]: '+msg_log)
375                                        self.write_log(msg_log)
376                                        return False   
377                else:
378                        return True     
379
380        #def uninstall_process                         
381
382        def uninstall(self,mode):
383       
384                checksystem=self.checking_system('uninstall')
385                error=False
386
387                if checksystem:
388                        self.showInfo(True)
389                        if self.uninstall=='Yes':
390                                if not mode:
391                                        response=input('  [EPIC]: Do you want to uninstall the application (yes/no)): ').lower()
392                                else:
393                                        response='yes'
394
395                                if response.startswith('y'):
396
397                                        msg_log='Uninstall application by CLI'
398                                        self.write_log(msg_log)
399
400                                        result=self.uninstall_process()
401                                        if result:
402                                                self.epicore.zerocenter_feedback(0,'uninstall',result)
403                                                msg_log='Application successfully uninstalled'
404                                                print('  [EPIC]: '+msg_log)
405                                                self.write_log(msg_log)
406                                                return 0
407                                        else:
408                                                self.epicore.zerocenter_feedback(0,'uninstall',result)
409                                                return 1
410                                else:
411                                        msg_log='Uninstall process canceled'
412                                        print ('  [EPIC]: '+msg_log)
413                                        self.write_log(msg_log)
414                                        return 0
415               
416                        else:
417                                msg_log='Uninstall process not availabled'
418                                print ('  [EPIC]: '+msg_log)
419                                self.write_log(msg_log)
420                                return 0
421 
422                else:
423                        return 1
424
425        #def uninstall                                                                 
426
427
428        def readErrorOutput(self,output):
429
430                cont=0
431                if type(output) is bytes:
432                        output=output.decode()
433                lines=output.split('\n')
434                for line in lines:
435                        if "E: " in line:
436                                cont=cont+1
437
438                if cont>0:
439                        return True
440                else:
441                        return False   
442
443        # def readErrorOutput           
444
445        def handler_signal(self,signal,frame):
446
447                print("\n  [EPIC]: Cancel process with Ctrl+C signal")
448                self.epicore.remove_repo_keys()
449                msg_log="Cancel process with Ctrl+C signal"
450                self.write_log(msg_log)
451                sys.exit(0)
452       
453        #def handler_signal             
454
455        def write_log(self,msg):
456
457                syslog.openlog("EPI")
458                syslog.syslog(msg)
459                                                                                                                               
460                return
461
462        #def write_log 
Note: See TracBrowser for help on using the repository browser.