Changeset 5187


Ignore:
Timestamp:
Jun 15, 2017, 4:28:57 PM (18 months ago)
Author:
Juanma
Message:

added appImage catalogue download

Location:
lliurex-store/trunk/fuentes
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • lliurex-store/trunk/fuentes/lliurex-store-cli/usr/share/lliurex-store/lliurex-store-cli.py

    r4426 r5187  
    114114        actions=[]
    115115        parms={}
     116        dbg=0
     117        bundles=0
    116118        args=process_Args(sys.argv)
    117119        if 'debug' in args:
     
    119121        else:
    120122                dbg=None
    121 #       dbg=1
    122         store=storeManager.StoreManager(dbg)
     123        dbg=0
     124        if args.bundles:
     125                bundles=1
     126        store=storeManager.StoreManager([bundles,dbg])
    123127
    124128        '''     if args.debug:
     
    144148#               actions.append('list_sections')
    145149#               parms['list_sections']=args.list_sections
    146        
     150        if args.bundles:       
     151                store.execute_action('load','appimage')
     152
    147153        actionList={'search':False,'info':False,'pkgInfo':False,'install':False,'remove':False,'list':False,'list-sections':False}
    148154        start_time=time.time()
     
    173179                                        print (CURSOR_UP + ERASE_LINE)
    174180                                        actionList[key]=print_results(key)
     181#       print("Checking progress for ")
    175182        print_results()
    176183
     
    184191        parser.add_argument('--remove',metavar='Package',help=(_(u"Remove a package")))
    185192#       parser.add_argument('--debug',action='store_true',help=(_(u"Prints debug information")))
     193        parser.add_argument('--bundles',action='store_true',help=(_(u"Load app bundles catalog")))
    186194
    187195        args=parser.parse_args()
  • lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/appImageManager.py

    r5133 r5187  
    55import os
    66from subprocess import call
     7import sys
     8import threading
     9from bs4 import BeautifulSoup
     10import random
     11import time
    712class appimagemanager:
    813        def __init__(self):
     
    1318                #action=example
    1419                #package='*' (in this case all packages)
    15                 self.pluginInfo={'install':'appimage','remove':'appimage','pkginfo':'appimage'}
     20                self.pluginInfo={'install':'appimage','remove':'appimage','pkginfo':'appimage','loadCatalogue':'appimage'}
    1621                self.result={}
    1722                self.result['data']={}
     
    3540                return(self.pluginInfo)
    3641
    37         def execute_action(self,action,applist):
     42        def execute_action(self,action,applist=None):
    3843                self.progress=0
    3944                self.result['status']={'status':-1,'msg':''}
    4045                self.result['data']=''
    4146                dataList=[]
    42                 for appInfo in applist:
    43                         if action=='install':
    44                                 dataList.append(self._install_appImg(appInfo))
    45                         if action=='remove':
    46                                 dataList.append(self._remove_appImg(appInfo))
    47                         if action=='pkginfo':
    48                                 dataList.append(self._get_info(appInfo))
     47                if action=='loadCatalogue':
     48                        dataList.append(self._download_appImg_catalogue())
     49                else:
     50                        for appInfo in applist:
     51                                if action=='install':
     52                                        dataList.append(self._install_appImg(appInfo))
     53                                if action=='remove':
     54                                        dataList.append(self._remove_appImg(appInfo))
     55                                if action=='pkginfo':
     56                                        dataList.append(self._get_info(appInfo))
    4957                self.result['data']=list(dataList)
    5058                self.progress=100
     
    146154                return(appInfo)
    147155        #def _get_info
     156
     157        def _download_appImg_catalogue(self):
     158                outfile='appimage.yml'
     159                outdir="/usr/share/metainfo"
     160                outdir="/tmp"
     161                content=''
     162                applist=[]
     163                repolist=['https://dl.bintray.com/probono/AppImages']
     164                self.descDict={}
     165                for repo in repolist:
     166                        self._debug(("Fetching repo %s")%(repo))
     167                        applist=self._generate_applist(self._fetch_repo(repo))
     168                        self._debug("Processing info...")
     169                        self._th_generate_xml_catalog(applist,outdir)
     170                        self._debug("Fetched repo "+repo)
     171                self._debug("Setting status to 0")
     172                self._set_status(0)
     173                return("Repo fetched")
     174
     175        def _fetch_repo(self,repo):
     176            with urllib.request.urlopen('https://dl.bintray.com/probono/AppImages') as f:
     177                content=(f.read().decode('utf-8'))
     178            return(content)
     179
     180        def _generate_applist(self,content):
     181                garbageList=[]
     182                applist=[]
     183                garbageList=content.split(' ')
     184                for garbageLine in garbageList:
     185                        if garbageLine.endswith('AppImage"'):
     186                                app=garbageLine.replace('href=":','')
     187                                applist.append(app.replace('"',''))
     188                return(applist)
     189
     190        def _get_description(self,appName):
     191                desc=''
     192                self._debug("Getting description from 'https://bintray.com/probono/AppImages/'"+appName)
     193                try:
     194                        with urllib.request.urlopen('https://bintray.com/probono/AppImages/'+appName) as f:
     195                                content=(f.read().decode('utf-8'))
     196                                soup=BeautifulSoup(content,"html.parser")
     197                                descDiv=soup.findAll('div', attrs={ "class" : "description-text"})
     198                        if len(descDiv)>0:
     199                                desc=descDiv[0].text
     200                                desc=desc.replace(':','.')
     201                                desc=desc.replace('&','&')
     202                except:
     203                        pass
     204                return(desc)
     205
     206        def _th_generate_xml_catalog(self,applist,outdir):
     207                oldName=''
     208                oldDesc=''
     209                maxconnections = 10
     210                semaphore = threading.BoundedSemaphore(value=maxconnections)
     211                randomList = list(applist)
     212                random.shuffle(randomList)
     213                lenAppList=len(randomList)
     214                self.progress=25
     215                for app in randomList:
     216                        th=threading.Thread(target=self._th_write_xml, args = (app,outdir,semaphore))
     217                        th.start()
     218                        self._callback(1,len(randomList))
     219                while (len(threading.enumerate())>3):
     220                        self._callback()
     221                        time.sleep(0.5)
     222
     223        def _th_write_xml(self,app,outdir,semaphore):
     224            semaphore.acquire()
     225            lock=threading.Lock()
     226            self._debug("Generating "+app+" xml")
     227            nameSplitted=app.split('-')
     228            name=nameSplitted[0]
     229            version=nameSplitted[1]
     230            arch=nameSplitted[2]
     231            f=open(outdir+'/'+name+"_"+version+".appdata.xml",'w')
     232            f.write('<?xml version="1.0" encoding="UTF-8"?>'+"\n")
     233            f.write("<components version=\"0.10\">\n")
     234            f.write("<component  type=\"desktop-application\">\n")
     235            f.write("  <id>"+app.lower()+"</id>\n")
     236            f.write("  <pkgname>"+app+"</pkgname>\n")
     237            f.write("  <name>"+name+"</name>\n")
     238            f.write("  <summary>"+name+" AppImage Bundle</summary>\n")
     239            f.write("  <metadata_license>CC0-1.0</metadata_license>\n")
     240            f.write("  <provides><binary>"+app+"</binary></provides>\n")
     241            f.write("  <releases>\n")
     242            f.write("  <release version=\""+version+"\" timestamp=\"1408573857\"></release>\n")
     243            f.write("  </releases>\n")
     244            f.write("  <launchable type=\"desktop-id\">"+name+".desktop</launchable>\n")
     245            with lock:
     246                if name in self.descDict.keys():
     247                    description=self.descDict[name]
     248                else:
     249                    description=self._get_description(name)
     250                    self.descDict.update({name:description})
     251            f.write("  <description><p>This is an AppImage bundle of app "+name+". It hasn't been tested by our developers and comes from a 3rd party dev team. Please use it carefully.</p><p>"+description+"</p></description>\n")
     252            f.write("  <bundle type=\"appimage\">"+app+"</bundle>\n")
     253            f.write("  <keywords>\n")
     254            f.write("    <keyword>"+name+"</keyword>\n")
     255            f.write("    <keyword>appimage</keyword>\n")
     256            f.write("  </keywords>\n")
     257            f.write("  <categories>\n")
     258            f.write("    <category>AppImage</category>\n")
     259            f.write("    <category>GTK</category>\n")
     260            f.write("  </categories>\n")
     261            f.write("<icon type=\"cached\">"+name+"_"+name+".png</icon>\n")
     262            f.write("</component>\n")
     263            f.write("</components>\n")
     264            f.close()
     265            semaphore.release()
  • lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/debManager.py

    r4935 r5187  
    3939
    4040        def execute_action(self,action,applist):
     41                self._debug("Applist: "+str(applist))
    4142                self.progress=0
    4243                self.installer=packagekit.Client()
     
    6364                                                self.result['data'].append({'package':appInfo['package']})
    6465                                        if action=='pkginfo':
     66                                                self._log("Looking "+appInfo['package'])
    6567                                                self.result['data'].append(self._get_App_Extended_Info(appInfo,app))
    6668                                self.progress=self.progress+(self.partialProgress/self.count)
     
    123125                        pass
    124126                if (results):
    125                         appID=app.get_id()
    126127                        appInfo['version']=app.get_version()
    127                         appInfo['arch']=appID.split(';')[2]
     128                        appInfo['arch']=app.get_id().split(';')[2]
    128129                        for related_app in results.get_package_array():
    129130                                dependsList.append(related_app.get_id())
     
    173174                self._debug("Resolving "+appName)
    174175                app=None
    175                 applist=[]
     176                resolvelist=[]
    176177                self.return_msg=False
    177178                if not filters:
     
    180181                        self._debug("Filter for resolver: "+str(filters))
    181182                        result=self.installer.resolve(filters,[appName,],None,self._fake_callback, None)
    182                         applist=result.get_package_array()
    183                         resolvedApp=applist[0]
     183                        resolvelist=result.get_package_array()
     184                        resolvedApp=resolvelist[0]
    184185                        #resolver bug: filters not work so if we want to remove an app first we must get the installed version...
    185186                        if filters==2:
    186                                 for app in applist:
     187                                for app in resolvelist:
    187188                                        if (str(app.get_info()).find('PK_INFO_ENUM_INSTALLED')!=-1):
    188189                                                resolvedApp=app
  • lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/loadStore.py

    r5133 r5187  
    6666        def load_appImg_catalog(self,store):
    6767                iconPath='/usr/share/icons/hicolor/128x128'
    68                 lliurex_dir="/home/juanma/svn/xenial/devtools/appImgdep11/dep11"
     68#               lliurex_dir="/home/juanma/svn/xenial/devtools/appImgdep11/dep11"
     69                lliurex_dir="/tmp"
    6970                if os.path.exists(lliurex_dir):
    7071                        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))
     72                                if lliurex.endswith('appdata.xml'):
     73                                        storePath=Gio.File.new_for_path(lliurex_dir+'/'+lliurex)
     74                                        self._debug("Adding file "+lliurex_dir+'/'+lliurex)
     75                                        try:
     76                                                store.from_file(storePath,iconPath,None)
     77                                        except Exception as e:
     78                                                self._debug("Couldn't add file "+lliurex+" to store")
     79                                                self._debug("Reason: "+str(e))
    7880                return(store)
    7981
  • lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/storeManager.py

    r5133 r5187  
    3030                self.loadBundles=False
    3131                self.dbg=0
    32                 if args:
     32                if args[0]==1:
     33                        self.loadBundles=True
     34                if args[1]==1:
    3335                        self.dbg=args
    3436                self.threads={}                         #Dict that stores the functions that must execute each action
     
    3840                self.registerProcessProgress={}         #Dict that stores the progress for each function/parentAction pair
    3941                self.progressActions={}                 #Progress of global actions based on average progress of individual processes
     42                self.extraActions={}            #Dict that have the actions managed by plugins and no defined on the main class as relatedActions
    4043                self.result={}                          #Result of the actions
    4144                self.lock=threading.Lock()              #locker for functions related to threads (get_progress, is_action_running...)
     
    123126                if self.is_action_running('load'):
    124127                        self._join_action('load')
     128                sw_withoutStatus=False
     129                if action not in self.threads.keys():
     130                        #Attempt to add a new action managed by a plugin
     131                        self._debug("Attempting to find a plugin for action "+action)
     132                        if action in self.registeredPlugins.keys():
     133                                for packageType,plugin in self.registeredPlugins[action].items():
     134                                        self.progressActions[action]=0
     135                                        self.threads[action]='threading.Thread(target=self._execute_class_method(action,packageType,action).execute_action,args=[action])'
     136                                        break
     137                                self._debug('Plugin for '+action+' found: '+str(self.registeredPlugins[action]))
     138                                self.relatedActions.update({action:[action]})
     139                                sw_withoutStatus=True
    125140                if action in self.threads.keys():
    126141                        if self.is_action_running(action):
     
    135150                                self.threadsRunning[action].start()
    136151                                self.result[action]={}
    137                                 self.result[action]['status']={'status':-1,'msg':''}
     152                                if sw_withoutStatus:
     153                                        self.result[action]['status']={'status':0,'msg':''}
     154                                        self.extraActions.update({action:1})
     155                                else:
     156                                        self.result[action]['status']={'status':-1,'msg':''}
    138157                                self._debug("Thread "+str(self.threadsRunning[action])+" for action "+action+" launched")
    139158
     
    262281#                                               self._debug(str(len(self.threadsProgress[parentAction]))+" Threads for action "+parentAction+": "+str(self.threadsProgress[parentAction]))
    263282                                                acumProgress=0
    264                                                 for threadfunction in self.threadsProgress[parentAction]:
    265                                                         function=self.threadsProgress[parentAction][threadfunction]
     283                                                for threadfunction,function in self.threadsProgress[parentAction].items():
     284#                                                       function=self.threadsProgress[parentAction][threadfunction]
    266285#                                                       self._debug(str(function)+" "+ str(threadfunction) + " "+parentAction)
    267286                                                        acumProgress=acumProgress+function.progress
     
    311330                                        result[action]=[]
    312331                self.lock.release()
     332                if action in self.extraActions.keys():
     333                        self._load_Store()
    313334                return(result)
    314335        #def get_result
     
    350371        def _load_Store(self):
    351372                action='load'
     373                if self.loadBundles:
     374                        function=self._execute_class_method('loadCatalogue','appimage')
     375                        function.execute_action('loadCatalogue')
    352376                loadFunction=self._execute_class_method(action)
    353377                self.store=loadFunction.execute_action(action,self.store,self.loadBundles)
     
    400424                                pkgInfoFunction=self._execute_class_method(action,package_type,launchedby)
    401425#                               result.update(pkgInfoFunction.execute_action(action,typeDict[package_type]))
    402                                 result['data'].extend(pkgInfoFunction.execute_action(action,typeDict[package_type])['data'])
    403                                 result['status']=pkgInfoFunction.execute_action(action,typeDict[package_type])['status']
     426#                               result['data'].extend(pkgInfoFunction.execute_action(action,typeDict[package_type])['data'])
     427#                               result['status']=pkgInfoFunction.execute_action(action,typeDict[package_type])['status']
     428                                result=pkgInfoFunction.execute_action(action,typeDict[package_type])
    404429                        else:
    405430                                result['data'].append(appInfo)
Note: See TracChangeset for help on using the changeset viewer.