1#!/usr/bin/env python3 2import sys 3import argparse 4import configshell_fb 5from os import getuid 6from rpc.client import JSONRPCException 7from configshell_fb import ConfigShell, shell, ExecutionError 8from spdkcli import UIRoot 9from pyparsing import (alphanums, Optional, Suppress, Word, Regex, 10 removeQuotes, dblQuotedString, OneOrMore) 11 12 13def add_quotes_to_shell(spdk_shell): 14 command = shell.locatedExpr(Word(alphanums + '_'))('command') 15 value = dblQuotedString.addParseAction(removeQuotes) 16 value_word = Word(alphanums + r';,=_\+/.<>()~@:-%[]') 17 keyword = Word(alphanums + r'_\-') 18 kparam = shell.locatedExpr(keyword + Suppress('=') + 19 Optional(value | value_word, default=''))('kparams*') 20 pparam = shell.locatedExpr(value | value_word)('pparams*') 21 parameters = OneOrMore(kparam | pparam) 22 bookmark = Regex(r'@([A-Za-z0-9:_.]|-)+') 23 pathstd = Regex(r'([A-Za-z0-9:_.\[\]]|-)*' + '/' + r'([A-Za-z0-9:_.\[\]/]|-)*') \ 24 | '..' | '.' 25 path = shell.locatedExpr(bookmark | pathstd | '*')('path') 26 spdk_shell._parser = Optional(path) + Optional(command) + Optional(parameters) 27 28 29def main(): 30 """ 31 Start SPDK CLI 32 :return: 33 """ 34 spdk_shell = ConfigShell("~/.scripts") 35 spdk_shell.interactive = True 36 add_quotes_to_shell(spdk_shell) 37 38 parser = argparse.ArgumentParser(description="SPDK command line interface") 39 parser.add_argument("-s", dest="socket", help="RPC socket path", default="/var/tmp/spdk.sock") 40 parser.add_argument("-v", dest="verbose", help="Print request/response JSON for configuration calls", 41 default=False, action="store_true") 42 parser.add_argument("commands", metavar="command", type=str, nargs="*", default="", 43 help="commands to execute by SPDKCli as one-line command") 44 args = parser.parse_args() 45 46 root_node = UIRoot(args.socket, spdk_shell) 47 root_node.verbose = args.verbose 48 try: 49 root_node.refresh() 50 except BaseException: 51 pass 52 53 if len(args.commands) > 0: 54 try: 55 spdk_shell.interactive = False 56 spdk_shell.run_cmdline(" ".join(args.commands)) 57 except Exception as e: 58 sys.stderr.write("%s\n" % e) 59 sys.exit(1) 60 sys.exit(0) 61 62 spdk_shell.con.display("SPDK CLI v0.1") 63 spdk_shell.con.display("") 64 while not spdk_shell._exit: 65 try: 66 spdk_shell.run_interactive() 67 except (JSONRPCException, ExecutionError) as e: 68 spdk_shell.log.error("%s" % e) 69 70 71if __name__ == "__main__": 72 main() 73