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

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

added appImage plugin

File size: 7.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
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,store=None,loadBundles=False):
34                self.progress=0
35                if store:
36                        self.store=store
37                else:
38                        self.store=appstream.Store()
39                if action=='load':
40                        self._load_store(self.store,loadBundles)
41                self.progress=100
42                return (self.store)
43        #def execute_action
44
45        def get_error(self):
46                return (self.error)
47        #def get_error
48
49        def _load_store(self,store,loadBundles=False):
50                iconPath='/usr/share/icons/hicolor/128x128'
51                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]
52                for flag in flags:
53                        try:
54                                self._debug("Loading "+str(flag))
55                                store.load(flag)
56                        except:
57                                print ("Failed to load"+str(flag))
58                                pass
59                store=self._sanitize_store(store)
60                if loadBundles:
61                        store=self.load_appImg_catalog(store)
62                self.store=store
63                return(store)
64        #def load_store
65
66        def load_appImg_catalog(self,store):
67                iconPath='/usr/share/icons/hicolor/128x128'
68                lliurex_dir="/home/juanma/svn/xenial/devtools/appImgdep11/dep11"
69                if os.path.exists(lliurex_dir):
70                        for lliurex in os.listdir(lliurex_dir):
71                                storePath=Gio.File.new_for_path(lliurex_dir+'/'+lliurex)
72                                self._debug("Adding file "+lliurex_dir+'/'+lliurex)
73                                try:
74                                        store.from_file(storePath,iconPath,None)
75                                except Exception as e:
76                                        self._debug("Couldn't add file "+lliurex+" to store")
77                                        self._debug("Reason: "+str(e))
78                return(store)
79
80        #def load_appImg_catalog(self)
81
82        def _parse_desktop(self,store): #DEPRECATED. Loads the apps from the available desktop files
83                desktopDir='/usr/share/applications'
84                applist=[]
85                for desktopFile in os.listdir(desktopDir):
86                        if desktopFile.endswith('desktop'):
87                                a=appstream.App()
88                                try:
89                                        a.parse_file(desktopDir+'/'+desktopFile,16)
90                                        a.set_priority(0)
91                                        for veto in a.get_vetos():
92                                                a.remove_veto(veto)
93                                        store.add_app(a)
94                                        self._debug("Adding app from desktop "+desktopFile)
95                                except:
96                                        pass
97                return(store)
98        #def _parse_desktop
99
100        def _sanitize_store(self,store):
101                applist=store.get_apps()
102                uniqDict={}
103                lliurexApps={}
104                zmdList=[]
105                for app in applist:
106                        #Zomandos get max priority
107                        if app.has_category('Zomando'):
108                                self._debug("Prioritize zmd "+str(app.get_id()))
109                                app.set_priority(400)
110                                lliurexApps.update({app.get_id_filename():app})
111                                id=str(app.get_id_filename()).replace('zero-lliurex-','')
112                                zmdList.append(id)
113                        #Prioritize Lliurex apps
114                        elif app.has_category('Lliurex'):
115                                self._debug("Prioritize app "+str(app.get_id()))
116                                app.set_priority(200)
117                                lliurexApps.update({app.get_id_filename():app})
118                        elif str(app.get_origin()).find('lliurex')>=0:
119                                self._debug("Prioritize app "+app.get_id())
120                                app.set_priority(100)
121                                lliurexApps.update({app.get_id_filename():app})
122                        else:
123                                app.set_priority(0)
124                                if app.get_id_filename() in lliurexApps.keys():
125#                                       app.set_merge_kind(appstream.AppMergeKind.APPEND)
126                                        self._debug("Mergin app "+str(app.get_id())+" as is in Lliurex")
127#                                       app.set_id(lliurexApps[app.get_id_filename()])
128                                        lliurexApps[app.get_id_filename()].subsume_full(app,appstream.AppSubsumeFlags.BOTH_WAYS)
129                                        store.remove_app(app)
130                        #Remove apps whitout pkgname
131                        if not app.get_pkgnames():
132                                store.remove_app(app)
133                        #Remove add-on apps (as are included in the main packages)
134                        if app.get_kind()==appstream.AppKind.ADDON:
135                                self._debug("Removed addon "+str(app.get_pkgnames()))
136                                store.remove_app(app)
137                        #Remove duplicated apps
138                        #Unlike gnome-store we'll try to compare the info of the package in order of discard only the "part-of" packages
139                        pkg=app.get_pkgname_default()
140                        if pkg in uniqDict.keys():
141                                fn=app.get_id_no_prefix()
142                                self._debug("Comparing "+fn+" with "+uniqDict[pkg]['fn'])
143                                if fn != uniqDict[pkg]['fn']:
144                                        if fn != pkg:
145                                                self._debug("Removed duplicated "+app.get_id())
146                                                store.remove_app(app)
147                                        else:
148                                                self._debug("Removed duplicated "+uniqDict[pkg]['app'].get_id())
149                                                uniqDict.update({pkg:{'fn':app.get_id_no_prefix(),'app':app}})
150                                                store.remove_app(uniqDict[pkg]['app'])
151                        elif pkg:
152#                               self._debug("Adding "+app.get_id_filename()+" to uniq dict")
153                                uniqDict.update({pkg:{'fn':app.get_id_filename(),'app':app}})
154                #Delete zomando-related debs
155                store=self._purge_zomandos(zmdList,store)
156                #Check the blacklist
157                store=self._apply_blacklist(store)
158                return (store)
159        #def _sanitize_store
160
161        def _purge_zomandos(self,zmdList,store):
162                for appId in zmdList:
163                        self._debug("Searching debs related to "+appId)
164                        purgeList=store.get_apps_by_id(appId)
165                        purgeList.extend(store.get_apps_by_id(appId+".desktop"))
166                        for purgeApp in purgeList:
167                                if purgeApp:
168                                        if not purgeApp.has_category('Zomando'):
169                                                self._debug("Removed related zomando app "+str(purgeApp.get_id()))
170                                                store.remove_app(purgeApp)
171                return(store)
172        #def _purge_zomandos
173
174        def _apply_blacklist(self,store):
175                try:
176                        flavour=subprocess.check_output(["lliurex-version","-f"]).rstrip()
177                        flavour=flavour.decode("utf-8")
178                        if flavour=='None':
179                                self._debug("Unknown flavour. Switching to desktop")
180                                flavour='desktop'
181                except (subprocess.CalledProcessError,FileNotFoundError) as e:
182                                self._debug("Running on a non Lliurex host")
183                                flavour='desktop'
184                try:
185                        if os.path.isfile('/usr/share/lliurex-store/files/blacklist.json'):
186                                blFile=open('/usr/share/lliurex-store/files/blacklist.json').read()
187                                blacklist=json.loads(blFile)
188                                blApps=[]
189                                if flavour in blacklist:
190                                        blApps=blacklist[flavour]
191                                if "all" in blacklist:
192                                        blApps.extend(blacklist["all"])
193                                blRegEx=[]
194                                for blApp in blApps:
195                                        self._debug("Blacklisted app: "+blApp)
196                                        resultRe=re.search('([^a-zA-Z0-9_-])',blApp)
197#                                       if blApp[-1]!='*':
198                                        if resultRe:
199                                                if blApp[0]=='*':
200                                                        blApp='.'+blApp
201                                                blRegEx.append("("+blApp+")")
202                                        else:
203                                                app=store.get_app_by_pkgname(blApp)
204                                                if app:
205                                                        self._debug("Removed "+str(app))
206                                                        store.remove_app(app)
207                                                else:
208                                                        self._debug("App "+blApp+" from blacklist not found in store. Assigned to RE blacklist")
209                                                        blRegEx.append("("+blApp+")")
210                                if blRegEx:
211                                        self._debug("Attempting to remove apps by RE match")
212                                        for app in store.get_apps():
213                                                for blApp in blRegEx:
214                                                        resultRe=re.search(blApp,app.get_id())
215                                                        if resultRe:
216#                                                       if blApp.lower() in app.get_id_filename().lower():
217                                                                store.remove_app(app)
218                                                                self._debug("Removed "+str(app.get_id()) +" as matches with "+blApp)
219                        else:
220                                self._debug('No blacklist to check')
221                except Exception as e:
222                        self._debug("Error processing blacklist: "+str(e))
223                finally:
224                        return(store)
225        #def _apply_blacklist
226
Note: See TracBrowser for help on using the repository browser.