class OVirtAgentDaemon:

    def __init__(self):
        logging.config.fileConfig(AGENT_CONFIG)

    def run(self, daemon, pidfile):
        logging.info("Starting oVirt guest agent")

        config = ConfigParser.ConfigParser()
        config.read(AGENT_CONFIG)

        self.agent = LinuxVdsAgent(config)

        if daemon:
            self._daemonize()

        f = file(pidfile, "w")
        f.write("%s\n" % (os.getpid()))
        f.close()
        os.chmod(pidfile, 0644)   # rw-rw-r-- (664)

        self.register_signal_handler()
        self.agent.run()

        logging.info("oVirt guest agent is down.")

    def _daemonize(self):
        if os.getppid() == 1:
            raise RuntimeError("already a daemon")
        pid = os.fork()
        if pid == 0:
            os.umask(0)
            os.setsid()
            os.chdir("/")
            self._reopen_file_as_null(sys.stdin)
            self._reopen_file_as_null(sys.stdout)
            self._reopen_file_as_null(sys.stderr)
        else:
            os._exit(0)

    def _reopen_file_as_null(self, oldfile):
        nullfile = file("/dev/null", "rw")
        os.dup2(nullfile.fileno(), oldfile.fileno())
        nullfile.close()

    def register_signal_handler(self):

        def sigterm_handler(signum, frame):
            logging.debug("Handling signal %d" % (signum))
            if signum == signal.SIGTERM:
                logging.info("Stopping oVirt guest agent")
                self.agent.stop()

        signal.signal(signal.SIGTERM, sigterm_handler)
class OVirtAgentDaemon:
    def __init__(self):
        logging.config.fileConfig(AGENT_CONFIG)

    def run(self, daemon, pidfile):
        logging.info("Starting oVirt guest agent")

        config = ConfigParser.ConfigParser()
        config.read(AGENT_CONFIG)

        self.agent = LinuxVdsAgent(config)

        if daemon:
            self._daemonize()

        f = file(pidfile, "w")
        f.write("%s\n" % (os.getpid()))
        f.close()
        os.chmod(pidfile, 0x1b4)  # rw-rw-r-- (664)

        self.register_signal_handler()
        self.agent.run()

        logging.info("oVirt guest agent is down.")

    def _daemonize(self):
        if os.getppid() == 1:
            raise RuntimeError, "already a daemon"
        pid = os.fork()
        if pid == 0:
            os.umask(0)
            os.setsid()
            os.chdir("/")
            self._reopen_file_as_null(sys.stdin)
            self._reopen_file_as_null(sys.stdout)
            self._reopen_file_as_null(sys.stderr)
        else:
            os._exit(0)

    def _reopen_file_as_null(self, oldfile):
        nullfile = file("/dev/null", "rw")
        os.dup2(nullfile.fileno(), oldfile.fileno())
        nullfile.close()

    def register_signal_handler(self):
        def sigterm_handler(signum, frame):
            logging.debug("Handling signal %d" % (signum))
            if signum == signal.SIGTERM:
                logging.info("Stopping oVirt guest agent")
                self.agent.stop()

        signal.signal(signal.SIGTERM, sigterm_handler)
    def run(self, daemon, pidfile):
        logging.info("Starting oVirt guest agent")

        config = ConfigParser.ConfigParser()
        config.read(AGENT_CONFIG)

        self.agent = LinuxVdsAgent(config)

        if daemon:
            self._daemonize()

        f = file(pidfile, "w")
        f.write("%s\n" % (os.getpid()))
        f.close()
        os.chmod(pidfile, 0x1b4)  # rw-rw-r-- (664)

        self.register_signal_handler()
        self.agent.run()

        logging.info("oVirt guest agent is down.")
    def run(self, daemon, pidfile):
        logging.info("Starting oVirt guest agent")

        config = ConfigParser.ConfigParser()
        config.read(AGENT_CONFIG)

        self.agent = LinuxVdsAgent(config)

        if daemon:
            self._daemonize()

        f = file(pidfile, "w")
        f.write("%s\n" % (os.getpid()))
        f.close()
        os.chmod(pidfile, 0644)   # rw-rw-r-- (664)

        self.register_signal_handler()
        self.agent.run()

        logging.info("oVirt guest agent is down.")