Exemplo n.º 1
0
    def _start_slave(self):
        """
        Starts a new slave worker process.
        """
        pid = os.fork()
        if pid == 0:
            # Set up the command line and logger id
            set_cmdline('vsmtpd: worker')
            log.connection_id = 'worker'

            # Call event_reinit()
            gevent.reinit()

            # Start vsmtpd
            self._start(self.sock)
        else:
            log.info('Worker spawned PID %d', pid)
            self.workers.append(pid)
Exemplo n.º 2
0
    def start(self):
        """
        Starts the vsmtpd server in either master or worker mode.
        """

        # Install the signal handlers
        signal.signal(signal.SIGTERM, self.stop)
        signal.signal(signal.SIGHUP, self.reload)
        signal.signal(signal.SIGINT, self.stop)

        workers = self.config.getint('workers')
        backlog = self.config.getint('backlog')

        addr = ('0.0.0.0', 2500)

        if backlog < 1:
            backlog = 50

        log.info('Starting server on %s port %d', *addr)

        if workers <= 0:
            set_cmdline('vsmtpd: master')
            self._start(addr, backlog)

        # Open the socket for master/worker operation.
        self.sock = socket.socket()
        self.sock.bind(addr)
        self.sock.listen(backlog)
        self.sock.setblocking(0)

        # Spawn the worker servers
        for i in xrange(0, workers):
            self._start_slave()

        # Set the process title
        set_cmdline('vsmtpd: master')

        # Wait for the children to die
        try:
            os.waitpid(-1, 0)
        except OSError:
            pass
Exemplo n.º 3
0
 def tearDown(self):
     set_cmdline(self.cmdline)
     set_procname(self.procname)
Exemplo n.º 4
0
 def test_set_cmdline(self):
     set_cmdline('vsmtpd: master')
     self.assertEqual(get_procname(), 'vsmtpd: master')
     cmdline = open('/proc/%d/cmdline' % os.getpid()).read().rstrip('\0')
     self.assertEqual(cmdline, 'vsmtpd: master')