initscripts are now triggered through rc via a generic /etc/init.d/vinit
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 21 Jun 2010 14:54:01 +0000 (14:54 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 21 Jun 2010 14:54:01 +0000 (14:54 +0000)
that script is always installed and chkconfig-enabled
it then checks for /etc/init.d/vinit.slice, from the initscript tag
this way this process group correctly gets wiped when the sliver is shutdown
this was confirmed to not be the case formerly

NodeManager.spec
logger.py
sliver-initscripts/vinit [new file with mode: 0755]
sliver_vs.py

index e3ecd3c..be9e623 100644 (file)
@@ -65,6 +65,11 @@ local operations on slices.
 rm -rf $RPM_BUILD_ROOT
 %{__make} %{?_smp_mflags} install DESTDIR="$RPM_BUILD_ROOT"
 
+# install the sliver initscript (that triggers the slice initscript if any)
+mkdir -p $RPM_BUILD_ROOT/usr/share/NodeManager/sliver-initscripts/
+rsync -av sliver-initscripts/ $RPM_BUILD_ROOT/usr/share/NodeManager/sliver-initscripts/
+chmod 755 $RPM_BUILD_ROOT/usr/share/NodeManager/sliver-initscripts/
+
 mkdir -p $RPM_BUILD_ROOT/%{_initrddir}/
 rsync -av initscripts/ $RPM_BUILD_ROOT/%{_initrddir}/
 chmod 755 $RPM_BUILD_ROOT/%{_initrddir}/*
index f008806..a252ef3 100644 (file)
--- a/logger.py
+++ b/logger.py
@@ -67,7 +67,7 @@ def log_data_in_file (data, file, message="",level=LOG_NODE):
         pp=pprint.PrettyPrinter(stream=f,indent=2)
         pp.pprint(data)
         f.close()
-        log("logger:.log_data_in_file Owerwrote %s"%file)
+        verbose("logger:.log_data_in_file Owerwrote %s"%file)
     except:
         log_exc('logger.log_data_in_file failed - file=%s - message=%r'%(file,message))
 
diff --git a/sliver-initscripts/vinit b/sliver-initscripts/vinit
new file mode 100755 (executable)
index 0000000..5f55b55
--- /dev/null
@@ -0,0 +1,78 @@
+#!/bin/bash
+#
+# $Id$
+# $URL$
+#
+# vinit - trigger the slice-local initscript as installed in /etc/rc.d/vinit.slice
+#
+# this is unconditionnally installed and activated in the sliver
+# but of course nothing is run if the script is not present 
+#
+# note - for practical reasons this is *not* activated through chkconfig
+# as the slice has not yet started at that point
+#
+# historical note
+# historically planetlab initscripts have not been required to handle the 'stop' method
+# so installing such a script directly as /etc/rc.d/vinit would result in the
+# script .. being run a second time at vserver-stop time
+
+
+# Source function library.
+. /etc/init.d/functions
+
+slicescript=/etc/rc.d/init.d/vinit.slice
+basename=$(basename $slicescript)
+slicename=$(cat /etc/slicename)
+
+prog="Slice initscript ${basename}@${slicename}"
+lockfile=/var/lock/subsys/vinit
+
+RETVAL=0
+
+function start() {
+    if [ ! -x $slicescript ] ; then
+       echo "vinit@$slicename: no executable $slicescript - ignored"
+       return 0
+    fi
+    echo $"Starting $prog" 
+    $slicescript start $slicename >& /var/log/vinit &
+    touch ${lockfile}
+    return 0
+}
+
+# the initial model came without a stop function; legacy ...
+function stop() {
+    echo $"(Dummy) Stopping $prog "
+    rm -f ${lockfile}
+}
+
+function status () {
+    if [ -f ${lockfile} ] ; then
+       echo "$prog seems to have run"
+       return 0
+    else
+       echo "$prog apparently hasn't run"
+       return 1
+    fi
+} 
+
+case "$1" in
+    start)
+       start
+       RETVAL=$?
+       ;;
+    stop)
+       stop
+       RETVAL=$?
+       ;;
+    status)
+       status 
+       RETVAL=$?
+       ;;
+    *)
+       echo $"Usage: $0 {start|stop|status}"
+       exit 1
+       ;;
+esac
+
+exit $RETVAL
index 329f838..d269b81 100644 (file)
@@ -133,8 +133,36 @@ class Sliver_VS(accounts.Account, vserver.VServer):
 
         accounts.Account.configure(self, rec)  # install ssh keys
 
+    # mimicking chkconfig for enabling the generic vinit script
+    # this is hardwired for runlevel 3
+    def install_and_enable_vinit (self):
+        vinit_source="/usr/share/NodeManager/sliver-initscripts/vinit"
+        vinit_script="/vservers/%s/etc/rc.d/init.d/vinit"%self.name
+        rc3_link="/vservers/%s/etc/rc.d/rc3.d/S99vinit"%self.name
+        rc3_target="../init.d/vinit"
+        # install in sliver
+        try:
+            logger.log("vsliver_vs: %s: installing generic vinit rc script"%self.name)
+            body=file(vinit_source).read()
+            flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
+            fd = os.open(vinit_script, flags, 0755)
+            os.write(fd, body)
+            os.close(fd)
+        except:
+            logger.log_exc("vsliver_vs: %s: could not install generic vinit script"%self.name)
+        # create symlink for runlevel 3
+        if not os.path.islink(rc3_link):
+           try:
+               logger.log("vsliver_vs: %s: installing generic vinit rc script"%self.name)
+               os.symlink(rc3_target,rc3_link)
+           except:
+               logger.log_exc("vsliver_vs: %s: failed to install runlevel3 link")
+        
+
     def start(self, delay=0):
-        if self.rspec['enabled'] > 0:
+        if self.rspec['enabled'] <= 0: 
+            logger.log('sliver_vs: not starting %s, is not enabled'%self.name)
+        else:
             logger.log('sliver_vs: %s: starting in %d seconds' % (self.name, delay))
             time.sleep(delay)
             # VServer.start calls fork() internally, 
@@ -142,22 +170,29 @@ class Sliver_VS(accounts.Account, vserver.VServer):
             child_pid = os.fork()
             if child_pid == 0:
                 if self.initscriptchanged:
-                    logger.log('sliver_vs: %s: installing initscript' % self.name)
-                    def install_initscript():
-                        flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
-                        fd = os.open('/etc/rc.vinit', flags, 0755)
-                        os.write(fd, self.initscript)
-                        os.close(fd)
-                    try:
-                        self.chroot_call(install_initscript)
-                    except: logger.log_exc("sliver_vs: start",name=self.name)
-                tools.close_nonstandard_fds()
-                vserver.VServer.start(self)
-                os._exit(0)
+                    # unconditionnally install and enable the generic vinit script
+                    # this one checks for the existence of the slice initscript
+                    self.install_and_enable_vinit()
+                    # install or remove the slice inistscript, as instructed by the initscript tag
+                    sliver_initscript="/vservers/%s/etc/rc.d/init.d/vinit.slice"%self.name
+                    if not self.initscript:
+                        logger.log("sliver_vs: %s: unlinking initscript %s"%(self.name,sliver_initscript))
+                        os.unlink(sliver_initscript)
+                    else:
+                        logger.log("sliver_vs: %s: installing new initscript %s"%(self.name,sliver_initscript))
+                        try:
+                            flags = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
+                            fd = os.open(sliver_initscript, flags, 0755)
+                            os.write(fd, self.initscript)
+                            os.close(fd)
+                        except:
+                            logger.log_exc("sliver_vs: %s - could not install initscript"%self.name)
+                    tools.close_nonstandard_fds()
+                    vserver.VServer.start(self)
+                    os._exit(0)
             else: 
                 os.waitpid(child_pid, 0)
                 self.initscriptchanged = False
-        else: logger.log('sliver_vs: not starting %s, is not enabled'%self.name)
 
     def stop(self):
         logger.log('sliver_vs: %s: stopping' % self.name)