def rm_rf(self, path): # some basic protection no_rm_dirs = ( os.path.expanduser('~'), '/', '/bin', '/boot', '/dev', '/etc', '/home', '/lib', '/lib64', '/opt', '/root', '/run', '/sbin', '/usr', '/var' ) no_rm_dirs = [os.path.normpath(d) for d in no_rm_dirs] norm_path = os.path.normpath(path) if norm_path in no_rm_dirs: perror('Not removing protected directory "{}"'.format(norm_path)) cmd = 'rm -rf {}'.format(_sq(path)) self.run(cmd)
def rm_rf(self, path): # some basic protection no_rm_dirs = ( os.path.expanduser('~'), '/', '/bin', '/boot', '/dev', '/etc', '/home', '/lib', '/lib64', '/opt', '/root', '/run', '/sbin', '/usr', '/var' ) no_rm_dirs = [os.path.normpath(d) for d in no_rm_dirs] norm_path = os.path.normpath(path) if norm_path in no_rm_dirs: perror('Not removing protected directory "{}"'.format(norm_path)) cmd = 'rm -rf {}'.format(_sq(path)) self.run(cmd)
def _run_line(self, cmd): _pcmd(cmd) stdio = None if self._verbose else subprocess.DEVNULL popen = subprocess.Popen(cmd, stdin=None, stdout=stdio, stderr=stdio, shell=True, cwd=self._cwd, env=self._env) popen.wait() if popen.returncode != 0: perror('Command exited with status {}'.format(popen.returncode))
def _run_line(self, cmd): _pcmd(cmd) stdio = None if self._verbose else subprocess.DEVNULL popen = subprocess.Popen(cmd, stdin=None, stdout=stdio, stderr=stdio, shell=True, cwd=self._cwd, env=self._env) popen.wait() if popen.returncode != 0: perror('Command exited with status {}'.format(popen.returncode))
def _get_full_env(env, paths): new_env = copy.deepcopy(os.environ) try: new_env.update(env) except: perror('Invalid environment in profile') _patch_env(new_env, paths) return new_env
def _get_full_env(env, paths): new_env = copy.deepcopy(os.environ) try: new_env.update(env) except: perror('Invalid environment in profile') _patch_env(new_env, paths) return new_env
def _create(self): self._validate_profile() _pinfo('Create LTTng virtual environment') # create virtual environment directory if os.path.exists(self._paths.venv): if self._force: _pwarn( 'Virtual environment path "{}" exists: removing directory'. format(self._paths.venv)) self._runner.rm_rf(self._paths.venv) else: perror( 'Virtual environment path "{}" exists (use --force to overwrite)' .format(self._paths.venv)) self._runner.mkdir_p(self._paths.venv) self._runner.mkdir_p(self._paths.home) self._runner.mkdir_p(self._paths.bin) self._runner.mkdir_p(self._paths.lib) self._runner.mkdir_p(self._paths.include) self._runner.mkdir_p(self._paths.opt) self._runner.mkdir_p(self._paths.share_java) # fetch sources and extract/checkout _pinfo('Fetch sources') self._fetch_sources() # create build instructions for projects to build self._create_project_instructions() # build projects in this order self._build_project('urcu') self._build_project('popt') self._build_lttng_ust() self._build_project('libxml2') self._build_project('lttng-tools') self._build_project('lttng-modules') self._build_project('glib') self._build_project('elfutils') self._build_project('babeltrace') self._build_project('babeltrace2') self._build_project('lttng-analyses') self._build_project('tracecompass') self._build_project('lttng-scope') # create activate script self._create_activate()
def _find_profile(profile_name): try: filename = os.path.join(_PROFILES_DIRNAME, '{}.yml'.format(profile_name)) filename = resource_filename(__name__, filename) if not os.path.isfile(filename): filename = profile_name except: filename = profile_name if not os.path.isfile(filename): perror('Cannot find profile "{}"'.format(profile_name)) return filename
def _find_profile(profile_name): try: filename = os.path.join(vlttng._PROFILES_DIRNAME, '{}.yml'.format(profile_name)) filename = pkg_resources.resource_filename(__name__, filename) if not os.path.isfile(filename): filename = profile_name except: filename = profile_name if not os.path.isfile(filename): perror('Cannot find profile "{}"'.format(profile_name)) return filename
def _parse_args(): ap = argparse.ArgumentParser() ap.add_argument('-f', '--force', action='store_true', help='force the virtual environment creation') ap.add_argument('--hide-export', action='store_true', help='hide export lines') ap.add_argument('-i', '--ignore-project', metavar='PROJECT', action='append', help='ignore project PROJECT (may be repeated)') ap.add_argument('-j', '--jobs', nargs='?', const=None, metavar='JOBS', action='store', type=int, default=1, help='number of make jobs to run simultaneously') ap.add_argument('-l', '--list-default-profiles', action='store_true', help='list default profile names and exit') ap.add_argument('-o', '--override', metavar='PROP', action='append', help='override property in the effective profile (may be repeated)') ap.add_argument('-p', '--profile', metavar='PROFILE', action='append', help='profile name or path (may be repeated to patch)') ap.add_argument('-v', '--verbose', action='store_true', help='verbose output') ap.add_argument('-V', '--version', action='version', version='%(prog)s {}'.format(vlttng.__version__)) ap.add_argument('path', metavar='PATH', action='store', nargs='*', help='virtual environment path') # parse args args = ap.parse_args() if not args.list_default_profiles and len(args.path) != 1: perror('Exactly one virtual environment path must be provided') if len(args.path) > 0: args.path = args.path[0] if args.ignore_project is None: args.ignore_project = [] if args.profile is None: args.profile = [] if args.override is None: args.override = [] return args
def run(): _register_sigint() args = _parse_args() if args.list_default_profiles: _list_default_profiles() return 0 profile = _create_profile(args.profile, args.ignore_project, args.override, args.verbose) try: vlttng.venv.VEnvCreator(args.path, profile, args.force, args.verbose, args.jobs, args.hide_export) except Exception as e: perror('Unexpected error: {}'.format(e)) return 0
def run(): _register_sigint() args = _parse_args() if args.list_default_profiles: _list_default_profiles() return 0 profile = _create_profile(args.profile, args.ignore_project, args.override, args.verbose) try: vlttng.venv.VEnvCreator(args.path, profile, args.force, args.verbose, args.jobs, args.hide_export) except Exception as e: perror('Unexpected error: {}'.format(e)) return 0
def _create(self): self._validate_profile() _pinfo('Create LTTng virtual environment') # create virtual environment directory if os.path.exists(self._paths.venv): if self._force: _pwarn('Virtual environment path "{}" exists: removing directory'.format(self._paths.venv)) self._runner.rm_rf(self._paths.venv) else: perror('Virtual environment path "{}" exists (use --force to overwrite)'.format(self._paths.venv)) self._runner.mkdir_p(self._paths.venv) self._runner.mkdir_p(self._paths.home) self._runner.mkdir_p(self._paths.bin) self._runner.mkdir_p(self._paths.lib) self._runner.mkdir_p(self._paths.include) self._runner.mkdir_p(self._paths.opt) self._runner.mkdir_p(self._paths.share_java) # fetch sources and extract/checkout _pinfo('Fetch sources') self._fetch_sources() # create build instructions for projects to build self._create_project_instructions() # build projects in this order self._build_project('urcu') self._build_project('popt') self._build_lttng_ust() self._build_project('libxml2') self._build_project('lttng-tools') self._build_project('lttng-modules') self._build_project('glib') self._build_project('elfutils') self._build_project('babeltrace') self._build_project('lttng-analyses') self._build_project('tracecompass') self._build_project('lttng-scope') # create activate script self._create_activate()
def _create_overrides(override_args): overrides = [] try: for arg in override_args: arg = arg.strip() # replace m = re.match(r'^([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)*)=(.+)$', arg) if m: path = m.group(1).split('.') rep = m.group(2) op = vlttng.profile.Override.OP_REPLACE overrides.append(vlttng.profile.Override(path, op, rep)) continue # append m = re.match(r'^([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)*)\+=(.+)$', arg) if m: path = m.group(1).split('.') rep = m.group(2) op = vlttng.profile.Override.OP_APPEND overrides.append(vlttng.profile.Override(path, op, rep)) continue # remove m = re.match(r'^!([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)*)$', arg) if m: path = m.group(1).split('.') op = vlttng.profile.Override.OP_REMOVE overrides.append(vlttng.profile.Override(path, op, None)) continue perror('Malformed override option: "{}"'.format(arg)) except vlttng.profile.InvalidOverride as e: perror('In override option: "{}": {}'.format(arg, e)) return overrides
def _create_overrides(override_args): overrides = [] try: for arg in override_args: arg = arg.strip() # replace m = re.match(r'^([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)*)=(.+)$', arg) if m: path = m.group(1).split('.') rep = m.group(2) op = vlttng.profile.Override.OP_REPLACE overrides.append(vlttng.profile.Override(path, op, rep)) continue # append m = re.match(r'^([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)*)\+=(.+)$', arg) if m: path = m.group(1).split('.') rep = m.group(2) op = vlttng.profile.Override.OP_APPEND overrides.append(vlttng.profile.Override(path, op, rep)) continue # remove m = re.match(r'^!([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)*)$', arg) if m: path = m.group(1).split('.') op = vlttng.profile.Override.OP_REMOVE overrides.append(vlttng.profile.Override(path, op, None)) continue perror('Malformed override option: "{}"'.format(arg)) except vlttng.profile.InvalidOverride as e: perror('In override option: "{}": {}'.format(arg, e)) return overrides
def _create_profile(profile_names, ignored_projects, override_args, verbose): filenames = [] try: overrides = _create_overrides(override_args) except Exception as e: perror('Cannot parse overrides: {}'.format(e)) for profile_name in profile_names: filenames.append(_find_profile(profile_name)) try: profile = vlttng.profile.from_yaml_files(filenames, ignored_projects, overrides, verbose) except vlttng.profile.ParseError: perror('Malformed YAML profile') except vlttng.profile.UnknownSourceFormat as e: perror('Unknown source format: "{}"'.format(e.source)) except vlttng.profile.InvalidProfile as e: perror('Invalid profile: {}'.format(e)) except: perror('Cannot read one of the specified profiles') return profile
def _create_profile(profile_names, ignored_projects, override_args, verbose): filenames = [] try: overrides = _create_overrides(override_args) except Exception as e: perror('Cannot parse overrides: {}'.format(e)) for profile_name in profile_names: filenames.append(_find_profile(profile_name)) try: profile = vlttng.profile.from_yaml_files(filenames, ignored_projects, overrides, verbose) except vlttng.profile.ParseError: perror('Malformed YAML profile') except vlttng.profile.UnknownSourceFormat as e: perror('Unknown source format: "{}"'.format(e.source)) except vlttng.profile.InvalidProfile as e: perror('Invalid profile: {}'.format(e)) except: perror('Cannot read one of the specified profiles') return profile
def handler(signal, frame): perror('Cancelled by user')
def handler(signal, frame): perror('Cancelled by user')
def handler(signal, frame): perror('Cancelled by user: virtual environment is incomplete')
def _parse_args(): ap = argparse.ArgumentParser() ap.add_argument('-f', '--force', action='store_true', help='force the virtual environment creation') ap.add_argument('--hide-export', action='store_true', help='hide export lines') ap.add_argument('-i', '--ignore-project', metavar='PROJECT', action='append', help='ignore project PROJECT (may be repeated)') ap.add_argument('-j', '--jobs', nargs='?', const=None, metavar='JOBS', action='store', type=int, default=1, help='number of make jobs to run simultaneously') ap.add_argument('-l', '--list-default-profiles', action='store_true', help='list default profile names and exit') ap.add_argument( '-o', '--override', metavar='PROP', action='append', help='override property in the effective profile (may be repeated)') ap.add_argument('-p', '--profile', metavar='PROFILE', action='append', help='profile name or path (may be repeated to patch)') ap.add_argument('-v', '--verbose', action='store_true', help='verbose output') ap.add_argument('-V', '--version', action='version', version='%(prog)s {}'.format(vlttng.__version__)) ap.add_argument('path', metavar='PATH', action='store', nargs='*', help='virtual environment path') # parse args args = ap.parse_args() if not args.list_default_profiles and len(args.path) != 1: perror('Exactly one virtual environment path must be provided') if len(args.path) > 0: args.path = args.path[0] if args.ignore_project is None: args.ignore_project = [] if args.profile is None: args.profile = [] if args.override is None: args.override = [] return args
def handler(signal, frame): perror('Cancelled by user: virtual environment is incomplete')