source: lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/shManager.py @ 4394

Last change on this file since 4394 was 4394, checked in by Juanma, 3 years ago

CLI: WIP on shManager

File size: 2.8 KB
Line 
1import sys
2import os
3import stat
4import locale
5import tempfile
6import subprocess
7import urllib.request
8import shutil
9import time
10
11class shmanager:
12        def __init__(self):
13                self.locale=locale.getlocale()[0]
14                self.dbg=0
15                self.pluginInfo={'install':'sh'}
16                self.progress=0
17                self.result={}
18                self.result['data']=[]
19                self.result['status']={}
20                self.result['status']={'status':-1,'msg':''}
21        #def __init__
22
23        def set_debug(self,dbg='1'):
24                self.dbg=int(dbg)
25                self._debug ("Debug enabled")
26        #def set_debug
27
28        def _debug(self,msg=''):
29                if self.dbg==1:
30                        print ('DEBUG Sh: '+msg)
31        #def debug
32
33        def register(self):
34                return(self.pluginInfo)
35        #def register
36
37        def execute_action(self,action,applist):
38                self.result['status']={'status':-1,'msg':''}
39                self.result['data'].append(applist)
40                count=len(applist)
41                if (action):
42                        for appInfo in applist:
43                                self._debug("Executing action "+action+" for "+str(appInfo))
44                                if action=='install':
45                                        self.result['data'].append(self._install_App(appInfo))
46                self.progress=100
47                return(self.result)
48        #def execute_action
49
50        def _set_status(self,status,msg=''):
51                self.result['status']={'status':status,'msg':msg}
52
53        def _callback(self,cmdLauncher):
54                inc=1
55                limit=99
56                margin=limit-self.progress
57                inc=round(margin/limit,3)
58                self.progress=self.progress+inc
59        #def _callback
60
61        def _install_App(self,appInfo):
62                return_msg=False
63                appUrl=appInfo['installerUrl']
64                self._debug("Checking availabilty for "+appUrl)
65                tmpDir=tempfile.mkdtemp(None,None,'/tmp')
66                fileName=appUrl.split('/')[-1]
67                dest_path=tmpDir+'/'+fileName
68                if self._download_App(appUrl,dest_path):
69                        os.chdir(tmpDir)
70                        os.chmod(dest_path, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR)
71                        err=0
72                        try:
73                                cmdsudo=['gksudo',dest_path]
74                                self._debug("executing "+str(cmdsudo))
75                                cmdCmd=subprocess.Popen(cmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
76                                cmdLauncher=os.path.basename(dest_path)
77                                cmdLauncher=os.path.splitext(cmdLauncher)[0]
78                                while cmdCmd.poll() is None:
79                                        self._callback(cmdLauncher)
80                                        time.sleep(0.4)
81                                cmdResult=cmdCmd.stdout.read()
82                                cmdError=cmdCmd.stderr.read()
83                                self._debug("Error: "+str(cmdError))
84                                self._debug("Result: "+str(cmdResult))
85                        except Exception as e:
86                                self._debug(str(e))
87                                err=12
88                else:
89                        err=11
90                self._set_status(err)
91                return err
92        #def install_App
93
94        def _download_App(self,appUrl,dest_path=None):
95                appUrl.strip()
96                if not dest_path:
97                        tmpDir=tempfile.mkdtemp(None,None,'/tmp')
98                        dest_path=tmpDir+'/'+appUrl.split('/')[-1]
99                self._debug("Downloading "+appUrl+" to "+dest_path)     
100                try:
101                                #                       urllib.request.urlretrieve(appUrl,dest_path)
102                        with urllib.request.urlopen(appUrl) as response, open(dest_path, 'wb') as out_file:
103                                shutil.copyfileobj(response, out_file)
104
105                        return_msg=True
106                except Exception as e:
107                        self._debug(str(e))
108                        return_msg=False
109                return return_msg
110        #def _download_App
Note: See TracBrowser for help on using the repository browser.