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

Last change on this file since 4962 was 4962, checked in by Juanma, 2 years ago

remove duplicated debs when there's a zmd managing the deb installation

File size: 6.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.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                zmdList=[]
84                for app in applist:
85                        #Zomandos get max priority
86                        if app.has_category('Zomando'):
87                                self._debug("Prioritize zmd "+str(app.get_id()))
88                                app.set_priority(400)
89                                lliurexApps.update({app.get_id_filename():app})
90                                id=str(app.get_id_filename()).replace('zero-lliurex-','')
91                                zmdList.append(id)
92                        #Prioritize Lliurex apps
93                        elif app.has_category('Lliurex'):
94                                self._debug("Prioritize app "+str(app.get_id()))
95                                app.set_priority(200)
96                                lliurexApps.update({app.get_id_filename():app})
97                        elif str(app.get_origin()).find('lliurex')>=0:
98                                self._debug("Prioritize app "+app.get_id())
99                                app.set_priority(100)
100                                lliurexApps.update({app.get_id_filename():app})
101                        else:
102                                app.set_priority(0)
103                                if app.get_id_filename() in lliurexApps.keys():
104#                                       app.set_merge_kind(appstream.AppMergeKind.APPEND)
105                                        self._debug("Mergin app "+str(app.get_id())+" as is in Lliurex")
106#                                       app.set_id(lliurexApps[app.get_id_filename()])
107                                        lliurexApps[app.get_id_filename()].subsume_full(app,appstream.AppSubsumeFlags.BOTH_WAYS)
108                                        store.remove_app(app)
109                        #Remove apps whitout pkgname
110                        if not app.get_pkgnames():
111                                store.remove_app(app)
112                        #Remove add-on apps (as are included in the main packages)
113                        if app.get_kind()==appstream.AppKind.ADDON:
114                                self._debug("Removed addon "+str(app.get_pkgnames()))
115                                store.remove_app(app)
116                        #Remove duplicated apps
117                        #Unlike gnome-store we'll try to compare the info of the package in order of discard only the "part-of" packages
118                        pkg=app.get_pkgname_default()
119                        if pkg in uniqDict.keys():
120                                fn=app.get_id_no_prefix()
121                                self._debug("Comparing "+fn+" with "+uniqDict[pkg]['fn'])
122                                if fn != uniqDict[pkg]['fn']:
123                                        if fn != pkg:
124                                                self._debug("Removed duplicated "+app.get_id())
125                                                store.remove_app(app)
126                                        else:
127                                                self._debug("Removed duplicated "+uniqDict[pkg]['app'].get_id())
128                                                uniqDict.update({pkg:{'fn':app.get_id_no_prefix(),'app':app}})
129                                                store.remove_app(uniqDict[pkg]['app'])
130                        elif pkg:
131                                self._debug("Adding "+app.get_id_filename()+" to uniq dict")
132                                uniqDict.update({pkg:{'fn':app.get_id_filename(),'app':app}})
133                #Delete zomando-related debs
134                store=self._purge_zomandos(zmdList,store)
135                #Check the blacklist
136                store=self._apply_blacklist(store)
137                return (store)
138        #def _sanitize_store
139
140        def _purge_zomandos(self,zmdList,store):
141                for appId in zmdList:
142                        self._debug("Searching debs related to "+appId)
143                        purgeList=store.get_apps_by_id(appId)
144                        purgeList.extend(store.get_apps_by_id(appId+".desktop"))
145                        for purgeApp in purgeList:
146                                if purgeApp:
147                                        if not purgeApp.has_category('Zomando'):
148                                                self._debug("Removed related zomando app "+str(purgeApp.get_categories()))
149                                                store.remove_app(purgeApp)
150                return(store)
151        #def _purge_zomandos
152
153        def _apply_blacklist(self,store):
154                try:
155                        flavour=subprocess.check_output(["lliurex-version","-f"]).rstrip()
156                        flavour=flavour.decode("utf-8")
157                        if flavour=='None':
158                                self._debug("Unknown flavour. Switching to desktop")
159                                flavour='desktop'
160                except (subprocess.CalledProcessError,FileNotFoundError) as e:
161                                self._debug("Running on a non Lliurex host")
162                                flavour='desktop'
163                try:
164                        if os.path.isfile('/usr/share/lliurex-store/files/blacklist.json'):
165                                blFile=open('/usr/share/lliurex-store/files/blacklist.json').read()
166                                blacklist=json.loads(blFile)
167                                if flavour in blacklist:
168                                        blApps=blacklist[flavour]
169                                if "all" in blacklist:
170                                        blApps.extend(blacklist["all"])
171                                blRegEx=[]
172                                for blApp in blApps:
173                                        self._debug("Blacklisted app: "+blApp)
174                                        resultRe=re.search('([^a-zA-Z0-9_-])',blApp)
175#                                       if blApp[-1]!='*':
176                                        if resultRe:
177                                                if blApp[0]=='*':
178                                                        blApp='.'+blApp
179                                                blRegEx.append("("+blApp+")")
180                                        else:
181                                                app=store.get_app_by_pkgname(blApp)
182                                                if app:
183                                                        self._debug("Removed "+str(app))
184                                                        store.remove_app(app)
185                                                else:
186                                                        self._debug("App "+blApp+" from blacklist not found in store. Assigned to RE blacklist")
187                                                        blRegEx.append("("+blApp+")")
188                                if blRegEx:
189                                        self._debug("Attempting to remove apps by RE match")
190                                        for app in store.get_apps():
191                                                for blApp in blRegEx:
192                                                        resultRe=re.search(blApp,app.get_id())
193                                                        if resultRe:
194#                                                       if blApp.lower() in app.get_id_filename().lower():
195                                                                store.remove_app(app)
196                                                                self._debug("Removed "+str(app.get_id()) +" as matches with "+blApp)
197                        else:
198                                self._debug('No blacklist to check')
199                except Exception as e:
200                        self._debug("Error processing blacklist: "+str(e))
201                finally:
202                        return(store)
203        #def _apply_blacklist
204
Note: See TracBrowser for help on using the repository browser.