diff --git a/bin/isinstall b/bin/isinstall index b1878a77dde74ab2395314a59f27adc441ae6d2d..84a74e0bcbf83712e82c60c3827cad938c421c80 100755 --- a/bin/isinstall +++ b/bin/isinstall @@ -52,10 +52,9 @@ try: # load config config = ConfigFile("isinstall", args.config) # looks if arguments is a file or image name - image_name_type = istools.pathtype(args.image_name) - if image_name_type == "file": + if istools.pathtype(args.image_name) == "file" and os.path.isfile(args.image_name): pkg = PackageImage(istools.abspath(args.image_name)) - elif image_name_type == "name": + elif PackageImage.check_image_name(args.image_name): # remove cache is asked if args.no_cache: config.cache = None @@ -74,17 +73,13 @@ try: exit(1) # install start time t0 = time.time() - # global dict of execution context - gl_exec = { "parser": p_main } - # run parser scripts - pkg.run_parser(gl_exec) + # run parser scripts with parser parser argument + pkg.run_parser(parser=p_main) # call parser again, with extended attributes - arrow("Run parser", 1, args.verbose) + arrow("Parsing arguments", 1, args.verbose) args = p_main.parse_args() - # add parser result to global dict - gl_exec["args"] = args # run setup scripts - pkg.run_setup(gl_exec) + pkg.run_setup(namespace = args) # compute building time t1 = time.time() dt = int(t1 - t0) diff --git a/installsystems/image.py b/installsystems/image.py index 5ddcb2da584d040ae2f93b3b319b0fbc7b171d93..fdead34c384dbc34cc6557504b8245b7e3faa530 100644 --- a/installsystems/image.py +++ b/installsystems/image.py @@ -375,21 +375,19 @@ class PackageImage(Image): arrow(pay_name, 2, self.verbose) pay_obj.check() - def run_parser(self, gl): + def run_parser(self, **kwargs): ''' Run parser scripts ''' - gl["image"] = self - self._run_scripts(gl, "parser") + self._run_scripts("parser", **kwargs) - def run_setup(self, gl): + def run_setup(self, **kwargs): ''' Run setup scripts ''' - gl["image"] = self - self._run_scripts(gl, "setup") + self._run_scripts("setup", **kwargs) - def _run_scripts(self, gl, directory): + def _run_scripts(self, directory, **kwargs): ''' Run scripts in a tarball directory ''' @@ -401,16 +399,29 @@ class PackageImage(Image): # run scripts for n_scripts in l_scripts: arrow(os.path.basename(n_scripts), 2, self.verbose) + # extract source code try: s_scripts = self._tarball.get_str(n_scripts) except Exception as e: raise Exception("Extracting script %s fail: %s" % - (os.path.basename(n_scripts), e)) + (n_scripts, e)) + # compile source code try: - exec(s_scripts, gl, dict()) + o_scripts = compile(s_scripts, n_scripts, "exec") + except Exception as e: + raise Exception("Unable to compile %s fail: %s" % + (n_scripts, e)) + # define execution context + gl = {} + for k in kwargs: + gl[k] = kwargs[k] + gl["image"] = self + # execute source code + try: + exec o_scripts in gl except Exception as e: raise Exception("Execution script %s fail: %s" % - (os.path.basename(n_scripts), e)) + (n_scripts, e)) class Payload(object): @@ -438,7 +449,7 @@ class Payload(object): raise AttributeError def __setattr__(self, name, value): - # set all value which exists have no underscore, but undesrcore exists + # set all value which exists have no underscore, but where undesrcore exists if name in self.legit_attr: object.__setattr__(self, "_%s" % name, value) else: diff --git a/installsystems/template.py b/installsystems/template.py index af960e5801d24f745e5ca1b8064ce389a91581da..f24bd7eb40615c8aba35d0af91fbf17469afe152 100644 --- a/installsystems/template.py +++ b/installsystems/template.py @@ -12,8 +12,20 @@ author = parser = """# -*- python -*- # -*- coding: utf-8 -*- +# image object is a reference to current image +# parser object is installsystems argument parser + +import os +import installsystems.argparse as argparse + +class TargetAction(argparse.Action): + def __call__(self, parser, namespace, values, option_string=None): + if not os.path.isdir(values): + raise Exception("Invalid target directory %s" % values) + namespace.target = values + parser.add_argument("-n", "--hostname", dest="hostname", type=str, required=True) -parser.add_argument("target", type=str, +parser.add_argument("target", type=str, action=TargetAction, help="target installation directory") # vim:set ts=2 sw=2 noet: @@ -22,9 +34,13 @@ parser.add_argument("target", type=str, setup = """# -*- python -*- # -*- coding: utf-8 -*- -print "hostname: %s" % args.hostname +# image object is a reference to current image +# namespace object is the persistant, it can be used to store data accross scripts + +print "hostname: %s" % namespace.hostname -image.payload["rootfs"].extract(args.target) +# uncomment to extract payload named root in namespace.target directory +#image.payload["rootfs"].extract(namespace.target) # vim:set ts=2 sw=2 noet: """ diff --git a/installsystems/tools.py b/installsystems/tools.py index d45d04237c67c14a1625a8954b991bbfd8a7e607..1f3e9f854798bf04984da47e914ffa551114b12e 100644 --- a/installsystems/tools.py +++ b/installsystems/tools.py @@ -81,18 +81,14 @@ def chrights(path, uid=None, gid=None, mode=None, mtime=None): def pathtype(path): '''Return path type. This is usefull to know what kind of path is given''' - from installsystems.image import Image if path.startswith("http://") or path.startswith("https://"): return "http" if path.startswith("ftp://") or path.startswith("ftps://"): return "ftp" elif path.startswith("ssh://"): return "ssh" - elif path.startswith("file://") or path.startswith("/") or os.path.exists(path): + else: return "file" - elif Image.check_image_name(path): - return "name" - return None def abspath(path): '''Format a path to be absolute'''