Source code for r2lab.utils

import re

from pathlib import Path

PHONES = 2

[docs] def r2lab_id(anything): """ Returns an integer from an input that can be either ``1`` (int), ``1`` (str), b``1``(bytes), ``01`` (str) , ``fit1``, ``fit01`` or even ``reboot01``. """ if isinstance(anything, bytes): anything = anything.decode(encoding='utf-8') if isinstance(anything, str): # ignore all but digits anything = re.sub(r'[^0-9]', '', anything) return int(anything)
def _r2lab_name(anything, prefix='fit'): return "{}{:02d}".format(prefix, r2lab_id(anything))
[docs] def r2lab_hostname(x): """ Return a valid hostname like ``fit01`` from an input that can be either ``1`` (int), ``1`` (str), ``01`` (str) , ``fit1``, ``fit01`` or even ``reboot01``. Args: x(str): loosely typed input that reflects node number Examples: Simple use case:: r2lab_hostname(1) == 'fit01' And:: rl2ab_hostname('reboot1') == 'fit01' """ return _r2lab_name(x, prefix='fit')
[docs] def r2lab_reboot(x): """ Same as ``r2lab_hostname`` but returns a hostname of the form ``reboot01``. """ return _r2lab_name(x, prefix='reboot')
[docs] def r2lab_data(x): """ Same as ``r2lab_hostname`` but returns an interface name of the form ``data01``. """ return _r2lab_name(x, prefix='data')
[docs] def r2lab_parse_slice(slice): """ returns username and hostname from a slice. Args: slice(str): can be either ``username@hostname`` or just ``username``. In the latter case the hostname defaults to the R2lab gateway i.e. ``faraday.inria.fr`` Returns: tuple: ``slice``, ``hostname`` Example: Typical usage is:: slice, hostname = r2lab_parse_slice("inria_r2lab.tutorial") slice, hostname = r2lab_parse_slice("inria_r2lab.tutorial@faraday.inria.fr") """ if slice.find('@') > 0: user, host = slice.split('@') return user, host else: return slice, "faraday.inria.fr"
[docs] def find_local_embedded_script(script, extra_paths=None): """ This helper is designed to find a script that typically comes with the ``r2lab-embedded`` repo, specifically in its ``shell`` subdirectory. It knows of a few heuristics to locate your ``r2lab-embedded`` repo, relative to your home and current directories. You can specify additional places to search for in ``extra_paths`` Args: script(str): the simple name of a script to find extra_paths(List(str)): optional, a list of paths (can be ``Path`` instances too) where to search too Returns: str: a valid path in the local filesystem, or ``None`` Raises: ``FileNotFoundError(script)`` if script can't be found Example: Search for ``oai-enb.sh`` so as to run it remotely:: local_script = find_local_embedded_script("oai-enb.sh") RunScript(localscript, ...) Note: Should this also look for some env. variable ? """ heuritics = [ # for people who have their git root in $HOME Path.home(), # for people who have their git root in ~/git Path.home() / "git", Path.home() / "fit-r2lab", # when in r2lab-demos/one-demo Path("../../"), # when in r2lab-demos Path(".."), Path("."), ] # convert extra paths into Paths if extra_paths is not None: heuritics += [Path(path) for path in extra_paths] # several chances each time relatives = ['r2lab-embedded/shell', 'shell', '.'] for path in heuritics: for relative in relatives: candidate = path / relative / script if candidate.exists(): return str(candidate) print("WARNING: could not find local embedded script {}".format(script)) for path in heuritics: for relative in relatives: print("W: searched in {}".format(path / relative)) raise FileNotFoundError(script)