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

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

Added regex for gva to blacklist

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