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

Last change on this file since 8084 was 8084, checked in by Juanma, 15 months ago

add new method to debManager

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