summaryrefslogtreecommitdiff
path: root/scripts/targetcli
diff options
context:
space:
mode:
authorMaurizio Lombardi <m.lombardi85@gmail.com>2019-06-17 15:44:56 +0200
committerGitHub <noreply@github.com>2019-06-17 15:44:56 +0200
commit85031ad48b011f5626cd0a287749abcaa145277b (patch)
tree7806e3a23668588410bd47c93d4b8a4c41801063 /scripts/targetcli
parent0d3b4eb285f67cae2b1b6604878687554317e70e (diff)
parent797778eeb2997d34af7fd3760195f7f8d08470f4 (diff)
downloadtargetcli-85031ad48b011f5626cd0a287749abcaa145277b.tar.gz
Merge pull request #132 from pkalever/daemonize
targetclid: add daemonize component for targetcli
Diffstat (limited to 'scripts/targetcli')
-rwxr-xr-xscripts/targetcli119
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: