suricatasc: factorize code and use dynamic commands

This patch factorize the recv code and uses the new 'command-list'
to get the list of existing commands from suricata. This allows
suricatasc to be able to call any new command if this command does
not require an argument.
pull/299/head
Eric Leblond 13 years ago committed by Victor Julien
parent 78b5812ae6
commit 68c1276433

@ -21,13 +21,27 @@ from socket import socket, AF_UNIX, error
from time import sleep from time import sleep
import sys import sys
def json_recv(socket):
cmdret = None
i = 0
data = ""
while i < 5:
i += 1
data += socket.recv(SIZE)
try:
cmdret = json.loads(data)
break
except json.decoder.JSONDecodeError:
sleep(0.3)
return cmdret
VERSION = "0.1" VERSION = "0.1"
if len(sys.argv) == 2: if len(sys.argv) == 2:
SOCKET_PATH = "@e_localstatedir@/" + sys.argv[1] SOCKET_PATH = "@e_localstatedir@/" + sys.argv[1]
else: else:
SOCKET_PATH = "@e_localstatedir@/suricata-command.socket" SOCKET_PATH = "@e_localstatedir@/suricata-command.socket"
SIZE = 4096 SIZE = 4096
COMMANDS_REGEX = re.compile("^(?:shutdown|quit|command-list|reload-rules|pcap-file .+|pcap-file-number|pcap-file-list|pcap-current|iface-list|iface-stat .+)$")
socket = socket(AF_UNIX) socket = socket(AF_UNIX)
socket.connect(SOCKET_PATH) socket.connect(SOCKET_PATH)
@ -37,29 +51,40 @@ socket.settimeout(10)
socket.send(json.dumps({"version": VERSION})) socket.send(json.dumps({"version": VERSION}))
# get return # get return
cmdret = None cmdret = json_recv(socket)
i = 0
data = "" if cmdret == None:
while i < 5: sys.stderr.write("Unable to get message from server")
i += 1 sys.exit(1)
data += socket.recv(SIZE)
try:
cmdret = json.loads(data)
break
except json.decoder.JSONDecodeError:
sleep(0.3)
# if ok loop # if ok loop
if cmdret["return"] == "NOK": if cmdret["return"] == "NOK":
sys.stderr.write("Error: %s" % (cmdret["message"])) sys.stderr.write("Error: %s" % (cmdret["message"]))
sys.exit(1) sys.exit(1)
# get command list
socket.send(json.dumps({"command": "command-list"}))
cmdret = json_recv(socket)
if cmdret == None:
sys.stderr.write("Unable to get message from server")
sys.exit(1)
# if ok loop
if cmdret["return"] == "NOK":
sys.stderr.write("Error: %s" % (cmdret["message"]))
sys.exit(1)
cmd_list = cmdret["message"]["commands"]
cmd_list.append("quit")
# if ok loop # if ok loop
try: try:
readline.parse_and_bind('tab: complete') readline.parse_and_bind('tab: complete')
while True: while True:
command = raw_input(">>> ").strip() command = raw_input(">>> ").strip()
if COMMANDS_REGEX.match(command): if command.split(' ', 2)[0] in cmd_list:
if command == "quit": if command == "quit":
break; break;
cmdmsg = {} cmdmsg = {}
@ -93,16 +118,11 @@ try:
else: else:
cmdmsg["command"] = command cmdmsg["command"] = command
socket.send(json.dumps(cmdmsg)) socket.send(json.dumps(cmdmsg))
i = 0 cmdret = json_recv(socket)
data = ""
while i < 3: if cmdret == None:
i += 1 sys.stderr.write("Unable to get message from server")
data += socket.recv(SIZE) sys.exit(1)
try:
cmdret = json.loads(data)
break
except json.decoder.JSONDecodeError:
sleep(0.3)
#decode json message #decode json message
if cmdret["return"] == "NOK": if cmdret["return"] == "NOK":
print "Error: %s" % (cmdret["message"]) print "Error: %s" % (cmdret["message"])

Loading…
Cancel
Save