69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
import cmd
|
|
|
|
from ZeekControl.exceptions import CommandSyntaxError, InvalidNodeError, LockError
|
|
|
|
|
|
class ExitValueCmd(cmd.Cmd):
|
|
def cmdloop(self, intro=None):
|
|
"""Repeatedly issue a prompt, accept input, parse an initial prefix
|
|
off the received input, and dispatch to action methods, passing them
|
|
the remainder of the line as argument.
|
|
|
|
"""
|
|
|
|
self.preloop()
|
|
if self.use_rawinput and self.completekey:
|
|
try:
|
|
import readline
|
|
|
|
self.old_completer = readline.get_completer()
|
|
readline.set_completer(self.complete)
|
|
readline.parse_and_bind(self.completekey + ": complete")
|
|
except ImportError:
|
|
pass
|
|
try:
|
|
if intro is not None:
|
|
self.intro = intro
|
|
if self.intro:
|
|
self.stdout.write(f"{self.intro}\n")
|
|
self._stopping = False
|
|
success = True
|
|
while not self._stopping:
|
|
if self.cmdqueue:
|
|
line = self.cmdqueue.pop(0)
|
|
else:
|
|
if self.use_rawinput:
|
|
try:
|
|
line = input(self.prompt)
|
|
except EOFError:
|
|
line = "EOF"
|
|
else:
|
|
self.stdout.write(self.prompt)
|
|
self.stdout.flush()
|
|
line = self.stdin.readline()
|
|
if not line:
|
|
line = "EOF"
|
|
else:
|
|
line = line.rstrip("\r\n")
|
|
line = self.precmd(line)
|
|
try:
|
|
success = self.onecmd(line)
|
|
except (CommandSyntaxError, InvalidNodeError, LockError) as err:
|
|
# Note that here we do not attempt to catch all ZeekControl
|
|
# exceptions; letting some just terminate the program to
|
|
# avoid getting in an unknown state (e.g. error while
|
|
# reloading the config).
|
|
success = False
|
|
print(f"Error: {err}")
|
|
self.postcmd(False, line)
|
|
self.postloop()
|
|
finally:
|
|
if self.use_rawinput and self.completekey:
|
|
try:
|
|
import readline
|
|
|
|
readline.set_completer(self.old_completer)
|
|
except ImportError:
|
|
pass
|
|
return success
|