From 8b14bf7e48b420f68ae13b1c4461bd3d1f5e5baa Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Mon, 21 Jun 2010 14:54:01 +0000 Subject: [PATCH] initscripts are now triggered through rc via a generic /etc/init.d/vinit 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 | 5 +++ logger.py | 2 +- sliver-initscripts/vinit | 78 ++++++++++++++++++++++++++++++++++++++++ sliver_vs.py | 63 ++++++++++++++++++++++++-------- 4 files changed, 133 insertions(+), 15 deletions(-) create mode 100755 sliver-initscripts/vinit diff --git a/NodeManager.spec b/NodeManager.spec index e3ecd3c..be9e623 100644 --- a/NodeManager.spec +++ b/NodeManager.spec @@ -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}/* diff --git a/logger.py b/logger.py index f008806..a252ef3 100644 --- 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 index 0000000..5f55b55 --- /dev/null +++ b/sliver-initscripts/vinit @@ -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 diff --git a/sliver_vs.py b/sliver_vs.py index 329f838..d269b81 100644 --- a/sliver_vs.py +++ b/sliver_vs.py @@ -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) -- 2.43.0