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