def setup(silent=False, **kwargs): """ Setup the framework. """ recompile = False # install Cooja modifications if not check_cooja(COOJA_FOLDER): logger.debug(" > Installing Cooja add-ons...") # modify Cooja.java and adapt build.xml and ~/.cooja.user.properties modify_cooja(COOJA_FOLDER) update_cooja_build(COOJA_FOLDER) update_cooja_user_properties() recompile = True # install VisualizerScreenshot plugin in Cooja visualizer = join(COOJA_FOLDER, 'apps', 'visualizer_screenshot') if not exists(visualizer): logger.debug(" > Installing VisualizerScreenshot Cooja plugin...") copy_folder('src/visualizer_screenshot', visualizer) recompile = True # recompile Cooja for making the changes take effect if recompile: with lcd(COOJA_FOLDER): logger.debug(" > Recompiling Cooja...") with settings(warn_only=True): local("ant clean") local("ant jar") else: logger.debug(" > Cooja is up-to-date") # install imagemagick with hide(*HIDDEN_ALL): imagemagick_apt_output = local('apt-cache policy imagemagick', capture=True) if 'Unable to locate package' in imagemagick_apt_output: logger.debug(" > Installing imagemagick package...") sudo("apt-get install imagemagick -y &") else: logger.debug(" > Imagemagick is installed") # install msp430 (GCC) upgrade with hide(*HIDDEN_ALL): msp430_version_output = local('msp430-gcc --version', capture=True) if 'msp430-gcc (GCC) 4.7.0 20120322' not in msp430_version_output: txt = "In order to extend msp430x memory support, it is necessary to upgrade msp430-gcc.\n" \ "Would you like to upgrade it now ? (yes|no) [default: no] " answer = std_input(txt, 'yellow') if answer == "yes": logger.debug(" > Upgrading msp430-gcc from version 4.6.3 to 4.7.0...") logger.warning("If you encounter problems with this upgrade, please refer to:\n" "https://github.com/contiki-os/contiki/wiki/MSP430X") with lcd('src/'): logger.warning(" > Upgrade now starts, this may take up to 30 minutes...") sudo('./upgrade-msp430.sh') sudo('rm -r tmp/') local('export PATH=/usr/local/msp430/bin:$PATH') register_new_path_in_profile() else: logger.warning("Upgrade of library msp430-gcc aborted") logger.warning("You may experience problems of mote memory size at compilation") else: logger.debug(" > Library msp430-gcc is up-to-date (version 4.7.0)")
def __remake(name, build=False, **kwargs): """ Remake the malicious mote of an experiment. (meaning that it lets all simulation's files unchanged except ./motes/malicious.[target]) :param name: experiment name :param path: expanded path of the experiment (dynamically filled in through 'command' decorator with 'expand' """ path = kwargs['path'] logger.debug(" > Retrieving parameters...") params = read_config(path) ext_lib = params.get("ext_lib") if ext_lib and not exists(ext_lib): logger.error("External library does not exist !") logger.critical("Make aborted.") return False logger.debug(" > Recompiling malicious mote...") # remove former compiled malicious mote and prepare the template templates = get_path(path, 'templates', create=True) get_path(templates, 'motes', create=True) copy_files((TEMPLATES_FOLDER, 'experiment'), templates, ('motes/{}.c'.format(params["mtype_malicious"]), 'motes/malicious.c')) # recreate malicious C file from template and clean the temporary template replacements = render_templates(path, only_malicious=True, **params) # then clean the temporary folder with templates remove_folder(templates) # now recompile with settings(hide(*HIDDEN_ALL), warn_only=True): with_malicious = join(path, 'with-malicious', 'motes') without_malicious = join(path, 'without-malicious', 'motes') contiki = join(with_malicious, 'contiki') contiki_rpl = join(contiki, 'core', 'net', 'rpl') with lcd(with_malicious): malicious = 'malicious.{}'.format(params["malicious_target"]) croot, csensor = 'root.{}'.format(params["target"]), 'sensor.{}'.format(params["target"]) # handle the malicious mote recompilation copy_folder(CONTIKI_FOLDER, with_malicious, includes=get_contiki_includes(params["malicious_target"])) if ext_lib is not None: remove_folder(contiki_rpl) copy_folder(ext_lib, contiki_rpl) apply_replacements(contiki_rpl, replacements) logger.debug(" > Making '{}'...".format(malicious)) stderr(local)("make malicious{} CONTIKI={}" .format(['', '.upload'][build], contiki), capture=True) if build: build = get_path(path, 'build', create=True) move_files(with_malicious, build, 'tmpimage.ihex') copy_files(with_malicious, build, malicious) move_files(with_malicious, without_malicious, malicious) local('make clean') remove_files(with_malicious, 'malicious.c') move_files(without_malicious, with_malicious, malicious) copy_files(without_malicious, with_malicious, croot, csensor) remove_folder(contiki)
def __make(name, ask=True, **kwargs): """ Make a new experiment. :param name: experiment name (or path to the experiment, if expanded in the 'command' decorator) :param ask: ask confirmation :param path: expanded path of the experiment (dynamically filled in through 'command' decorator with 'expand' :param kwargs: simulation keyword arguments (see the documentation for more information) """ global reuse_bin_path path = kwargs['path'] logger.debug(" > Validating parameters...") params = validated_parameters(kwargs) ext_lib = params.get("ext_lib") if ext_lib and not exists(ext_lib): logger.error("External library does not exist !") logger.critical("Make aborded.") return False logger.debug(" > Creating simulation...") # create experiment's directories check_structure(path, create=True, remove=True) templates = get_path(path, 'templates', create=True) get_path(templates, 'motes', create=True) # select the right malicious mote template and duplicate the simulation file copy_files((TEMPLATES_FOLDER, 'experiment'), templates, ('motes/{}.c'.format(params["mtype_root"]), 'motes/root.c'), ('motes/{}.c'.format(params["mtype_sensor"]), 'motes/sensor.c'), ('motes/{}.c'.format(params["mtype_malicious"]), 'motes/malicious.c'), 'motes/Makefile', 'Makefile', 'simulation.csc', 'script.js') # create experiment's files from templates then clean the templates folder replacements = render_templates(path, **params) remove_folder(templates) # now, write the config file without the list of motes del params['motes'] write_config(path, params) # now compile with settings(hide(*HIDDEN_ALL), warn_only=True): with_malicious = join(path, 'with-malicious', 'motes') without_malicious = join(path, 'without-malicious', 'motes') contiki = join(with_malicious, 'contiki') contiki_rpl = join(contiki, 'core', 'net', 'rpl') # copy a reduced version of Contiki where the debug flags can be set for RPL files set in DEBUG_FILES copy_folder(CONTIKI_FOLDER, with_malicious, includes=get_contiki_includes(params["target"], params["malicious_target"])) apply_debug_flags(contiki_rpl, debug=['NONE', 'PRINT'][params["debug"]]) with lcd(with_malicious): # first, compile root and sensor mote types croot, csensor = 'root.{}'.format(params["target"]), 'sensor.{}'.format(params["target"]) if reuse_bin_path is None or reuse_bin_path == with_malicious: logger.debug(" > Making '{}'...".format(croot)) stderr(local)("make root CONTIKI={}".format(contiki), capture=True) logger.debug(" > Making '{}'...".format(csensor)) stderr(local)("make sensor CONTIKI={}".format(contiki), capture=True) # here, files are moved ; otherwise, 'make clean' would also remove *.z1 move_files(with_malicious, without_malicious, croot, csensor) # after compiling, clean artifacts local('make clean') remove_files(with_malicious, 'root.c', 'sensor.c') else: copy_files(reuse_bin_path, without_malicious, croot, csensor) # second, handle the malicious mote compilation malicious = 'malicious.{}'.format(params["malicious_target"]) if ext_lib is not None: remove_folder(contiki_rpl) copy_folder(ext_lib, contiki_rpl) apply_replacements(contiki_rpl, replacements) logger.debug(" > Making '{}'...".format(malicious)) stderr(local)("make malicious CONTIKI={} TARGET={}" .format(contiki, params["malicious_target"]), capture=True) # temporary move compiled malicious mote, clean the compilation artifacts, move the malicious mote back # from the temporary location and copy compiled root and sensor motes move_files(with_malicious, without_malicious, malicious) local('make clean') move_files(without_malicious, with_malicious, malicious) copy_files(without_malicious, with_malicious, croot, csensor) # finally, remove compilation sources remove_files(with_malicious, 'malicious.c') remove_folder(contiki)
def setup(silent=False, **kwargs): """ Setup the framework. """ recompile = False # adapt IPv6 debug mode modify_ipv6_debug(CONTIKI_FOLDER) # install Cooja modifications if not check_cooja(COOJA_FOLDER): logger.debug(" > Installing Cooja add-ons...") # modify Cooja.java and adapt build.xml and ~/.cooja.user.properties modify_cooja(COOJA_FOLDER) update_cooja_build(COOJA_FOLDER) update_cooja_user_properties() recompile = True # install VisualizerScreenshot plugin in Cooja visualizer = join(COOJA_FOLDER, 'apps', 'visualizer_screenshot') if not exists(visualizer): logger.debug(" > Installing VisualizerScreenshot Cooja plugin...") copy_folder('src/visualizer_screenshot', visualizer) recompile = True # recompile Cooja for making the changes take effect if recompile: with lcd(CONTIKI_FOLDER): local('git submodule update --init') with lcd(COOJA_FOLDER): logger.debug(" > Recompiling Cooja...") with hide(*HIDDEN_ALL): for cmd in ["clean", "jar"]: output = local("ant {}".format(cmd), capture=True) info, error = False, False for line in output.split('\n'): if line.strip() == "": info, error = False, False elif line.startswith("BUILD"): info, error = "SUCCESSFUL" in line, "FAILED" in line if info or error: getattr( logger, "debug" if info else "error" if error else "warn")(line) else: logger.debug(" > Cooja is up-to-date") # install imagemagick with hide(*HIDDEN_ALL): imagemagick_apt_output = local('apt-cache policy imagemagick', capture=True) if 'Unable to locate package' in imagemagick_apt_output: logger.debug(" > Installing imagemagick package...") local('sudo apt-get install imagemagick -y &') else: logger.debug(" > Imagemagick is installed") # install msp430 (GCC) upgrade with hide(*HIDDEN_ALL): msp430_version_output = local('msp430-gcc --version', capture=True) if 'msp430-gcc (GCC) 4.7.0 20120322' not in msp430_version_output: txt = "In order to extend msp430x memory support, it is necessary to upgrade msp430-gcc.\n" \ "Would you like to upgrade it now ? (yes|no) [default: no] " if silent or std_input(txt, 'yellow') == "yes": logger.debug( " > Upgrading msp430-gcc from version 4.6.3 to 4.7.0...") logger.warning( "If you encounter problems with this upgrade, please refer to:\n" "https://github.com/contiki-os/contiki/wiki/MSP430X") with lcd('src/'): logger.warning( " > Upgrade now starts, this may take up to 30 minutes...") local('sudo ./upgrade-msp430.sh') local('sudo rm -r tmp/') local('export PATH=/usr/local/msp430/bin:$PATH') register_new_path_in_profile() else: logger.warning("Upgrade of library msp430-gcc aborted") logger.warning( "You may experience problems of mote memory size at compilation" ) else: logger.debug(" > Library msp430-gcc is up-to-date (version 4.7.0)") # create a new desktop shortcut for the framework desktop = expanduser('~/Desktop') shortcut = join(desktop, 'rpl-attacks-framework.desktop') if not exists(desktop): makedirs(desktop) if not exists(shortcut): with hide(*HIDDEN_ALL): local('sudo cp {} /usr/share/icons/hicolor/scalable/apps/'.format( join(FRAMEWORK_FOLDER, 'src/rpla-icon.svg'))) local('sudo gtk-update-icon-cache /usr/share/icons/hicolor') with open(shortcut, 'w+') as f: f.write(SHORTCUT.format(path=FRAMEWORK_FOLDER)) chmod(shortcut, int('775', 8)) logger.debug(" > Desktop shortcut created") else: logger.debug(" > Desktop shortcut already exists")
def __remake(name, build=False, **kwargs): """ Remake the malicious mote of an experiment. (meaning that it lets all simulation's files unchanged except ./motes/malicious.[target]) :param name: experiment name :param path: expanded path of the experiment (dynamically filled in through 'command' decorator with 'expand' """ set_logging(kwargs.get('loglevel')) path = kwargs['path'] logger.debug(" > Retrieving parameters...") params = read_config(path) ext_lib = params.get("ext_lib") if ext_lib and not exists(ext_lib): logger.error("External library does not exist !") logger.critical("Make aborted.") return False logger.debug(" > Recompiling malicious mote...") # remove former compiled malicious mote and prepare the template templates = get_path(path, 'templates', create=True) get_path(templates, 'motes', create=True) copy_files( (TEMPLATES_FOLDER, 'experiment'), templates, ('motes/{}.c'.format(params["mtype_malicious"]), 'motes/malicious.c')) # recreate malicious C file from template and clean the temporary template replacements = render_templates(path, only_malicious=True, **params) # then clean the temporary folder with templates remove_folder(templates) # now recompile with settings(hide(*HIDDEN_ALL), warn_only=True): with_malicious = join(path, 'with-malicious', 'motes') without_malicious = join(path, 'without-malicious', 'motes') contiki = join(with_malicious, split(CONTIKI_FOLDER)[-1]) contiki_rpl = join(contiki, 'core', 'net', 'rpl') with lcd(with_malicious): malicious = 'malicious.{}'.format(params["malicious_target"]) croot, csensor = 'root.{}'.format( params["target"]), 'sensor.{}'.format(params["target"]) # handle the malicious mote recompilation copy_folder(CONTIKI_FOLDER, with_malicious, includes=get_contiki_includes( params["malicious_target"])) if ext_lib is not None: remove_folder(contiki_rpl) copy_folder(ext_lib, contiki_rpl) apply_replacements(contiki_rpl, replacements) if build: logger.debug(" > Building '{}'...".format(malicious)) stderr(local)( "sudo make malicious.upload CONTIKI={} TARGET={}".format( contiki, params["malicious_target"])) build = get_path(path, 'build', create=True) move_files(with_malicious, build, 'tmpimage.ihex') copy_files(with_malicious, build, malicious) else: logger.debug(" > Making '{}'...".format(malicious)) stderr(local)("make malicious CONTIKI={} TARGET={}".format( contiki, params["malicious_target"]), capture=True) move_files(with_malicious, without_malicious, malicious) local('make clean') remove_files(with_malicious, 'malicious.c') move_files(without_malicious, with_malicious, malicious) copy_files(without_malicious, with_malicious, croot, csensor) remove_folder(contiki)
def __make(name, ask=True, **kwargs): """ Make a new experiment. :param name: experiment name (or path to the experiment, if expanded in the 'command' decorator) :param ask: ask confirmation :param path: expanded path of the experiment (dynamically filled in through 'command' decorator with 'expand' :param kwargs: simulation keyword arguments (see the documentation for more information) """ global reuse_bin_path set_logging(kwargs.get('loglevel')) path = kwargs['path'] logger.debug(" > Validating parameters...") params = validated_parameters(kwargs) ext_lib = params.get("ext_lib") if ext_lib and not exists(ext_lib): logger.error("External library does not exist !") logger.critical("Make aborded.") return False logger.debug(" > Creating simulation...") # create experiment's directories check_structure(path, create=True, remove=True) templates = get_path(path, 'templates', create=True) get_path(templates, 'motes', create=True) # select the right malicious mote template and duplicate the simulation file copy_files( (TEMPLATES_FOLDER, 'experiment'), templates, ('motes/{}.c'.format(params["mtype_root"]), 'motes/root.c'), ('motes/{}.c'.format(params["mtype_sensor"]), 'motes/sensor.c'), ('motes/{}.c'.format(params["mtype_malicious"]), 'motes/malicious.c'), 'motes/Makefile', 'Makefile', 'simulation.csc', 'script.js') # create experiment's files from templates then clean the templates folder replacements = render_templates(path, **params) remove_folder(templates) # now, write the config file without the list of motes del params['motes'] write_config(path, params) # now compile with settings(hide(*HIDDEN_ALL), warn_only=True): with_malicious = join(path, 'with-malicious', 'motes') without_malicious = join(path, 'without-malicious', 'motes') contiki = join(with_malicious, split(CONTIKI_FOLDER)[-1]) contiki_rpl = join(contiki, 'core', 'net', 'rpl') # copy a reduced version of Contiki where the debug flags can be set for RPL files set in DEBUG_FILES copy_folder(CONTIKI_FOLDER, with_malicious, includes=get_contiki_includes(params["target"], params["malicious_target"])) apply_debug_flags(contiki_rpl, debug=['NONE', 'PRINT'][params["debug"]]) with lcd(with_malicious): # first, compile root and sensor mote types croot, csensor = 'root.{}'.format( params["target"]), 'sensor.{}'.format(params["target"]) if reuse_bin_path is None or reuse_bin_path == with_malicious: logger.debug(" > Making '{}'...".format(croot)) stderr(local)("make root CONTIKI={}".format(contiki), capture=True) logger.debug(" > Making '{}'...".format(csensor)) stderr(local)("make sensor CONTIKI={}".format(contiki), capture=True) # here, files are moved ; otherwise, 'make clean' would also remove *.z1 move_files(with_malicious, without_malicious, croot, csensor) # after compiling, clean artifacts local('make clean') remove_files(with_malicious, 'root.c', 'sensor.c') else: copy_files(reuse_bin_path, without_malicious, croot, csensor) # second, handle the malicious mote compilation malicious = 'malicious.{}'.format(params["malicious_target"]) if ext_lib is not None: remove_folder(contiki_rpl) copy_folder(ext_lib, contiki_rpl) apply_replacements(contiki_rpl, replacements) logger.debug(" > Making '{}'...".format(malicious)) stderr(local)("make malicious CONTIKI={} TARGET={}".format( contiki, params["malicious_target"]), capture=True) # temporary move compiled malicious mote, clean the compilation artifacts, move the malicious mote back # from the temporary location and copy compiled root and sensor motes move_files(with_malicious, without_malicious, malicious) local('make clean') move_files(without_malicious, with_malicious, malicious) copy_files(without_malicious, with_malicious, croot, csensor) # finally, remove compilation sources remove_files(with_malicious, 'malicious.c') remove_folder(contiki)
def setup(silent=False, **kwargs): """ Setup the framework. """ recompile = False # install Cooja modifications if not check_cooja(COOJA_FOLDER): logger.debug(" > Installing Cooja add-ons...") # modify Cooja.java and adapt build.xml and ~/.cooja.user.properties modify_cooja(COOJA_FOLDER) update_cooja_build(COOJA_FOLDER) update_cooja_user_properties() recompile = True # install VisualizerScreenshot plugin in Cooja visualizer = join(COOJA_FOLDER, 'apps', 'visualizer_screenshot') if not exists(visualizer): logger.debug(" > Installing VisualizerScreenshot Cooja plugin...") copy_folder('src/visualizer_screenshot', visualizer) recompile = True # recompile Cooja for making the changes take effect if recompile: with lcd(COOJA_FOLDER): logger.debug(" > Recompiling Cooja...") with settings(warn_only=True): local("ant clean") local("ant jar") else: logger.debug(" > Cooja is up-to-date") # install imagemagick with hide(*HIDDEN_ALL): imagemagick_apt_output = local('apt-cache policy imagemagick', capture=True) if 'Unable to locate package' in imagemagick_apt_output: logger.debug(" > Installing imagemagick package...") sudo("apt-get install imagemagick -y &") else: logger.debug(" > Imagemagick is installed") # install msp430 (GCC) upgrade with hide(*HIDDEN_ALL): msp430_version_output = local('msp430-gcc --version', capture=True) if 'msp430-gcc (GCC) 4.7.0 20120322' not in msp430_version_output: txt = "In order to extend msp430x memory support, it is necessary to upgrade msp430-gcc.\n" \ "Would you like to upgrade it now ? (yes|no) [default: no] " answer = std_input(txt, 'yellow') if answer == "yes": logger.debug( " > Upgrading msp430-gcc from version 4.6.3 to 4.7.0...") logger.warning( "If you encounter problems with this upgrade, please refer to:\n" "https://github.com/contiki-os/contiki/wiki/MSP430X") with lcd('src/'): logger.warning( " > Upgrade now starts, this may take up to 30 minutes...") sudo('./upgrade-msp430.sh') sudo('rm -r tmp/') local('export PATH=/usr/local/msp430/bin:$PATH') register_new_path_in_profile() else: logger.warning("Upgrade of library msp430-gcc aborted") logger.warning( "You may experience problems of mote memory size at compilation" ) else: logger.debug(" > Library msp430-gcc is up-to-date (version 4.7.0)")