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

Last change on this file since 4803 was 4803, checked in by Juanma, 3 years ago
  • loadStore: Catch filenotfound when executing lliurex-version
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.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                applist=[]
63                for desktopFile in os.listdir(desktopDir):
64                        if desktopFile.endswith('desktop'):
65                                a=appstream.App()
66                                try:
67                                        a.parse_file(desktopDir+'/'+desktopFile,16)
68                                        a.set_priority(0)
69                                        for veto in a.get_vetos():
70                                                a.remove_veto(veto)
71                                        store.add_app(a)
72                                        self._debug("Adding app from desktop "+desktopFile)
73                                except:
74                                        pass
75                return(store)
76        #def _parse_desktop
77
78        def _sanitize_store(self,store):
79                applist=store.get_apps()
80                uniqDict={}
81                lliurexApps={}
82                for app in applist:
83                        #Zomandos get max priority
84                        if app.has_category('zomando'):
85                                self._debug("Prioritize zmd "+str(app.get_id()))
86                                app.set_priority(400)
87                                lliurexApps.update({app.get_id_filename():app})
88                        #Prioritize Lliurex apps
89                        elif app.has_category('Lliurex'):
90                                self._debug("Prioritize app "+str(app.get_id()))
91                                app.set_priority(200)
92                                lliurexApps.update({app.get_id_filename():app})
93                        elif str(app.get_origin()).find('lliurex')>=0:
94                                self._debug("Prioritize app "+app.get_id())
95                                app.set_priority(100)
96                                lliurexApps.update({app.get_id_filename():app})
97                        else:
98                                app.set_priority(0)
99                                if app.get_id_filename() in lliurexApps.keys():
100#                                       app.set_merge_kind(appstream.AppMergeKind.APPEND)
101                                        self._debug("Mergin app "+str(app.get_id())+" as is in Lliurex")
102#                                       app.set_id(lliurexApps[app.get_id_filename()])
103                                        lliurexApps[app.get_id_filename()].subsume_full(app,appstream.AppSubsumeFlags.BOTH_WAYS)
104                                        store.remove_app(app)
105                        #Remove apps whitout pkgname
106                        if not app.get_pkgnames():
107                                store.remove_app(app)
108                        #Remove add-on apps (as are included in the main packages)
109                        if app.get_kind()==appstream.AppKind.ADDON:
110                                self._debug("Removed addon "+str(app.get_pkgnames()))
111                                store.remove_app(app)
112                        #Remove duplicated apps
113                        #Unlike gnome-store we'll try to compare the info of the package in order of discard only the "part-of" packages
114                        pkg=app.get_pkgname_default()
115                        if pkg in uniqDict.keys():
116                                fn=app.get_id_no_prefix()
117                                self._debug("Comparing "+fn+" with "+uniqDict[pkg]['fn'])
118                                if fn != uniqDict[pkg]['fn']:
119                                        if fn != pkg:
120                                                self._debug("Removed duplicated "+app.get_id())
121                                                store.remove_app(app)
122                                        else:
123                                                self._debug("Removed duplicated "+uniqDict[pkg]['app'].get_id())
124                                                uniqDict.update({pkg:{'fn':app.get_id_no_prefix(),'app':app}})
125                                                store.remove_app(uniqDict[pkg]['app'])
126                        elif pkg:
127                                uniqDict.update({pkg:{'fn':app.get_id_filename(),'app':app}})
128
129                #Check the blacklist
130                store=self._apply_blacklist(store)
131                return (store)
132        #def _sanitize_store
133
134        def _apply_blacklist(self,store):
135                try:
136                        flavour=subprocess.check_output(["lliurex-version","-f"]).rstrip()
137                        flavour=flavour.decode("utf-8")
138                        if flavour=='None':
139                                self._debug("Unknown flavour. Switching to desktop")
140                                flavour='desktop'
141                except (subprocess.CalledProcessError,FileNotFoundError) as e:
142                                self._debug("Running on a non Lliurex host")
143                                flavour='desktop'
144                try:
145                        if os.path.isfile('/usr/share/lliurex-store/files/blacklist.json'):
146                                blFile=open('/usr/share/lliurex-store/files/blacklist.json').read()
147                                blacklist=json.loads(blFile)
148                                if flavour in blacklist:
149                                        blApps=blacklist[flavour]
150                                if "all" in blacklist:
151                                        blApps.extend(blacklist["all"])
152                                blRegEx=[]
153                                for blApp in blApps:
154                                        self._debug("Blacklisted app: "+blApp)
155                                        resultRe=re.search('([^a-zA-Z0-9_-])',blApp)
156#                                       if blApp[-1]!='*':
157                                        if resultRe:
158                                                if blApp[0]=='*':
159                                                        blApp='.'+blApp
160                                                blRegEx.append("("+blApp+")")
161                                        else:
162                                                app=store.get_app_by_pkgname(blApp)
163                                                if app:
164                                                        self._debug("Removed "+str(app))
165                                                        store.remove_app(app)
166                                                else:
167                                                        self._debug("App "+blApp+" from blacklist not found in store. Assigned to RE blacklist")
168                                                        blRegEx.append("("+blApp+")")
169                                if blRegEx:
170                                        self._debug("Attempting to remove apps by RE match")
171                                        for app in store.get_apps():
172                                                for blApp in blRegEx:
173                                                        resultRe=re.search(blApp,app.get_id())
174                                                        if resultRe:
175#                                                       if blApp.lower() in app.get_id_filename().lower():
176                                                                store.remove_app(app)
177                                                                self._debug("Removed "+str(app.get_id()) +" as matches with "+blApp)
178                        else:
179                                self._debug('No blacklist to check')
180                except Exception as e:
181                        self._debug("Error processing blacklist: "+str(e))
182                finally:
183                        return(store)
184        #def _apply_blacklist
185
Note: See TracBrowser for help on using the repository browser.