xref: /spdk/scripts/spdkcli.py (revision 1fc4165fe9bf8512483356ad8e6d27f793f2e3db)
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