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

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

ShManager? minor bugfix

File size: 3.9 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','pkginfo':'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                count=len(applist)
40                if (action):
41                        for appInfo in applist:
42                                self._debug("Executing action "+action+" for "+str(appInfo))
43                                if action=='install':
44                                        self.result['data'].append(self._install_App(appInfo))
45                                if action=='pkginfo':
46                                        self.result['data'].append(self._get_Sh_Info(appInfo))
47                self.progress=100
48                return(self.result)
49        #def execute_action
50
51        def _set_status(self,status,msg=''):
52                self.result['status']={'status':status,'msg':msg}
53
54        def _callback(self,partialSize=0,totalSize=0):
55                limit=99
56                if partialSize!=0 and totalSize!=0:
57                        inc=round(partialSize/totalSize,2)*100
58                        self.progress=inc
59                else:
60                        inc=1
61                        margin=limit-self.progress
62                        inc=round(margin/limit,3)
63                        self.progress=(self.progress+inc)
64                if (self.progress>limit):
65                        self.progress=limit
66        #def _callback
67
68        def _install_App(self,appInfo):
69                return_msg=False
70                appUrl=appInfo['installerUrl']
71                self._debug("Checking availabilty for "+appUrl)
72                tmpDir=tempfile.mkdtemp(None,None,'/tmp')
73                fileName=appUrl.split('/')[-1]
74                dest_path=tmpDir+'/'+fileName
75                if self._download_App(appUrl,dest_path):
76                        os.chdir(tmpDir)
77                        os.chmod(dest_path, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR)
78                        err=0
79                        try:
80                                cmdsudo=['gksudo',dest_path]
81                                self._debug("executing "+str(cmdsudo))
82                                cmdCmd=subprocess.Popen(cmdsudo,stdout=subprocess.PIPE,stdin=subprocess.PIPE,stderr=subprocess.PIPE)
83#                               cmdCmd=subprocess.check_output(cmdsudo)
84                                cmdLauncher=os.path.basename(dest_path)
85                                cmdLauncher=os.path.splitext(cmdLauncher)[0]
86                                while cmdCmd.poll() is None:
87                                        self._callback()
88                                        time.sleep(0.4)
89                                if cmdCmd.poll():
90                                        if cmdCmd.poll()==255:
91                                                err=303
92                                        else:
93                                                err=cmdCmd.poll()
94                                                err=3 #Force "package not installed" error
95                                cmdResult=cmdCmd.stdout.read()
96                                cmdError=cmdCmd.stderr.read()
97                                self._debug("Error: "+str(cmdError))
98                                self._debug("Result: "+str(cmdResult))
99                        except subprocess.CalledProcessError as callError:
100#                               err=callError.returncode
101                                #if gksudo fails set "permission denied" error
102                                err=303
103                        except Exception as e:
104                                self._debug(str(e))
105                                err=12
106                else:
107                        err=11
108                self._set_status(err)
109                return appInfo
110        #def install_App
111
112        def _download_App(self,appUrl,dest_path=None):
113                appUrl.strip()
114                if not dest_path:
115                        tmpDir=tempfile.mkdtemp(None,None,'/tmp')
116                        dest_path=tmpDir+'/'+appUrl.split('/')[-1]
117                self._debug("Downloading "+appUrl+" to "+dest_path)     
118                try:
119#                       urllib.request.urlretrieve(appUrl,dest_path)
120                        with urllib.request.urlopen(appUrl) as response, open(dest_path, 'wb') as out_file:
121                                bf=16*1024
122                                acumbf=0
123                                shSize=int(response.info()['Content-Length'])
124                                while True:
125                                        if acumbf>=shSize:
126                                                break
127                                        shutil.copyfileobj(response, out_file,bf)
128                                        acumbf=acumbf+bf
129                                        self._callback(acumbf,shSize)
130                        return_msg=True
131                except Exception as e:
132                        self._debug(str(e))
133                        return_msg=False
134                return return_msg
135        #def _download_App
136
137        def _get_Sh_Info(self,appInfo):
138                appUrl=appInfo['installerUrl']
139                self._debug("Connecting to "+appUrl)
140                appUrl.strip()
141                try:
142                        info=urllib.request.urlopen(appUrl) 
143                        appInfo['size']=info.info()['Content-Length']
144                        err=0
145                except:
146                        err=11
147                self._set_status(err)
148                return(appInfo)
149
150        #def _get_info
151
Note: See TracBrowser for help on using the repository browser.