diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py index e92fdcf605e9dd5be14dfcbba69180a844073198..07115f33489d4d79aad623e3d628dc086c203c0e 100755 --- a/scapy/arch/windows/__init__.py +++ b/scapy/arch/windows/__init__.py @@ -546,7 +546,7 @@ def read_routes6(): -if conf.interactive_shell != 'ipython': +if conf.interactive_shell != 'ipython' and conf.interactive: try: __IPYTHON__ except NameError: diff --git a/scapy/main.py b/scapy/main.py index ed3067d215da9245e592ce9ac448d432fa07ab4e..3e4688685f1b9160266c37d0b21f8f2d3c1f8958 100644 --- a/scapy/main.py +++ b/scapy/main.py @@ -39,6 +39,7 @@ def _read_config_file(cf): DEFAULT_PRESTART_FILE = _probe_config_file(".scapy_prestart.py") DEFAULT_STARTUP_FILE = _probe_config_file(".scapy_startup.py") +session = None def _usage(): print """Usage: scapy.py [-s sessionfile] [-c new_startup_file] [-p new_prestart_file] [-C] [-P] @@ -137,13 +138,16 @@ def save_session(fname=None, session=None, pickleProto=-1): log_interactive.error("[%s] (%s) can't be saved." % (k, type(to_be_saved[k]))) del(to_be_saved[k]) + try: - os.rename(fname, fname+".bak") + os.rename(fname, fname+".bak") except OSError: - pass + pass + f=gzip.open(fname,"wb") cPickle.dump(to_be_saved, f, pickleProto) f.close() + del f def load_session(fname=None): if fname is None: @@ -151,11 +155,17 @@ def load_session(fname=None): try: s = cPickle.load(gzip.open(fname,"rb")) except IOError: - s = cPickle.load(open(fname,"rb")) + try: + s = cPickle.load(open(fname,"rb")) + except IOError: + # Raise "No such file exception" + raise + scapy_session = __builtin__.__dict__["scapy_session"] scapy_session.clear() scapy_session.update(s) - + log_loading.info("Loaded session [%s]" % conf.session) + def update_session(fname=None): if fname is None: fname = conf.session @@ -166,8 +176,10 @@ def update_session(fname=None): scapy_session = __builtin__.__dict__["scapy_session"] scapy_session.update(s) -def init_session(mydict=None, session_name="", STARTUP_FILE=DEFAULT_STARTUP_FILE): +def init_session(session_name, mydict=None): global session + global globkeys + scapy_builtins = __import__("all",globals(),locals(),".").__dict__ for name, sym in scapy_builtins.iteritems(): if name [0] != '_': @@ -179,11 +191,6 @@ def init_session(mydict=None, session_name="", STARTUP_FILE=DEFAULT_STARTUP_FILE __builtin__.__dict__.update(mydict) globkeys += mydict.keys() - - conf.color_theme = DefaultTheme() - if STARTUP_FILE: - _read_config_file(STARTUP_FILE) - if session_name: try: os.stat(session_name) @@ -208,13 +215,10 @@ def init_session(mydict=None, session_name="", STARTUP_FILE=DEFAULT_STARTUP_FILE else: conf.session = session_name session={"conf":conf} - else: session={"conf": conf} __builtin__.__dict__["scapy_session"] = session - - return globkeys ################ ##### Main ##### @@ -243,6 +247,7 @@ def scapy_write_history_file(readline): def interact(mydict=None,argv=None,mybanner=None,loglevel=20): global session + global globkeys import code,sys,os,getopt,re from scapy.config import conf conf.interactive = True @@ -312,13 +317,11 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20): readline.parse_and_bind("tab: complete") - session=None - session_name="" STARTUP_FILE = DEFAULT_STARTUP_FILE PRESTART_FILE = DEFAULT_PRESTART_FILE + session_name = "" - iface = None try: opts=getopt.getopt(argv[1:], "hs:Cc:Pp:d") for opt, parm in opts[0]: @@ -345,10 +348,14 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20): log_loading.error(msg) sys.exit(1) + conf.color_theme = DefaultTheme() + + if STARTUP_FILE: + _read_config_file(STARTUP_FILE) if PRESTART_FILE: _read_config_file(PRESTART_FILE) - globkeys = init_session(mydict, session_name, STARTUP_FILE) + init_session(None, mydict) if READLINE: if conf.histfile: diff --git a/test/regression.uts b/test/regression.uts index 8c07b3615785c3677e1f49cfc35809532f1483ef..cd0bc925be566e7de6c159935994d463abb244f5 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -96,15 +96,63 @@ True ############ + Main.py tests -= Test save_session -init_session() -# TODO: Remove the comments once the pickling bug has been fixed -#test_value = IP(dst="192.168.0.10") -#test_value -save_session(fname="scapySession1") - -= Test load_session -load_session(fname="scapySession1") += Prepare emulator +import mock +from mock import Mock + +if WINDOWS: + # This fix when the windows doesn't have a size (run with a windows server) + mock.patch("pyreadline.console.console.Console.size").return_value = (300, 300) + +@mock.patch("scapy.config.conf.readfunc") +def emulate_main_input(data, mock_readfunc): + global index + index = 0 # reset var + def readlineScapy(*args, **kargs): + global index + if len(data) == index: + r_data = "exit(1 if hasattr(sys, 'last_value') and sys.last_value is not None else 0)" + else: + r_data = data[index] + index +=1 + print r_data + return r_data + mock_readfunc.side_effect = readlineScapy + def reduce_mock(self): + return (Mock, ()) + mock_readfunc.__reduce__ = reduce_mock + sys.argv = [''] + def console_exit(code): + raise SystemExit(code) + exit_code = -1 + try: + interact(mydict={"exit": console_exit}) + except SystemExit as e: + exit_code = str(e) + pass + assert exit_code == "0" + += Test basic save_session and load_session + +data = ["init_session(\"scapySession1\")",\ +"test_value = \"8.8.8.8\"",\ +"save_session()",\ +"del test_value",\ +"load_session()",\ +"assert test_value == \"8.8.8.8\""] + +emulate_main_input(data) + += Test save_session and load_session with fname + +data = ["init_session(\"scapySession2\")",\ +"test_value = 7",\ +"save_session(fname=\"scapySaveSession.dat\")",\ +"del test_value",\ +"load_session(fname=\"scapySaveSession.dat\")",\ +"assert test_value == 7"] + +emulate_main_input(data) = Test utility functions