source: lliurex-store/trunk/fuentes/lliurex-store-cli/usr/share/lliurex-store/lliurex-store-cli.py

Last change on this file was 8223, checked in by Juanma, 15 months ago

Implemented cache

  • Property svn:executable set to *
File size: 6.8 KB
RevLine 
[3252]1#!/usr/bin/python3
[8182]2import sys,os,signal
[3252]3import argparse
[3277]4#sys.path.append('/usr/share/lliurex-store')
[3252]5#sys.path.append('/home/lliurex/lliurex-store/trunk/fuentes/lliurex-appstore.install/usr/share/lliurex-store')
[3277]6import lliurexstore.storeManager as storeManager
[3252]7import time
[4312]8import html2text
[4266]9import gettext
[8182]10import threading
[4328]11gettext.textdomain('python3-lliurex-store')
[4312]12_=gettext.gettext
[3252]13
[3653]14class color:
15   PURPLE = '\033[95m'
16   CYAN = '\033[96m'
17   DARKCYAN = '\033[36m'
18   BLUE = '\033[94m'
19   GREEN = '\033[92m'
20   YELLOW = '\033[93m'
21   RED = '\033[91m'
22   BOLD = '\033[1m'
23   UNDERLINE = '\033[4m'
24   END = '\033[0m'
25
[8182]26def signal_handler(*args):
27        if args[0]==17:
28                return
29        os.system('setterm -cursor on')
30        sys.exit(0)
31       
32
[3252]33def main():
34        def print_results(action=None):
35                printed=False
36                results=store.get_result(action)
[3653]37                status=store.get_status(action)
[6458]38                if not 'status' in status.keys():
39                        status['status']=1
40                        status['msg']='package not found'
[3678]41                processed=[]
[3646]42                print ("")
[3653]43                for action in results.keys():
[3252]44                        if action in actions and not actionList[action]:
[4020]45                                if status['status']==0:
[4278]46                                        print (_(u"Results for ")+_(action))
[3653]47                                        for data in results[action]:
[3656]48                                                if action=='info':
49                                                        try:
[7143]50                                                                print(color.DARKCYAN+_(u'Package')+': '+color.END + data['package'])
51                                                                print(_(u'Name')+': '+data['name'])
52                                                                print(_(u'ID')+': '+data['id'])
53                                                                print(_(u'Version')+': '+data['version'])
54                                                                print(_(u'Size')+': '+data['size'])
55                                                                print(_(u'License')+': '+data['license'])
[4372]56                                                                listCat=[]
57                                                                for cat in data['categories']:
58                                                                        listCat.append(_(cat))
[7143]59                                                                print(_(u'Categories')+': '+','.join(listCat))
[4272]60                                                                msg=''
61                                                                if data['state']=='installed':
62                                                                        msg=_('installed')
63                                                                else:
64                                                                        msg=_('available')
[6645]65                                                                if data['updatable']:
66                                                                        msg +=_(' (updatable)')
[7143]67                                                                print(_(u'Status')+': '+msg)
68                                                                print(_(u'Summary')+': '+data['summary'])
[4266]69                                                                desc=(html2text.html2text(data['description'],"lxml"))
[7143]70                                                                print(_(u'Description')+': '+desc)
[3656]71                                                                pkgString=[]
72                                                                for dependency in data['depends']:
73                                                                                pkgName=dependency.split(';')[0]
74                                                                                pkgString.append(pkgName)
[7143]75                                                                print(_(u'Depends')+': '+', '.join(pkgString))
[3656]76                                                                print("")
77                                                        except Exception as e:
[6645]78                                                                print("CLI: Error printing key %s"%e)
[3656]79                                                elif action=='search':
80                                                        #Only print name and summary
[8182]81                                                        data_id=''
[7075]82                                                        printcolor=color.DARKCYAN
[8182]83                                                        if data['bundle']:
[7075]84                                                                printcolor=color.PURPLE
85                                                        elif (data['package'] not in data['id'] or data['package'] in processed):
86                                                                data_id=" (%s)"%data['id']
[3678]87                                                        else:
88                                                                processed.append(data['package'])
[7075]89                                                        print("%s%s%s%s: %s"%(printcolor,data['package'],data_id,color.END,data['summary']))
[3678]90
[3653]91                                                elif action=='list':
92                                                        #Print package, summary and status
[3646]93                                                        try:
[3653]94                                                                if data['package']:
95                                                                        package=data['package']
96                                                                else:
97                                                                        package=data['name']
[4272]98                                                                if data['state']=='installed':
99                                                                        msg=_('installed')
100                                                                else:
101                                                                        msg=_('available')
102                                                                print(color.DARKCYAN+package+color.END+": "+data['summary']+' ('+','.join(data['categories'])+')'+' ('+msg+')')
[3653]103                                                        except Exception as e:
[4332]104                                                                print(_(u'Error listing')+ ':'+str(e))
[3646]105                                                                pass
[3653]106                                                elif action=='install':
[8182]107                                                                print(color.DARKCYAN+data['package']+color.END+" "+ _(u"installed")+" "+color.BOLD+ _(u"succesfully")+color.END)
[3656]108                                                elif action=='remove':
[8182]109                                                                print(color.DARKCYAN+data['package']+color.END+" "+ _(u"removed")+" "+color.BOLD+ _(u"succesfully")+color.END)
[3646]110                                                else:
[7471]111                                                        print("RESULT:\n%s"%data)
[3653]112                                else:
[4278]113                                        msg=_(u"Unable to")+' '+_(action)
[3661]114                                        failed=parms[action]
[4278]115                                        if (action=='search' or action=='info'):
116                                                        msg=_(u"Unable to show")
[3661]117                                        if action=='list':
118                                                        failed=', '.join(failed)
119
[4278]120                                        print (color.RED+_(u"Error")+": "+color.END+msg+' '+failed+' ('+_(status['msg'])+')')
[3252]121                                printed=True
122                return(printed)
[3646]123        #def print_results
[3252]124
125        CURSOR_UP='\033[F'
126        ERASE_LINE='\033[K'
127        actions=[]
128        parms={}
[6645]129        dbg=False
130        appimage=False
131        snap=False
[8223]132        autostart=True
[3252]133        args=process_Args(sys.argv)
[6694]134#       if args.debug:
135#               dbg=True
[6645]136        if args.appimage:
137                appimage=True
138        if args.snap:
139                snap=True
[8223]140        if args.update:
141                actions.append('cache')
142                parms['cache']=None
143                autostart=False
[5675]144        if args.view:
[3656]145                actions.append('info')
[5675]146                parms['info']=args.view
[3656]147        if args.search:
[3252]148                actions.append('search')
149                parms['search']=args.search
150        if args.install:
151                actions.append('install')
152                parms['install']=args.install
153        if args.remove:
154                actions.append('remove')
155                parms['remove']=args.remove
[7471]156#       if args.random:
157#               actions.append('random')
158#               parms['random']=args.random
[8223]159#       if args.list:
160#               actions.append('list')
161#               parms['list']=args.list
[5187]162
[8223]163        actionList={'search':False,'info':False,'pkgInfo':False,'install':False,'remove':False,'list':False,'list-sections':False,'random':False,'cache':False}
[3252]164        start_time=time.time()
[8223]165        store=storeManager.StoreManager(appimage=appimage,snap=snap,dbg=dbg,autostart=autostart,cli=True)
[3252]166        for action in actions:
[8182]167                th=threading.Thread(target=store.execute_action, args = (action,parms[action]))
168                th.start()
[3252]169                actionList[action]=False
170               
[8182]171        inc=0
172        banner=' '.join(actions)
173        banner='LliureX Store'
174        numchar=len(banner)
175        os.system('setterm -cursor off')
[3252]176        while store.is_action_running():
[8182]177                ini=banner[0:numchar]
178                end=banner[numchar:inc]
179                text=ini+' '+end
180                print(text+'                 ',end='\r')
181                numchar-=1
182                inc+=1
183                time.sleep(0.2)
184                if numchar<0:
185                        numchar=len(banner)
186                        inc=0
187        print("")
188        print (CURSOR_UP + ERASE_LINE)
189        for key in actionList:
190                progressDic=store.get_progress(key)
191                if key in progressDic:
[3252]192                                if progressDic[key]==100 and not actionList[key]:
193                                        actionList[key]=print_results(key)
[8182]194        print_results()
195        os.system('setterm -cursor on')
[3252]196
197def process_Args(args):
[6694]198        parser=argparse.ArgumentParser(description=(u'Lliurex Store.'))
[5675]199        parser.add_argument('-s','--search',metavar='Name',nargs='?',help=(_(u"Search a package")))
200        parser.add_argument('-v','--view',metavar='Name',nargs='?',help=(_(u"Show all info from a package")))
201        parser.add_argument('-i','--install',metavar='Package',help=(_(u"Install a package")))
202        parser.add_argument('-r','--remove',metavar='Package',help=(_(u"Remove a package")))
[7471]203#       parser.add_argument('--random',metavar='Results',help=(_(u"List random packages")))
[6694]204#       parser.add_argument('--debug',action='store_true',help=(_(u"Prints debug information")))
[6645]205        parser.add_argument('--appimage',action='store_true',help=(_(u"Load appimage catalog")))
206        parser.add_argument('--snap',action='store_true',help=(_(u"Load snap catalog")))
[8223]207        parser.add_argument('--update',action='store_true',help=(_(u"Update cache")))
208#       parser.add_argument('--list',metavar='list',nargs='?',help=(_(u"List category")))
[3252]209
210        args=parser.parse_args()
211        return args
212
[8182]213#Cause the cli hides the cursor we must assure that the cursor is showing when the program ends
214sigs=set(signal.Signals) - {signal.SIGKILL, signal.SIGSTOP}
215for sig in sigs:
216        signal.signal(sig,signal_handler)
[3252]217main()
Note: See TracBrowser for help on using the repository browser.