Run certain script before creation of tar.gz image.
authorxiaojuan.mao <xiaojuan.mao@samsung.com>
Tue, 8 Aug 2017 10:27:18 +0000 (18:27 +0800)
committerxiaojuan.mao <xiaojuan.mao@samsung.com>
Wed, 9 Aug 2017 07:45:44 +0000 (15:45 +0800)
Change-Id: Id6efc3334dc19e9198251aa79b1d6b965d3df0d1

mic/3rdparty/pykickstart/constants.py
mic/3rdparty/pykickstart/parser.py
mic/3rdparty/pykickstart/sections.py
mic/imager/baseimager.py
mic/imager/loop.py
mic/kickstart/__init__.py
tests/test_configmgr.py [changed mode: 0755->0644]

index 5e12fc8..92f8325 100644 (file)
@@ -39,6 +39,7 @@ SELINUX_PERMISSIVE = 2
 KS_SCRIPT_PRE = 0
 KS_SCRIPT_POST = 1
 KS_SCRIPT_TRACEBACK = 2
+KS_SCRIPT_RUN = 3
 
 KS_WAIT = 0
 KS_REBOOT = 1
index 840a448..cf4db4c 100644 (file)
@@ -202,6 +202,8 @@ class Script(KickstartObject):
             retval += '\n%post'
         elif self.type == constants.KS_SCRIPT_TRACEBACK:
             retval += '\n%traceback'
+        elif self.type == constants.KS_SCRIPT_RUN:
+            retval += '\n%runscript'
 
         if self.interp != "/bin/sh" and self.interp != "":
             retval += " --interpreter=%s" % self.interp
@@ -699,4 +701,5 @@ class KickstartParser:
         self.registerSection(PreScriptSection(self.handler, dataObj=Script))
         self.registerSection(PostScriptSection(self.handler, dataObj=Script))
         self.registerSection(TracebackScriptSection(self.handler, dataObj=Script))
+        self.registerSection(RunScriptSection(self.handler, dataObj=Script))
         self.registerSection(PackageSection(self.handler))
index 44df856..51cba3b 100644 (file)
@@ -194,6 +194,11 @@ class TracebackScriptSection(ScriptSection):
         ScriptSection._resetScript(self)
         self._script["type"] = KS_SCRIPT_TRACEBACK
 
+class RunScriptSection(ScriptSection):
+    sectionOpen = "%runscript"
+    def _resetScript(self):
+        ScriptSection._resetScript(self)
+        self._script["type"] = KS_SCRIPT_RUN
 class PackageSection(Section):
     sectionOpen = "%packages"
 
index dd758b4..bdf059d 100755 (executable)
@@ -1154,13 +1154,50 @@ class BaseImageCreator(object):
     def postinstall(self):
         self.copy_attachment()
 
+    def run_sign_scripts(self):
+        if kickstart.get_sign_scripts(self.ks)==[]:
+            return
+        msger.info("Running sign scripts ...")
+        if os.path.exists(self._instroot + "/tmp"):
+            shutil.rmtree(self._instroot + "/tmp")
+        os.mkdir (self._instroot + "/tmp", 0755)
+        for s in kickstart.get_sign_scripts(self.ks):
+            (fd, path) = tempfile.mkstemp(prefix = "ks-runscript-",
+                                          dir = self._instroot + "/tmp")
+            s.script = s.script.replace("\r", "")
+            os.write(fd, s.script)
+            os.close(fd)
+            os.chmod(path, 0700)
+            for item in os.listdir(self._imgdir):
+                sub = os.path.splitext(item)[1]
+                if sub == ".img":
+                    shutil.move(os.path.join(self._imgdir, item),
+                                os.path.join(self._instroot + "/tmp", item))
+            oldoutdir = os.getcwd()
+            os.chdir(self._instroot + "/tmp")
+            try:
+                try:
+                    p = subprocess.Popen([s.interp, path],
+                                       stdout = subprocess.PIPE,
+                                       stderr = subprocess.STDOUT)
+                    while p.poll() == None:
+                        msger.info(p.stdout.readline().strip())
+                except OSError, (err, msg):
+                    raise CreatorError("Failed to execute %%sign script "
+                                       "with '%s' : %s" % (s.interp, msg))
+            finally:
+                os.chdir(oldoutdir)
+                os.unlink(path)
+                for item in os.listdir(self._instroot + "/tmp"):
+                    shutil.move(os.path.join(self._instroot + "/tmp", item),
+                                os.path.join(self._imgdir, item))
     def __run_post_scripts(self):
-        msger.info("Running scripts ...")
+        msger.info("Running post scripts ...")
         if os.path.exists(self._instroot + "/tmp"):
             shutil.rmtree(self._instroot + "/tmp")
         os.mkdir (self._instroot + "/tmp", 0755)
         for s in kickstart.get_post_scripts(self.ks):
-            (fd, path) = tempfile.mkstemp(prefix = "ks-script-",
+            (fd, path) = tempfile.mkstemp(prefix = "ks-postscript-",
                                           dir = self._instroot + "/tmp")
 
             s.script = s.script.replace("\r", "")
index cca8080..eab83b2 100755 (executable)
@@ -464,6 +464,7 @@ class LoopImageCreator(BaseImageCreator):
             imgsize = os.path.getsize(imgfile)
             msger.info("filesystem size of %s : %s bytes" % (item, imgsize))
 
+        self.run_sign_scripts()
         if not self.pack_to:
             for item in os.listdir(self._imgdir):
                 shutil.move(os.path.join(self._imgdir, item),
index 8ec653c..f568f99 100755 (executable)
@@ -813,6 +813,13 @@ def get_post_scripts(ks):
         scripts.append(s)
     return scripts
 
+def get_sign_scripts(ks):
+    scripts = []
+    for s in ks.handler.scripts:
+        if s.type != ksparser.KS_SCRIPT_RUN:
+            continue
+        scripts.append(s)
+    return scripts
 def add_repo(ks, repostr):
     args = repostr.split()
     repoobj = ks.handler.repo.parse(args[1:])
old mode 100755 (executable)
new mode 100644 (file)