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

Last change on this file since 8182 was 8182, checked in by Juanma, 13 months ago

cli improvements

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