149 lines
4.5 KiB
Python
149 lines
4.5 KiB
Python
## This file is part of Scapy
|
|
## See http://www.secdev.org/projects/scapy for more informations
|
|
## Copyright (C) Philippe Biondi <phil@secdev.org>
|
|
## This program is published under a GPLv2 license
|
|
|
|
"""
|
|
Run commands when the Scapy interpreter starts.
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
import code, sys, importlib
|
|
from scapy.config import conf
|
|
from scapy.themes import *
|
|
from scapy.error import Scapy_Exception
|
|
from scapy.utils import tex_escape
|
|
import scapy.modules.six as six
|
|
|
|
|
|
#########################
|
|
##### Autorun stuff #####
|
|
#########################
|
|
|
|
class StopAutorun(Scapy_Exception):
|
|
code_run = ""
|
|
|
|
class ScapyAutorunInterpreter(code.InteractiveInterpreter):
|
|
def __init__(self, *args, **kargs):
|
|
code.InteractiveInterpreter.__init__(self, *args, **kargs)
|
|
self.error = 0
|
|
def showsyntaxerror(self, *args, **kargs):
|
|
self.error = 1
|
|
return code.InteractiveInterpreter.showsyntaxerror(self, *args, **kargs)
|
|
def showtraceback(self, *args, **kargs):
|
|
self.error = 1
|
|
exc_type, exc_value, exc_tb = sys.exc_info()
|
|
if isinstance(exc_value, StopAutorun):
|
|
raise exc_value
|
|
return code.InteractiveInterpreter.showtraceback(self, *args, **kargs)
|
|
|
|
|
|
def autorun_commands(cmds, my_globals=None, ignore_globals=None, verb=0):
|
|
sv = conf.verb
|
|
try:
|
|
try:
|
|
if my_globals is None:
|
|
my_globals = importlib.import_module(".all", "scapy").__dict__
|
|
if ignore_globals:
|
|
for ig in ignore_globals:
|
|
my_globals.pop(ig, None)
|
|
conf.verb = verb
|
|
interp = ScapyAutorunInterpreter(my_globals)
|
|
cmd = ""
|
|
cmds = cmds.splitlines()
|
|
cmds.append("") # ensure we finish multi-line commands
|
|
cmds.reverse()
|
|
six.moves.builtins.__dict__["_"] = None
|
|
while True:
|
|
if cmd:
|
|
sys.stderr.write(sys.__dict__.get("ps2","... "))
|
|
else:
|
|
sys.stderr.write(str(sys.__dict__.get("ps1", sys.ps1)))
|
|
|
|
l = cmds.pop()
|
|
print(l)
|
|
cmd += "\n"+l
|
|
if interp.runsource(cmd):
|
|
continue
|
|
if interp.error:
|
|
return 0
|
|
cmd = ""
|
|
if len(cmds) <= 1:
|
|
break
|
|
except SystemExit:
|
|
pass
|
|
finally:
|
|
conf.verb = sv
|
|
return _
|
|
|
|
def autorun_get_interactive_session(cmds, **kargs):
|
|
class StringWriter:
|
|
def __init__(self):
|
|
self.s = ""
|
|
def write(self, x):
|
|
self.s += x
|
|
def flush(self):
|
|
pass
|
|
|
|
sw = StringWriter()
|
|
sstdout,sstderr = sys.stdout,sys.stderr
|
|
try:
|
|
try:
|
|
sys.stdout = sys.stderr = sw
|
|
res = autorun_commands(cmds, **kargs)
|
|
except StopAutorun as e:
|
|
e.code_run = sw.s
|
|
raise
|
|
finally:
|
|
sys.stdout,sys.stderr = sstdout,sstderr
|
|
return sw.s,res
|
|
|
|
def autorun_get_text_interactive_session(cmds, **kargs):
|
|
ct = conf.color_theme
|
|
try:
|
|
conf.color_theme = NoTheme()
|
|
s,res = autorun_get_interactive_session(cmds, **kargs)
|
|
finally:
|
|
conf.color_theme = ct
|
|
return s,res
|
|
|
|
def autorun_get_ansi_interactive_session(cmds, **kargs):
|
|
ct = conf.color_theme
|
|
try:
|
|
conf.color_theme = DefaultTheme()
|
|
s,res = autorun_get_interactive_session(cmds, **kargs)
|
|
finally:
|
|
conf.color_theme = ct
|
|
return s,res
|
|
|
|
def autorun_get_html_interactive_session(cmds, **kargs):
|
|
ct = conf.color_theme
|
|
to_html = lambda s: s.replace("<","<").replace(">",">").replace("#[#","<").replace("#]#",">")
|
|
try:
|
|
try:
|
|
conf.color_theme = HTMLTheme2()
|
|
s,res = autorun_get_interactive_session(cmds, **kargs)
|
|
except StopAutorun as e:
|
|
e.code_run = to_html(e.code_run)
|
|
raise
|
|
finally:
|
|
conf.color_theme = ct
|
|
|
|
return to_html(s),res
|
|
|
|
def autorun_get_latex_interactive_session(cmds, **kargs):
|
|
ct = conf.color_theme
|
|
to_latex = lambda s: tex_escape(s).replace("@[@","{").replace("@]@","}").replace("@`@","\\")
|
|
try:
|
|
try:
|
|
conf.color_theme = LatexTheme2()
|
|
s,res = autorun_get_interactive_session(cmds, **kargs)
|
|
except StopAutorun as e:
|
|
e.code_run = to_latex(e.code_run)
|
|
raise
|
|
finally:
|
|
conf.color_theme = ct
|
|
return to_latex(s),res
|
|
|
|
|