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

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

Plugins: Execute action initializes progress var

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