From: Daniel Hokka Zakrisson Date: Mon, 7 Jul 2008 16:02:42 +0000 (+0000) Subject: chrooting is not thread-safe. Install the initscript before calling VServer.start... X-Git-Tag: NodeManager-1.8-0~28 X-Git-Url: http://git.onelab.eu/?p=nodemanager.git;a=commitdiff_plain;h=fb5967c9d175cf3bfb8e41b805fe60aec20831a8 chrooting is not thread-safe. Install the initscript before calling VServer.start instead, where we know we're the only thread running. --- diff --git a/sliver_vs.py b/sliver_vs.py index b889e32..90b2ca7 100644 --- a/sliver_vs.py +++ b/sliver_vs.py @@ -166,16 +166,7 @@ class Sliver_VS(accounts.Account, vserver.VServer): new_initscript = rec['initscript'] if new_initscript != self.initscript: self.initscript = new_initscript - logger.log('%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, new_initscript) - os.close(fd) - try: - self.chroot_call(install_initscript) - self.initscriptchanged = True - except: logger.log_exc(self.name) + self.initscriptchanged = True accounts.Account.configure(self, rec) # install ssh keys @@ -185,6 +176,17 @@ class Sliver_VS(accounts.Account, vserver.VServer): time.sleep(delay) child_pid = os.fork() if child_pid == 0: + if self.initscriptchanged: + logger.log('%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, new_initscript) + os.close(fd) + try: + self.chroot_call(install_initscript) + self.initscriptchanged = False + except: logger.log_exc(self.name) # VServer.start calls fork() internally, # so just close the nonstandard fds and fork once to avoid creating zombies tools.close_nonstandard_fds() @@ -192,7 +194,6 @@ class Sliver_VS(accounts.Account, vserver.VServer): os._exit(0) else: os.waitpid(child_pid, 0) else: logger.log('%s: not starting, is not enabled' % self.name) - self.initscriptchanged = False def stop(self): logger.log('%s: stopping' % self.name)