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

Last change on this file since 6717 was 6717, checked in by jrpelegrina, 20 months ago

Fixed files and addded logrotate

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