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

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

Bugfix with removing debs and version mismatching between installed and available

File size: 5.3 KB
Line 
1import syslog
2import gi
3gi.require_version('PackageKitGlib', '1.0')
4from gi.repository import PackageKitGlib as packagekit
5class debmanager:
6        def __init__(self):
7                self.installer=''
8                self.dbg=0
9                self.pkgList=[]
10                self.result=[]
11                self.progress=0
12                self.partialProgress=0
13                #self.pluginInfo=['install','deb','remove','deb','pkginfo','deb','remove','zmd']
14                self.pluginInfo={'install':'deb','remove':'deb','pkginfo':'deb'}
15                self.result={}
16                self.result['data']={}
17                self.result['status']={}
18                self.count=0
19        #def __init__
20
21        def set_debug(self,dbg='1'):
22                self.dbg=int(dbg)
23                self._debug ("Debug enabled")
24        #def set_debug
25
26        def _debug(self,msg=''):
27                if self.dbg==1:
28                        print ('DEBUG Deb: '+str(msg))
29        #def debug
30
31        def _log(self,msg=None):
32                if msg:
33                        syslog.openlog('lliurex-store')
34                        syslog.syslog(msg)
35
36        def register(self):
37                return(self.pluginInfo)
38        #def register
39
40        def execute_action(self,action,applist):
41                self.installer=packagekit.Client()
42                self.count=len(applist)
43                self.result['status']={'status':-1,'msg':''}
44                self.result['data']=[]
45                processedPkg=[]
46                #1.- If the app doesn't exist cancel the action
47                for appInfo in applist:
48                        if appInfo['package'] not in processedPkg:
49                                processedPkg.append(appInfo['package'])
50                                filters=1
51                                if action=='remove':
52                                        filters=2
53                                app=self._resolve_App(appInfo['package'],filters)
54                                if app:
55                                        if action=='install':
56                                                self._log("Installing "+appInfo['package'])
57                                                self._install_App(app)
58                                                self.result['data'].append({'package':appInfo['package']})
59                                        if action=='remove':
60                                                self._log("Removing "+appInfo['package'])
61                                                self._remove_App(app)
62                                                self.result['data'].append({'package':appInfo['package']})
63                                        if action=='pkginfo':
64                                                self.result['data'].append(self._get_App_Extended_Info(appInfo,app))
65                                self.progress=self.progress+(self.partialProgress/self.count)
66                self.progress=100
67                return(self.result)
68        #def execute_action
69
70        def _set_status(self,status,msg=''):
71                self.result['status']={'status':status,'msg':msg}
72
73        def _fake_callback(self,status,typ,data=None):
74                pass
75        #def _fake_callback
76
77        def _callback(self,status,typ,data=None):
78                self.partialProgress=status.props.percentage
79                self.progress=self.partialProgress/self.count
80        #def _callback
81
82        def _install_App(self,app):
83                self.return_msg=False
84                self._debug("Installing "+app.get_id())
85                err=0
86                try:
87                        self.installer.install_packages(True,[app.get_id(),],None,self._callback,None)
88                        err=0
89                except Exception as e:
90                        print(str(e))
91                        self._debug("Install error: "+str(e.code))
92                        err=e.code
93                finally:
94                        self.partialProgress=100
95                self._set_status(err)
96                return err
97        #def _install_App_from_Repo
98                       
99        def _remove_App(self,app):
100                try:
101                        self.installer.remove_packages(True,[app.get_id(),],True,False,None,self._callback,None)
102                        self._set_status(0)
103                except Exception as e:
104                        self._debug("Remove error: " +str(e.code))
105                        self._debug("Remove error: " +str(e))
106                        self._set_status(e.code)
107                finally:
108                        self.partialProgress=100
109        #def _remove_App
110
111        def _get_App_Extended_Info(self,appInfo,app):
112                self._debug("Getting dependencies for "+app.get_id())
113                pkTask=packagekit.Task()
114                results=[]
115                dependsList=[]
116                self._set_status(0)
117                try:
118                        results=pkTask.get_depends(1,[app.get_id(),],True,None,self._fake_callback,None)
119                except Exception as e:
120                        self._set_status(1)
121                        print (str(e))
122                        pass
123                if (results):
124                        appID=app.get_id()
125                        appInfo['version']=app.get_version()
126                        appInfo['arch']=appID.split(';')[2]
127                        for related_app in results.get_package_array():
128                                dependsList.append(related_app.get_id())
129                        appInfo['depends']=dependsList
130                        #app.get_version()
131                try:
132                        results=pkTask.get_details([app.get_id(),],None,self._fake_callback,None)
133                except Exception as e:
134                        self._set_status(1)
135                        print (str(e))
136                        pass
137                if(results):
138                        for app_detail in results.get_details_array():
139                                appInfo['size']=str(app_detail.get_size())
140                                break
141                               
142                return(appInfo)
143        #def _get_App_Extended_Info
144
145        def _get_App_Info(self,appInfo,app,appsCount=0): #DEPRECATED
146                try:
147                        info=app.get_info()
148                        appInfo['status']=info.to_string(info)
149                        self._debug("Status: "+appInfo['status'])
150                except:
151                        self._debug("Status: not available")
152                        pass
153                #Only search dependencies if there's only one package on the package queue
154                if appsCount==1:
155                        self._debug("loading extended info")
156                        appInfo=self._get_App_Extended_Info(appInfo,app)
157                self.partialProgress=100
158                self.result.append(appInfo)
159#               self.result['data'].update({appInfo['package']:appInfo})
160                self._set_status(0)
161                return(appInfo)
162        #def _get_App_Info
163
164        def _resolve_App(self,appName,filters=False):
165                self._debug("Resolving "+appName)
166                app=None
167                applist=[]
168                self.return_msg=False
169                if not filters:
170                        filters=1
171                try:
172                        self._debug("Filter for resolver: "+str(filters))
173                        result=self.installer.resolve(filters,[appName,],None,self._fake_callback, None)
174                        applist=result.get_package_array()
175                        resolvedApp=applist[0]
176                        #resolver bug: filters not work so if we want to remove an app first we must get the installed version...
177                        if filters==2:
178                                for app in applist:
179                                        if (str(app.get_info()).find('PK_INFO_ENUM_INSTALLED')!=-1):
180                                                resolvedApp=app
181                        if resolvedApp:
182                                self._debug("Application "+resolvedApp.get_name()+" resolved succesfully")
183                                app=resolvedApp
184                except Exception as e:
185                        self._debug("Couldn't resolve "+appName)
186                        self._debug("Reason: "+str(e))
187                finally:
188                        self.partialProgress=100
189                return(app)
190        #def _resolve_App
191       
Note: See TracBrowser for help on using the repository browser.