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

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

ShManager? major update

File size: 5.1 KB
Line 
1import os
2import gi
3from gi.repository import Gio
4gi.require_version('AppStreamGlib', '1.0')
5from gi.repository import AppStreamGlib as appstream
6import subprocess
7import json
8
9class loadstore:
10        def __init__(self):
11                self.dbg=0
12                self.pluginInfo={'load':'*'}
13                self.store=''
14                self.progress=0
15                self.error=0
16        #def __init__
17
18        def set_debug(self,dbg='1'):
19                self.dbg=int(dbg)
20                self._debug ("Debug enabled")
21        #def set_debug
22
23        def _debug(self,msg=''):
24                if self.dbg==1:
25                        print ('DEBUG Load: '+str(msg))
26        #def _debug
27
28        def register(self):
29                return(self.pluginInfo)
30        #def register
31
32        def execute_action(self,action):
33                self.store=appstream.Store()
34                if action=='load':
35                        self._load_store(self.store)
36                self.progress=100
37                return (self.store)
38        #def execute_action
39
40        def get_error(self):
41                return (self.error)
42        #def get_error
43
44        def _load_store(self,store):
45                iconPath='/usr/share/icons/hicolor/128x128'
46                flags=[appstream.StoreLoadFlags.APP_INFO_SYSTEM,appstream.StoreLoadFlags.APP_INSTALL,appstream.StoreLoadFlags.APP_INFO_USER,appstream.StoreLoadFlags.DESKTOP,appstream.StoreLoadFlags.APPDATA,appstream.StoreLoadFlags.ALLOW_VETO]
47                for flag in flags:
48                        try:
49                                self._debug("Loading "+str(flag))
50                                store.load(flag)
51                        except:
52                                print ("Failed to load"+str(flag))
53                                pass
54                store=self._sanitize_store(store)
55                self.store=store
56                return(store)
57        #def load_store
58
59        def _parse_desktop(self,store): #DEPRECATED. Loads the apps from the available desktop files
60                desktopDir='/usr/share/applications'
61                return(store)
62                applist=[]
63                for app in store.get_apps():
64                        if os.path.isfile(desktopDir+'/'+app.get_id()):
65                                try:
66                                        app.parse_file(desktopDir+'/'+desktop,appstream.AppParseFlags.APPEND_DATA)
67                                        store.add_app(app)
68                                except Exception as e:
69                                        pass
70#                               for veto in app.get_vetos():
71#                                       app.remove_veto(veto)
72#                                       store.add_app(app)
73                return(store)
74        #def _parse_desktop
75
76        def _sanitize_store(self,store):
77                applist=store.get_apps()
78                uniqDict={}
79                lliurexApps={}
80                for app in applist:
81                        #Prioritize Lliurex apps
82                        if str(app.get_origin()).find('lliurex')>=0:
83                                self._debug("Prioritize app "+str(app.get_id()))
84                                app.set_priority(100)
85                                lliurexApps.update({app.get_id_filename():app})
86                        elif app.has_category('Lliurex'):
87                                self._debug("Prioritize app "+app.get_id())
88                                app.set_priority(100)
89                                lliurexApps.update({app.get_id_filename():app})
90                        else:
91                                app.set_priority(0)
92                                if app.get_id_filename() in lliurexApps.keys():
93#                                       app.set_merge_kind(appstream.AppMergeKind.APPEND)
94                                        self._debug("Mergin app "+str(app.get_id())+" as is in Lliurex")
95#                                       app.set_id(lliurexApps[app.get_id_filename()])
96                                        lliurexApps[app.get_id_filename()].subsume_full(app,appstream.AppSubsumeFlags.BOTH_WAYS)
97                                        store.remove_app(app)
98#                                       store.remove_app(app)
99                        #Remove apps whitout pkgname
100                        if not app.get_pkgnames():
101                                store.remove_app(app)
102                        #Remove add-on apps (as are included in the main packages)
103                        if app.get_kind()==appstream.AppKind.ADDON:
104                                self._debug("Removed addon "+str(app.get_pkgnames()))
105                                store.remove_app(app)
106                        #Remove duplicated apps
107                        #Unlike gnome-store we'll try to compare the info of the package in order of discard only the "part-of" packages
108                        pkg=app.get_pkgname_default()
109                        if pkg in uniqDict.keys():
110                                fn=app.get_id_no_prefix()
111                                self._debug("Comparing "+fn+" with "+uniqDict[pkg]['fn'])
112                                if fn != uniqDict[pkg]['fn']:
113                                        if fn != pkg:
114                                                self._debug("Removed duplicated "+app.get_id())
115                                                store.remove_app(app)
116                                        else:
117                                                self._debug("Removed duplicated "+uniqDict[pkg]['app'].get_id())
118                                                uniqDict.update({pkg:{'fn':app.get_id_no_prefix(),'app':app}})
119                                                store.remove_app(uniqDict[pkg]['app'])
120                        elif pkg:
121                                uniqDict.update({pkg:{'fn':app.get_id_filename(),'app':app}})
122
123                #Check the blacklist
124                store=self._apply_blacklist(store)
125                return (store)
126        #def _sanitize_store
127
128        def _apply_blacklist(self,store):
129                try:
130                        flavour=subprocess.check_output(["lliurex-version","-f"]).rstrip()
131                        flavour=flavour.decode("utf-8")
132                        if os.path.isfile('/usr/share/lliurex-store/files/blacklist.json'):
133                                blFile=open('/usr/share/lliurex-store/files/blacklist.json').read()
134                                blacklist=json.loads(blFile)
135                                blApps=blacklist[flavour]
136                                blRegEx=[]
137                                for blApp in blApps:
138                                        self._debug("Blacklisted app: "+blApp)
139                                        if blApp[-1]!='*':
140                                                app=store.get_app_by_pkgname(blApp)
141                                                if app:
142                                                        self._debug("Removed "+str(app))
143                                                        store.remove_app(app)
144                                                else:
145                                                        self._debug("App "+blApp+" from blacklist not found in store. Assigned to RE blacklist")
146                                                        blRegEx.append(blApp)
147                                        else:
148                                                        blRegEx.append(blApp[:-1])
149                                if blRegEx:
150                                        self._debug("Attempting to remove apps by RE match")
151                                        for app in store.get_apps():
152                                                for blApp in blRegEx:
153                                                        if blApp.lower() in app.get_id_filename().lower():
154                                                                store.remove_app(app)
155                                                                self._debug("Removed "+str(app.get_id()) +" as matches with "+blApp)
156                        else:
157                                self._debug('No blacklist to check')
158                except subprocess.CalledProcessError as e:
159                                self_debug("Running on a non Lliurex host")
160                except Exception as e:
161                        self._debug("Error processing blacklist: "+str(e))
162                finally:
163                        return(store)
164        #def _apply_blacklist
165
Note: See TracBrowser for help on using the repository browser.