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

Last change on this file was 8703, checked in by Juanma, 16 months ago

sync with git

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