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