Spdk/scripts/spdkcli.py
Konrad Sztyber 7610bc38dc scripts: move python modules to python directory
Up until now, importing an SPDK RPC python module was just a matter of
`import rpc`.  It's fine until there's another module called `rpc`
installed on the system, in which case it's impossible to import both of
them.  Therefore, to avoid this problem, all of the modules were moved
to a separate directory under the "spdk" namespace.

The decision to move to a location under a separate directory was
motivated by the fact that a directory called scripts/spdk would look
pretty confusing.  Moreover, it should make it also easier to package
these scripts as a python package.

Other than moving the packages, all of the imports were updated to
reflect these changes.  Files under python now use relative imports,
while those under scripts/ use the "spdk" namespace and have their
PYTHONPATH extended with python directory.

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: Ib43dee73921d590a551dd83885e22870e72451cf
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/9692
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
2022-04-05 14:40:47 +00:00

89 lines
3.2 KiB
Python
Executable File

#!/usr/bin/env python3
import os
import sys
import argparse
from configshell_fb import ConfigShell, shell, ExecutionError
from pyparsing import (alphanums, Optional, Suppress, Word, Regex,
removeQuotes, dblQuotedString, OneOrMore)
sys.path.append(os.path.dirname(__file__) + '/../python')
from spdk.rpc.client import JSONRPCException, JSONRPCClient # noqa
from spdk.spdkcli import UIRoot # noqa
def add_quotes_to_shell(spdk_shell):
command = shell.locatedExpr(Word(alphanums + '_'))('command')
value = dblQuotedString.addParseAction(removeQuotes)
value_word = Word(alphanums + r';,=_\+/.<>()~@:-%[]')
keyword = Word(alphanums + r'_\-')
kparam = shell.locatedExpr(keyword + Suppress('=') +
Optional(value | value_word, default=''))('kparams*')
pparam = shell.locatedExpr(value | value_word)('pparams*')
parameters = OneOrMore(kparam | pparam)
bookmark = Regex(r'@([A-Za-z0-9:_.]|-)+')
pathstd = Regex(r'([A-Za-z0-9:_.\[\]]|-)*' + '/' + r'([A-Za-z0-9:_.\[\]/]|-)*') \
| '..' | '.'
path = shell.locatedExpr(bookmark | pathstd | '*')('path')
spdk_shell._parser = Optional(path) + Optional(command) + Optional(parameters)
def main():
"""
Start SPDK CLI
:return:
"""
spdk_shell = ConfigShell("~/.scripts")
spdk_shell.interactive = True
add_quotes_to_shell(spdk_shell)
parser = argparse.ArgumentParser(description="SPDK command line interface")
parser.add_argument('-s', dest='server_addr',
help='RPC domain socket path or IP address', default='/var/tmp/spdk.sock')
parser.add_argument('-p', dest='port',
help='RPC port number (if server_addr is IP address)',
default=None, type=int)
parser.add_argument("-v", dest="verbose", help="Print request/response JSON for configuration calls",
default=False, action="store_true")
parser.add_argument("commands", metavar="command", type=str, nargs="*", default="",
help="commands to execute by SPDKCli as one-line command")
args = parser.parse_args()
try:
client = JSONRPCClient(args.server_addr, port=args.port)
except JSONRPCException as e:
spdk_shell.log.error("%s. SPDK not running?" % e)
sys.exit(1)
with client:
root_node = UIRoot(client, spdk_shell)
root_node.verbose = args.verbose
try:
root_node.refresh()
except BaseException:
pass
if args.commands:
try:
spdk_shell.interactive = False
spdk_shell.run_cmdline(" ".join(args.commands))
except Exception as e:
sys.stderr.write("%s\n" % e)
sys.exit(1)
sys.exit(0)
spdk_shell.con.display("SPDK CLI v0.1")
spdk_shell.con.display("")
while not spdk_shell._exit:
try:
spdk_shell.run_interactive()
except (JSONRPCException, ExecutionError) as e:
spdk_shell.log.error("%s" % e)
except BrokenPipeError as e:
spdk_shell.log.error("Lost connection with SPDK: %s" % e)
if __name__ == "__main__":
main()