diff options
| author | Maurizio Lombardi <m.lombardi85@gmail.com> | 2019-06-17 15:44:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-17 15:44:56 +0200 |
| commit | 85031ad48b011f5626cd0a287749abcaa145277b (patch) | |
| tree | 7806e3a23668588410bd47c93d4b8a4c41801063 /scripts/targetcli | |
| parent | 0d3b4eb285f67cae2b1b6604878687554317e70e (diff) | |
| parent | 797778eeb2997d34af7fd3760195f7f8d08470f4 (diff) | |
| download | targetcli-85031ad48b011f5626cd0a287749abcaa145277b.tar.gz | |
Merge pull request #132 from pkalever/daemonize
targetclid: add daemonize component for targetcli
Diffstat (limited to 'scripts/targetcli')
| -rwxr-xr-x | scripts/targetcli | 119 |
1 files changed, 108 insertions, 11 deletions
diff --git a/scripts/targetcli b/scripts/targetcli index b042ad9..66cb5bb 100755 --- a/scripts/targetcli +++ b/scripts/targetcli @@ -24,10 +24,19 @@ from os import getuid, getenv from targetcli import UIRoot from rtslib_fb import RTSLibError from configshell_fb import ConfigShell, ExecutionError -import sys from targetcli import __version__ as targetcli_version +import sys +import socket +import struct +import readline +import six + err = sys.stderr +socket_path = '/var/run/targetclid.sock' +hints = ['/', 'backstores/', 'iscsi/', 'loopback/', 'vhost/', 'xen-pvscsi/', + 'cd', 'pwd', 'ls', 'set', 'get', 'help', 'refresh', 'status', + 'clearconfig', 'restoreconfig', 'saveconfig', 'exit'] class TargetCLI(ConfigShell): default_prefs = {'color_path': 'magenta', @@ -51,14 +60,17 @@ class TargetCLI(ConfigShell): 'auto_save_on_exit': True, 'max_backup_files': '10', 'auto_add_default_portal': True, + 'auto_use_daemon': False, } def usage(): - print("Usage: %s [--version|--help|CMD]" % sys.argv[0], file=err) + print("Usage: %s [--version|--help|CMD|--tcp]" % sys.argv[0], file=err) print(" --version\t\tPrint version", file=err) print(" --help\t\tPrint this information", file=err) print(" CMD\t\t\tRun targetcli shell command and exit", file=err) print(" <nothing>\t\tEnter configuration shell", file=err) + print(" --tcp CMD\t\tPass targetcli command to targetclid", file=err) + print(" --tcp <nothing>\tEnter multi-line command mode for targetclid", file=err) print("See man page for more information.", file=err) sys.exit(-1) @@ -66,16 +78,107 @@ def version(): print("%s version %s" % (sys.argv[0], targetcli_version), file=err) sys.exit(0) +def usage_version(cmd): + if cmd in ("help", "--help", "-h"): + usage() + + if cmd in ("version", "--version", "-v"): + version() + +def completer(text, state): + options = [x for x in hints if x.startswith(text)] + try: + return options[state] + except IndexError: + return None + +def call_daemon(shell, req): + try: + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + except socket.error as err: + shell.con.display(shell.con.render_text(err, 'red')) + sys.exit(1) + + try: + sock.connect(socket_path) + except socket.error as err: + shell.con.display(shell.con.render_text(err, 'red')) + sys.exit(1) + + try: + # send request + sock.sendall(req) + except socket.error as err: + shell.con.display(shell.con.render_text(err, 'red')) + sys.exit(1) + + var = sock.recv(4) # get length of data + sending = struct.unpack('i', var) + amount_expected = sending[0] + amount_received = 0 + + # get the actual data in chunks + while amount_received < amount_expected: + data = sock.recv(1024) + amount_received += len(data) + print(data, end ="") + + sock.send(b'-END@OF@DATA-') + sock.close() + sys.exit(0) + +def get_arguments(): + readline.set_completer(completer) + readline.set_completer_delims('') + + if 'libedit' in readline.__doc__: + readline.parse_and_bind("bind ^I rl_complete") + else: + readline.parse_and_bind("tab: complete") + + argstart = 1 + if len(sys.argv) > 1 and sys.argv[1] in ("tcp", "--tcp", "-t"): + argstart = 2 + + if len(sys.argv[argstart - 1:]) > 1: + command = " ".join(sys.argv[argstart:]) + else: + inputs = [] + while True: + command = six.moves.input() + if command.lower() == "exit": + break + inputs.append(command) + command = '%'.join(inputs) # delimit multiple commands with '%' + + if not command: + sys.exit(1) + + usage_version(command); + + return command + def main(): ''' Start the targetcli shell. ''' + shell = TargetCLI(getenv("TARGETCLI_HOME", '~/.targetcli')) + + is_root = False if getuid() == 0: is_root = True - else: - is_root = False - shell = TargetCLI(getenv("TARGETCLI_HOME", '~/.targetcli')) + use_daemon = False + if shell.prefs['auto_use_daemon']: + use_daemon = True + + if len(sys.argv) > 1: + usage_version(sys.argv[1]) + if sys.argv[1] in ("tcp", "--tcp", "-t"): + use_daemon = True + + if use_daemon: + call_daemon(shell, get_arguments()) try: root_node = UIRoot(shell, as_root=is_root) @@ -87,12 +190,6 @@ def main(): sys.exit(-1) if len(sys.argv) > 1: - if sys.argv[1] in ("--help", "-h"): - usage() - - if sys.argv[1] in ("--version", "-v"): - version() - try: shell.run_cmdline(" ".join(sys.argv[1:])) except Exception as e: |
