def main(argv=None): global XEND_DAEMONIZE XEND_DAEMONIZE = False if argv is None: argv = sys.argv try: daemon = instance() r, w = os.pipe() daemon.run(os.fdopen(w, 'w')) return 0 except Exception, exn: log.fatal(exn) return 1
def main(argv = None): global XEND_DAEMONIZE XEND_DAEMONIZE = False if argv is None: argv = sys.argv try: daemon = instance() r,w = os.pipe() daemon.run(os.fdopen(w, 'w')) return 0 except Exception, exn: log.fatal(exn) return 1
def refresh(self, initialising = False): """Refresh domain list from Xen. Expects to be protected by the domains_lock. @param initialising True if this is the first refresh after starting Xend. This does not change this method's behaviour, except for logging. """ doms = self.xen_domains() for d in self.domains.values(): info = doms.get(d.getDomid()) if info: d.update(info) else: self._delete_domain(d.getDomid()) for d in doms: if d not in self.domains: if doms[d]['dying']: log.log(initialising and logging.ERROR or logging.DEBUG, 'Cannot recreate information for dying domain %d.' ' Xend will ignore this domain from now on.', doms[d]['dom']) elif d == PRIV_DOMAIN: log.fatal( "No record of privileged domain %d! Terminating.", d) sys.exit(1) else: try: self._add_domain( XendDomainInfo.recreate(doms[d], False)) except: log.exception( "Failed to recreate information for domain " "%d. Destroying it in the hope of " "recovery.", d) try: xc.domain_destroy(d) except: log.exception('Destruction of %d failed.', d)
def start(self, trace=0): """Attempts to start the daemons. The return value is defined by the LSB: 0 Success 4 Insufficient privileges """ xend_pid = self.cleanup_xend(False) if self.set_user(): return 4 os.chdir("/") if xend_pid > 0: # Trying to run an already-running service is a success. return 0 ret = 0 # If we're not going to create a daemon, simply # call the run method right here. if not XEND_DAEMONIZE: self.tracing(trace) self.run(None) return ret # we use a pipe to communicate between the parent and the child process # this way we know when the child has actually initialized itself so # we can avoid a race condition during startup r, w = os.pipe() if os.fork(): os.close(w) r = os.fdopen(r, 'r') try: s = r.read() finally: r.close() if not len(s): ret = 1 else: ret = int(s) else: os.close(r) # Child self.daemonize() self.tracing(trace) # If Xend proper segfaults, then we want to restart it. Thus, # we fork a child for running Xend itself, and if it segfaults # (or exits any way other than cleanly) then we run it again. # The first time through we want the server to write to the (r,w) # pipe created above, so that we do not exit until the server is # ready to receive requests. All subsequent restarts we don't # want this behaviour, or the pipe will eventually fill up, so # we just pass None into run in subsequent cases (by clearing w # in the parent of the first fork). On some operating systems, # restart is managed externally, so we won't fork, and just exit. while True: if not osdep.xend_autorestart: self.run(os.fdopen(w, 'w')) os._exit(0) pid = self.fork_pid() if pid: if w is not None: os.close(w) w = None (_, status) = os.waitpid(pid, 0) if os.WIFEXITED(status): code = os.WEXITSTATUS(status) log.info('Xend exited with status %d.', code) sys.exit(code) if os.WIFSIGNALED(status): sig = os.WTERMSIG(status) if sig in (signal.SIGINT, signal.SIGTERM): log.info('Xend stopped due to signal %d.', sig) sys.exit(0) else: log.fatal( 'Xend died due to signal %d! Restarting it.', sig) else: self.run(w and os.fdopen(w, 'w') or None) # if we reach here, the child should quit. os._exit(0) return ret
def start(self, trace=0): """Attempts to start the daemons. The return value is defined by the LSB: 0 Success 4 Insufficient privileges """ xend_pid = self.cleanup_xend(False) if self.set_user(): return 4 os.chdir("/") if xend_pid > 0: # Trying to run an already-running service is a success. return 0 ret = 0 # If we're not going to create a daemon, simply # call the run method right here. if not XEND_DAEMONIZE: self.tracing(trace) self.run(None) return ret # we use a pipe to communicate between the parent and the child process # this way we know when the child has actually initialized itself so # we can avoid a race condition during startup r,w = os.pipe() if os.fork(): os.close(w) r = os.fdopen(r, 'r') try: s = r.read() finally: r.close() if not len(s): ret = 1 else: ret = int(s) else: os.close(r) # Child self.daemonize() self.tracing(trace) # If Xend proper segfaults, then we want to restart it. Thus, # we fork a child for running Xend itself, and if it segfaults # (or exits any way other than cleanly) then we run it again. # The first time through we want the server to write to the (r,w) # pipe created above, so that we do not exit until the server is # ready to receive requests. All subsequent restarts we don't # want this behaviour, or the pipe will eventually fill up, so # we just pass None into run in subsequent cases (by clearing w # in the parent of the first fork). On some operating systems, # restart is managed externally, so we won't fork, and just exit. while True: if not osdep.xend_autorestart: self.run(os.fdopen(w, 'w')) os._exit(0) pid = self.fork_pid() if pid: if w is not None: os.close(w) w = None (_, status) = os.waitpid(pid, 0) if os.WIFEXITED(status): code = os.WEXITSTATUS(status) log.info('Xend exited with status %d.', code) sys.exit(code) if os.WIFSIGNALED(status): sig = os.WTERMSIG(status) if sig in (signal.SIGINT, signal.SIGTERM): log.info('Xend stopped due to signal %d.', sig) sys.exit(0) else: log.fatal( 'Xend died due to signal %d! Restarting it.', sig) else: self.run(w and os.fdopen(w, 'w') or None) # if we reach here, the child should quit. os._exit(0) return ret