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

Last change on this file since 4447 was 4447, checked in by Juanma, 4 years ago

ShManager? minor bugfix

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                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                        #Prioritize Lliurex apps
84                        if str(app.get_origin()).find('lliurex')>=0:
85                                self._debug("Prioritize app "+str(app.get_id()))
86                                app.set_priority(100)
87                                lliurexApps.update({app.get_id_filename():app})
88                        elif app.has_category('Lliurex'):
89                                self._debug("Prioritize app "+app.get_id())
90                                app.set_priority(100)
91                                lliurexApps.update({app.get_id_filename():app})
92                        else:
93                                app.set_priority(10)
94                                if app.get_id_filename() in lliurexApps.keys():
95#                                       app.set_merge_kind(appstream.AppMergeKind.APPEND)
96                                        self._debug("Mergin app "+str(app.get_id())+" as is in Lliurex")
97#                                       app.set_id(lliurexApps[app.get_id_filename()])
98                                        lliurexApps[app.get_id_filename()].subsume_full(app,appstream.AppSubsumeFlags.BOTH_WAYS)
99                                        store.remove_app(app)
100#                                       store.remove_app(app)
101                        #Remove apps whitout pkgname
102                        if not app.get_pkgnames():
103                                store.remove_app(app)
104                        #Remove add-on apps (as are included in the main packages)
105                        if app.get_kind()==appstream.AppKind.ADDON:
106                                self._debug("Removed addon "+str(app.get_pkgnames()))
107                                store.remove_app(app)
108                        #Remove duplicated apps
109                        #Unlike gnome-store we'll try to compare the info of the package in order of discard only the "part-of" packages
110                        pkg=app.get_pkgname_default()
111                        if pkg in uniqDict.keys():
112                                fn=app.get_id_no_prefix()
113                                self._debug("Comparing "+fn+" with "+uniqDict[pkg]['fn'])
114                                if fn != uniqDict[pkg]['fn']:
115                                        if fn != pkg:
116                                                self._debug("Removed duplicated "+app.get_id())
117                                                store.remove_app(app)
118                                        else:
119                                                self._debug("Removed duplicated "+uniqDict[pkg]['app'].get_id())
120                                                uniqDict.update({pkg:{'fn':app.get_id_no_prefix(),'app':app}})
121                                                store.remove_app(uniqDict[pkg]['app'])
122                        elif pkg:
123                                uniqDict.update({pkg:{'fn':app.get_id_filename(),'app':app}})
124
125                #Check the blacklist
126                store=self._apply_blacklist(store)
127                return (store)
128        #def _sanitize_store
129
130        def _apply_blacklist(self,store):
131                try:
132                        flavour=subprocess.check_output(["lliurex-version","-f"]).rstrip()
133                        flavour=flavour.decode("utf-8")
134                        if flavour=='None':
135                                self._debug("Meta unavailable, assuming client")
136                                flavour='client'
137                except subprocess.CalledProcessError as e:
138                                self_debug("Running on a non Lliurex host")
139                                flavour='server'
140                try:
141                        if os.path.isfile('/usr/share/lliurex-store/files/blacklist.json'):
142                                blFile=open('/usr/share/lliurex-store/files/blacklist.json').read()
143                                blacklist=json.loads(blFile)
144                                blApps=blacklist[flavour]
145                                blRegEx=[]
146                                for blApp in blApps:
147                                        self._debug("Blacklisted app: "+blApp)
148                                        resultRe=re.search('([^a-zA-Z0-9_-])',blApp)
149#                                       if blApp[-1]!='*':
150                                        if resultRe:
151                                                if blApp[0]=='*':
152                                                        blApp='.'+blApp
153                                                blRegEx.append("("+blApp+")")
154                                        else:
155                                                app=store.get_app_by_pkgname(blApp)
156                                                if app:
157                                                        self._debug("Removed "+str(app))
158                                                        store.remove_app(app)
159                                                else:
160                                                        self._debug("App "+blApp+" from blacklist not found in store. Assigned to RE blacklist")
161                                                        blRegEx.append("("+blApp+")")
162                                if blRegEx:
163                                        self._debug("Attempting to remove apps by RE match")
164                                        for app in store.get_apps():
165                                                for blApp in blRegEx:
166                                                        resultRe=re.search(blApp,app.get_id())
167                                                        if resultRe:
168#                                                       if blApp.lower() in app.get_id_filename().lower():
169                                                                store.remove_app(app)
170                                                                self._debug("Removed "+str(app.get_id()) +" as matches with "+blApp)
171                        else:
172                                self._debug('No blacklist to check')
173                except Exception as e:
174                        self._debug("Error processing blacklist: "+str(e))
175                finally:
176                        return(store)
177        #def _apply_blacklist
178
Note: See TracBrowser for help on using the repository browser.