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

Last change on this file since 7432 was 7432, checked in by Juanma, 17 months ago

fix wrong update

File size: 7.8 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
9import urllib
10import random
11import threading
12import time
13import datetime
14import gettext
15from bs4 import BeautifulSoup
16
17class loadstore:
18        def __init__(self):
19                self.dbg=False
20                self.plugin_actions={'load':'*'}
21                self.store=''
22                self.progress=0
23                self.error=0
24#               self.zmd_store_dir='/var/lib/lliurexstore/zmds' #DEPRECATED
25                self.result={}
26                self.result['data']={}
27                self.result['status']={}
28        #def __init__
29
30        def set_debug(self,dbg=True):
31                self.dbg=dbg
32                self._debug ("Debug enabled")
33        #def set_debug
34
35        def _debug(self,msg=''):
36                if self.dbg:
37                        print ('DEBUG Load: %s'%msg)
38        #def _debug
39
40        def register(self):
41                return(self.plugin_actions)
42        #def register
43
44        def execute_action(self,action,store=None,loadBundles=False):
45                self.progress=0
46                if store:
47                        self.store=store
48                else:
49                        self.store=appstream.Store()
50                if action=='load':
51                        self._load_store(self.store)
52                if action=='load_bundles':
53                        self._load_store(self.store,loadBundles=True)
54                self.result['data']=self.store
55                self.progress=100
56                return(self.result)
57        #def execute_action
58
59        def get_error(self):
60                return (self.error)
61        #def get_error
62
63        def _load_store(self,store,loadBundles=False):
64                icon_dir='/usr/share/icons/hicolor/128x128'
65                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]
66                for flag in flags:
67                        try:
68                                self._debug("Loading "+str(flag))
69                                store.load(flag)
70                        except:
71                                print ("Failed to load"+str(flag))
72                                pass
73                #Zomandos are now available from appstream
74#               store=self.load_zmds_catalog(store)
75                store=self._sanitize_store(store)
76                self.store=store
77                return(store)
78        #def load_store
79
80        def load_zmds_catalog(self,store): #DEPRECATED
81                if os.path.exists(self.zmd_store_dir):
82                        store=self._generic_file_load(self.zmd_store_dir,store)
83                return(store)
84        #def load_zmds_catalog(self)
85
86        def _generic_file_load(self,target_dir,store):
87                icon_dir='/usr/share/icons/hicolor/128x128'
88                files=os.listdir(target_dir)
89                for target_file in os.listdir(target_dir):
90                        if target_file.endswith('appdata.xml'):
91                                store_file=Gio.File.new_for_path(target_dir+'/'+target_file)
92                                self._debug("Adding file %s/%s"%(target_dir,target_file))
93                                try:
94                                        store.from_file(store_file,icon_dir,None)
95                                except Exception as e:
96                                        self._debug("Couldn't add file %s to store"%target_file)
97                                        self._debug("Reason: %s"%e)
98                return(store)
99       
100        def _parse_desktop(self,store): #DEPRECATED. Loads the apps from the available desktop files
101                desktop_dir='/usr/share/applications'
102                applist=[]
103                for desktop_file in os.listdir(desktop_dir):
104                        if desktop_file.endswith('desktop'):
105                                a=appstream.App()
106                                try:
107                                        a.parse_file(desktop_dir+'/'+desktop_file,16)
108                                        a.set_priority(0)
109                                        for veto in a.get_vetos():
110                                                a.remove_veto(veto)
111                                        store.add_app(a)
112                                        self._debug("Adding app from desktop %s"%desktop_file)
113                                except:
114                                        pass
115                return(store)
116        #def _parse_desktop
117
118        def _sanitize_store(self,store):
119                applist=store.get_apps()
120                tmp_store_apps={}
121                lliurex_apps={}
122                zmd_apps=[]
123                for app in applist:
124                        #Zomandos get max priority
125                        if app.has_category('Zomando'):
126                                self._debug("Prioritize zmd %s"%app.get_id())
127                                app.set_priority(400)
128                                lliurex_apps.update({app.get_id_filename():app})
129                                id_app=str(app.get_id_filename()).replace('zero-lliurex-','')
130                                zmd_apps.append(id_app)
131                        #Prioritize Lliurex apps
132                        elif app.has_category('Lliurex'):
133                                self._debug("Prioritize app %s"%app.get_id())
134                                app.set_priority(200)
135                                lliurex_apps.update({app.get_id_filename():app})
136                        elif str(app.get_origin()).find('lliurex')>=0:
137                                self._debug("Prioritize app %s"%app.get_id())
138                                app.set_priority(100)
139                                lliurex_apps.update({app.get_id_filename():app})
140                        else:
141                                app.set_priority(0)
142                                if app.get_id_filename() in lliurex_apps.keys():
143                                        self._debug("Mergin app %s as is in LliureX"%app.get_id())
144                                        lliurex_apps[app.get_id_filename()].subsume_full(app,appstream.AppSubsumeFlags.BOTH_WAYS)
145#                                       store.add_app(lliurex_apps[app.get_id_filename()])
146                        #Remove apps whitout pkgname
147                        if not app.get_pkgnames():
148                                store.remove_app(app)
149                        #Remove add-on apps (as are included in the main packages)
150                        if app.get_kind()==appstream.AppKind.ADDON:
151                                self._debug("Removed addon %s"%app.get_pkgnames())
152                                store.remove_app(app)
153                        #Remove duplicated apps
154                        #Unlike gnome-store we'll try to compare the info of the package in order of discard only the "part-of" packages
155                        pkg=app.get_pkgname_default()
156                        if pkg in tmp_store_apps.keys():
157                                fn=app.get_id_no_prefix()
158                                self._debug("Comparing %s with %s"%(fn,tmp_store_apps[pkg]['fn']))
159                                if fn != tmp_store_apps[pkg]['fn']:
160                                        if fn != pkg and ".desktop" not in fn:
161                                                self._debug("Removed duplicated %s"%app.get_id())
162                                                store.remove_app(app)
163                                        else:
164                                                self._debug("Removed duplicated %s"%tmp_store_apps[pkg]['app'].get_id())
165                                                store.remove_app(tmp_store_apps[pkg]['app'])
166                                                tmp_store_apps.update({pkg:{'fn':app.get_id_no_prefix(),'app':app}})
167                        elif pkg:
168#                               self._debug("Adding "+app.get_id_filename()+" to uniq dict")
169                                tmp_store_apps.update({pkg:{'fn':app.get_id_filename(),'app':app}})
170                #Delete zomando-related debs
171                store=self._purge_zomandos(zmd_apps,store)
172                #Check the blacklist
173                store=self._apply_blacklist(store)
174                return (store)
175        #def _sanitize_store
176
177        def _purge_zomandos(self,zmd_apps,store):
178                for zmd_id in zmd_apps:
179                        self._debug("Searching debs related to %s"%zmd_id)
180                        purge_list=store.get_apps_by_id(zmd_id)
181                        purge_list.extend(store.get_apps_by_id(zmd_id+".desktop"))
182                        for purge_app in purge_list:
183                                if purge_app:
184                                        if not purge_app.has_category('Zomando'):
185                                                self._debug("Removed related zomando app %s"%purge_app.get_id())
186                                                store.remove_app(purge_app)
187                return(store)
188        #def _purge_zomandos
189
190        def _apply_blacklist(self,store):
191                try:
192                        flavour=subprocess.check_output(["lliurex-version","-f"]).rstrip()
193                        flavour=flavour.decode("utf-8")
194                        if flavour=='None':
195                                self._debug("Unknown flavour. Switching to desktop")
196                                flavour='desktop'
197                except (subprocess.CalledProcessError,FileNotFoundError) as e:
198                                self._debug("Running on a non Lliurex host")
199                                flavour='desktop'
200                try:
201                        if os.path.isfile('/usr/share/lliurex-store/files/blacklist.json'):
202                                blFile=open('/usr/share/lliurex-store/files/blacklist.json').read()
203                                blacklist=json.loads(blFile)
204                                blacklist_apps=[]
205                                if flavour in blacklist:
206                                        blacklist_apps=blacklist[flavour]
207                                if "all" in blacklist:
208                                        blacklist_apps.extend(blacklist["all"])
209                                blacklist_re=[]
210                                for blacklist_app in blacklist_apps:
211                                        self._debug("Blacklisted app: "+blacklist_app)
212                                        re_result=re.search('([^a-zA-Z0-9_-])',blacklist_app)
213                                        if re_result:
214                                                if blacklist_app[0]=='*':
215                                                        blacklist_app='.'+blacklist_app
216                                                blacklist_re.append("("+blacklist_app+")")
217                                        else:
218                                                app=store.get_app_by_pkgname(blacklist_app)
219                                                if app:
220                                                        self._debug("Removed "+str(app))
221                                                        store.remove_app(app)
222                                                else:
223                                                        self._debug("App %s from blacklist not found in store. Assigned to RE blacklist"%blacklist_app)
224                                                        blacklist_re.append("("+blacklist_app+")")
225                                if blacklist_re:
226                                        self._debug("Attempting to remove apps by RE match")
227                                        for app in store.get_apps():
228                                                for blacklist_app in blacklist_re:
229                                                        re_result=re.search(blacklist_app,app.get_id())
230                                                        if re_result:
231                                                                store.remove_app(app)
232                                                                self._debug("Removed %s as matches with %s"%(app.get_id(),blacklist_app))
233                        else:
234                                self._debug('No blacklist to check')
235                except Exception as e:
236                        self._debug("Error processing blacklist: %s"%e)
237                finally:
238                        return(store)
239        #def _apply_blacklist
240
Note: See TracBrowser for help on using the repository browser.