suricatasc: now python 2 and 3 compatible

Update code to support both python 2 and python 3.
pull/1252/head
Eric Leblond 11 years ago
parent 84e8217fd8
commit 55ccd3b17d

@ -14,7 +14,10 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import simplejson as json try:
import simplejson as json
except:
import json
import re import re
import readline import readline
from socket import socket, AF_UNIX, error from socket import socket, AF_UNIX, error
@ -69,7 +72,7 @@ class SuricataCompleter:
if state == 0: if state == 0:
self.generator = self.complete(text) self.generator = self.complete(text)
try: try:
return self.generator.next() return next(self.generator)
except StopIteration: except StopIteration:
return None return None
return None return None
@ -86,11 +89,14 @@ class SuricataSC:
data = "" data = ""
while i < 5: while i < 5:
i += 1 i += 1
data += self.socket.recv(SIZE) if sys.version < '3':
data += self.socket.recv(SIZE)
else:
data += self.socket.recv(SIZE).decode('iso-8859-1')
try: try:
cmdret = json.loads(data) cmdret = json.loads(data)
break break
except json.decoder.JSONDecodeError: except:
sleep(0.3) sleep(0.3)
return cmdret return cmdret
@ -103,15 +109,18 @@ class SuricataSC:
if (arguments != None): if (arguments != None):
cmdmsg['arguments'] = arguments cmdmsg['arguments'] = arguments
if self.verbose: if self.verbose:
print "SND: " + json.dumps(cmdmsg) print("SND: " + json.dumps(cmdmsg))
self.socket.send(json.dumps(cmdmsg)) if sys.version < '3':
self.socket.send(json.dumps(cmdmsg))
else:
self.socket.send(bytes(json.dumps(cmdmsg), 'iso-8859-1'))
cmdret = self.json_recv() cmdret = self.json_recv()
if cmdret == None: if cmdret == None:
raise SuricataReturnException("Unable to get message from server") raise SuricataReturnException("Unable to get message from server")
if self.verbose: if self.verbose:
print "RCV: "+ json.dumps(cmdret) print("RCV: "+ json.dumps(cmdret))
return cmdret return cmdret
@ -119,14 +128,17 @@ class SuricataSC:
try: try:
self.socket = socket(AF_UNIX) self.socket = socket(AF_UNIX)
self.socket.connect(self.sck_path) self.socket.connect(self.sck_path)
except error, err: except error as err:
raise SuricataNetException(err) raise SuricataNetException(err)
self.socket.settimeout(10) self.socket.settimeout(10)
#send version #send version
if self.verbose: if self.verbose:
print "SND: " + json.dumps({"version": VERSION}) print("SND: " + json.dumps({"version": VERSION}))
self.socket.send(json.dumps({"version": VERSION})) if sys.version < '3':
self.socket.send(json.dumps({"version": VERSION}))
else:
self.socket.send(bytes(json.dumps({"version": VERSION}), 'iso-8859-1'))
# get return # get return
cmdret = self.json_recv() cmdret = self.json_recv()
@ -135,7 +147,7 @@ class SuricataSC:
raise SuricataReturnException("Unable to get message from server") raise SuricataReturnException("Unable to get message from server")
if self.verbose: if self.verbose:
print "RCV: "+ json.dumps(cmdret) print("RCV: "+ json.dumps(cmdret))
if cmdret["return"] == "NOK": if cmdret["return"] == "NOK":
raise SuricataReturnException("Error: %s" % (cmdret["message"])) raise SuricataReturnException("Error: %s" % (cmdret["message"]))
@ -192,27 +204,30 @@ class SuricataSC:
return (cmd, arguments) return (cmd, arguments)
def interactive(self): def interactive(self):
print "Command list: " + ", ".join(self.cmd_list) print("Command list: " + ", ".join(self.cmd_list))
try: try:
readline.set_completer(SuricataCompleter(self.cmd_list)) readline.set_completer(SuricataCompleter(self.cmd_list))
readline.set_completer_delims(";") readline.set_completer_delims(";")
readline.parse_and_bind('tab: complete') readline.parse_and_bind('tab: complete')
while True: while True:
command = raw_input(">>> ").strip() if sys.version < '3':
command = raw_input(">>> ").strip()
else:
command = input(">>> ").strip()
if command == "quit": if command == "quit":
break; break;
try: try:
(cmd, arguments) = self.parse_command(command) (cmd, arguments) = self.parse_command(command)
except SuricataCommandException, err: except SuricataCommandException as err:
print err print(err)
continue continue
cmdret = self.send_command(cmd, arguments) cmdret = self.send_command(cmd, arguments)
#decode json message #decode json message
if cmdret["return"] == "NOK": if cmdret["return"] == "NOK":
print "Error:" print("Error:")
print json.dumps(cmdret["message"], sort_keys=True, indent=4, separators=(',', ': ')) print(json.dumps(cmdret["message"], sort_keys=True, indent=4, separators=(',', ': ')))
else: else:
print "Success:" print("Success:")
print json.dumps(cmdret["message"], sort_keys=True, indent=4, separators=(',', ': ')) print(json.dumps(cmdret["message"], sort_keys=True, indent=4, separators=(',', ': ')))
except KeyboardInterrupt: except KeyboardInterrupt:
print "[!] Interrupted" print("[!] Interrupted")

@ -32,28 +32,28 @@ else:
sc = SuricataSC(SOCKET_PATH, verbose=args.verbose) sc = SuricataSC(SOCKET_PATH, verbose=args.verbose)
try: try:
sc.connect() sc.connect()
except SuricataNetException, err: except SuricataNetException as err:
print "Unable to connect to socket %s: %s" % (SOCKET_PATH, err) print("Unable to connect to socket %s: %s" % (SOCKET_PATH, err))
sys.exit(1) sys.exit(1)
except SuricataReturnException, err: except SuricataReturnException as err:
print "Unable to negotiate version with server: %s" % (err) print("Unable to negotiate version with server: %s" % (err))
sys.exit(1) sys.exit(1)
if args.command: if args.command:
(command, arguments) = sc.parse_command(args.command) (command, arguments) = sc.parse_command(args.command)
print sc.send_command(command, arguments) print(sc.send_command(command, arguments))
sc.close() sc.close()
sys.exit(0) sys.exit(0)
try: try:
sc.interactive() sc.interactive()
except SuricataNetException, err: except SuricataNetException as err:
print "Communication error: %s" % (err) print("Communication error: %s" % (err))
sys.exit(1) sys.exit(1)
except SuricataReturnException, err: except SuricataReturnException as err:
print "Invalid return from server: %s" % (err) print("Invalid return from server: %s" % (err))
sys.exit(1) sys.exit(1)
print "[+] Quit command client" print("[+] Quit command client")
sc.close() sc.close()

Loading…
Cancel
Save