/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos

  • Committer: Teddy Hogeborn
  • Date: 2009-11-02 05:52:57 UTC
  • mfrom: (196.1.1 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20091102055257-orjjddrfrtw0jc9b
* mandos (Client.enable): Bug fix: Start new immediate checker last to
                          avoid race condition.
  (Client.disable): Optionally do not log message.
  (ClientDBus.disable): Do not log message if no signal should be sent.
  (string_to_delta): More informative error message.
  (main.cleanup): Emit D-Bus "ClientRemoved" signal for all clients.
                  Do not emit any other signal.  Move to after
                  "mandos_dbus_service" is defined.

Show diffs side-by-side

added added

removed removed

Lines of Context:
325
325
        self.checker_initiator_tag = (gobject.timeout_add
326
326
                                      (self.interval_milliseconds(),
327
327
                                       self.start_checker))
328
 
        # Also start a new checker *right now*.
329
 
        self.start_checker()
330
328
        # Schedule a disable() when 'timeout' has passed
331
329
        self.disable_initiator_tag = (gobject.timeout_add
332
330
                                   (self.timeout_milliseconds(),
333
331
                                    self.disable))
334
332
        self.enabled = True
 
333
        # Also start a new checker *right now*.
 
334
        self.start_checker()
335
335
    
336
 
    def disable(self):
 
336
    def disable(self, log=True):
337
337
        """Disable this client."""
338
338
        if not getattr(self, "enabled", False):
339
339
            return False
340
 
        logger.info(u"Disabling client %s", self.name)
 
340
        if log:
 
341
            logger.info(u"Disabling client %s", self.name)
341
342
        if getattr(self, u"disable_initiator_tag", False):
342
343
            gobject.source_remove(self.disable_initiator_tag)
343
344
            self.disable_initiator_tag = None
467
468
        logger.debug(u"Stopping checker for %(name)s", vars(self))
468
469
        try:
469
470
            os.kill(self.checker.pid, signal.SIGTERM)
470
 
            #os.sleep(0.5)
 
471
            #time.sleep(0.5)
471
472
            #if self.checker.poll() is None:
472
473
            #    os.kill(self.checker.pid, signal.SIGKILL)
473
474
        except OSError, error:
707
708
    
708
709
    def disable(self, signal = True):
709
710
        oldstate = getattr(self, u"enabled", False)
710
 
        r = Client.disable(self)
 
711
        r = Client.disable(self, log=signal)
711
712
        if signal and oldstate != self.enabled:
712
713
            # Emit D-Bus signal
713
714
            self.PropertyChanged(dbus.String(u"enabled"),
1345
1346
            elif suffix == u"w":
1346
1347
                delta = datetime.timedelta(0, 0, 0, 0, 0, 0, value)
1347
1348
            else:
1348
 
                raise ValueError
1349
 
        except (ValueError, IndexError):
1350
 
            raise ValueError
 
1349
                raise ValueError(u"Unknown suffix %r" % suffix)
 
1350
        except (ValueError, IndexError), e:
 
1351
            raise ValueError(e.message)
1351
1352
        timevalue += delta
1352
1353
    return timevalue
1353
1354
 
1610
1611
        pass
1611
1612
    del pidfilename
1612
1613
    
1613
 
    def cleanup():
1614
 
        "Cleanup function; run on exit"
1615
 
        service.cleanup()
1616
 
        
1617
 
        while tcp_server.clients:
1618
 
            client = tcp_server.clients.pop()
1619
 
            client.disable_hook = None
1620
 
            client.disable()
1621
 
    
1622
 
    atexit.register(cleanup)
1623
 
    
1624
1614
    if not debug:
1625
1615
        signal.signal(signal.SIGINT, signal.SIG_IGN)
1626
1616
    signal.signal(signal.SIGHUP, lambda signum, frame: sys.exit())
1675
1665
                        # Emit D-Bus signal
1676
1666
                        self.ClientRemoved(object_path, c.name)
1677
1667
                        return
1678
 
                raise KeyError
 
1668
                raise KeyError(object_path)
1679
1669
            
1680
1670
            del _interface
1681
1671
        
1682
1672
        mandos_dbus_service = MandosDBusService()
1683
1673
    
 
1674
    def cleanup():
 
1675
        "Cleanup function; run on exit"
 
1676
        service.cleanup()
 
1677
        
 
1678
        while tcp_server.clients:
 
1679
            client = tcp_server.clients.pop()
 
1680
            client.remove_from_connection()
 
1681
            client.disable_hook = None
 
1682
            # Don't signal anything except ClientRemoved
 
1683
            client.disable(signal=False)
 
1684
            if use_dbus:
 
1685
                # Emit D-Bus signal
 
1686
                mandos_dbus_service.ClientRemoved(client.dbus_object_path,
 
1687
                                                  client.name)
 
1688
    
 
1689
    atexit.register(cleanup)
 
1690
    
1684
1691
    for client in tcp_server.clients:
1685
1692
        if use_dbus:
1686
1693
            # Emit D-Bus signal