325
324
self.checker_initiator_tag = (gobject.timeout_add
326
325
(self.interval_milliseconds(),
327
326
self.start_checker))
327
# Also start a new checker *right now*.
328
329
# Schedule a disable() when 'timeout' has passed
329
330
self.disable_initiator_tag = (gobject.timeout_add
330
331
(self.timeout_milliseconds(),
332
333
self.enabled = True
333
# Also start a new checker *right now*.
336
def disable(self, quiet=True):
337
336
"""Disable this client."""
338
337
if not getattr(self, "enabled", False):
341
logger.info(u"Disabling client %s", self.name)
339
logger.info(u"Disabling client %s", self.name)
342
340
if getattr(self, u"disable_initiator_tag", False):
343
341
gobject.source_remove(self.disable_initiator_tag)
344
342
self.disable_initiator_tag = None
627
625
"""Standard D-Bus method, overloaded to insert property tags.
629
627
xmlstring = dbus.service.Object.Introspect(self, object_path,
632
document = xml.dom.minidom.parseString(xmlstring)
633
def make_tag(document, name, prop):
634
e = document.createElement(u"property")
635
e.setAttribute(u"name", name)
636
e.setAttribute(u"type", prop._dbus_signature)
637
e.setAttribute(u"access", prop._dbus_access)
639
for if_tag in document.getElementsByTagName(u"interface"):
640
for tag in (make_tag(document, name, prop)
642
in self._get_all_dbus_properties()
643
if prop._dbus_interface
644
== if_tag.getAttribute(u"name")):
645
if_tag.appendChild(tag)
646
# Add the names to the return values for the
647
# "org.freedesktop.DBus.Properties" methods
648
if (if_tag.getAttribute(u"name")
649
== u"org.freedesktop.DBus.Properties"):
650
for cn in if_tag.getElementsByTagName(u"method"):
651
if cn.getAttribute(u"name") == u"Get":
652
for arg in cn.getElementsByTagName(u"arg"):
653
if (arg.getAttribute(u"direction")
655
arg.setAttribute(u"name", u"value")
656
elif cn.getAttribute(u"name") == u"GetAll":
657
for arg in cn.getElementsByTagName(u"arg"):
658
if (arg.getAttribute(u"direction")
660
arg.setAttribute(u"name", u"props")
661
xmlstring = document.toxml(u"utf-8")
663
except (AttributeError, xml.dom.DOMException,
664
xml.parsers.expat.ExpatError), error:
665
logger.error(u"Failed to override Introspection method",
629
document = xml.dom.minidom.parseString(xmlstring)
631
def make_tag(document, name, prop):
632
e = document.createElement(u"property")
633
e.setAttribute(u"name", name)
634
e.setAttribute(u"type", prop._dbus_signature)
635
e.setAttribute(u"access", prop._dbus_access)
637
for if_tag in document.getElementsByTagName(u"interface"):
638
for tag in (make_tag(document, name, prop)
640
in self._get_all_dbus_properties()
641
if prop._dbus_interface
642
== if_tag.getAttribute(u"name")):
643
if_tag.appendChild(tag)
644
xmlstring = document.toxml(u"utf-8")
706
685
variant_level=1))
709
def disable(self, quiet = False):
688
def disable(self, signal = True):
710
689
oldstate = getattr(self, u"enabled", False)
711
r = Client.disable(self, quiet=quiet)
712
if not quiet and oldstate != self.enabled:
690
r = Client.disable(self)
691
if signal and oldstate != self.enabled:
713
692
# Emit D-Bus signal
714
693
self.PropertyChanged(dbus.String(u"enabled"),
715
694
dbus.Boolean(False, variant_level=1))
1346
1325
elif suffix == u"w":
1347
1326
delta = datetime.timedelta(0, 0, 0, 0, 0, 0, value)
1349
raise ValueError(u"Unknown suffix %r" % suffix)
1350
except (ValueError, IndexError), e:
1351
raise ValueError(e.message)
1329
except (ValueError, IndexError):
1352
1331
timevalue += delta
1353
1332
return timevalue
1393
1372
null = os.open(os.path.devnull, os.O_NOCTTY | os.O_RDWR)
1394
1373
if not stat.S_ISCHR(os.fstat(null).st_mode):
1395
1374
raise OSError(errno.ENODEV,
1396
u"%s not a character device"
1375
u"/dev/null not a character device")
1398
1376
os.dup2(null, sys.stdin.fileno())
1399
1377
os.dup2(null, sys.stdout.fileno())
1400
1378
os.dup2(null, sys.stderr.fileno())
1567
1545
bus = dbus.SystemBus()
1568
1546
# End of Avahi example code
1571
bus_name = dbus.service.BusName(u"se.bsnet.fukt.Mandos",
1572
bus, do_not_queue=True)
1573
except dbus.exceptions.NameExistsException, e:
1574
logger.error(unicode(e) + u", disabling D-Bus")
1576
server_settings[u"use_dbus"] = False
1577
tcp_server.use_dbus = False
1548
bus_name = dbus.service.BusName(u"se.bsnet.fukt.Mandos", bus)
1578
1549
protocol = avahi.PROTO_INET6 if use_ipv6 else avahi.PROTO_INET
1579
1550
service = AvahiService(name = server_settings[u"servicename"],
1580
1551
servicetype = u"_mandos._tcp",
1619
1590
del pidfilename
1593
"Cleanup function; run on exit"
1596
while tcp_server.clients:
1597
client = tcp_server.clients.pop()
1598
client.disable_hook = None
1601
atexit.register(cleanup)
1622
1604
signal.signal(signal.SIGINT, signal.SIG_IGN)
1623
1605
signal.signal(signal.SIGHUP, lambda signum, frame: sys.exit())
1668
1650
tcp_server.clients.remove(c)
1669
1651
c.remove_from_connection()
1670
1652
# Don't signal anything except ClientRemoved
1671
c.disable(quiet=True)
1653
c.disable(signal=False)
1672
1654
# Emit D-Bus signal
1673
1655
self.ClientRemoved(object_path, c.name)
1675
raise KeyError(object_path)
1679
1661
mandos_dbus_service = MandosDBusService()
1682
"Cleanup function; run on exit"
1685
while tcp_server.clients:
1686
client = tcp_server.clients.pop()
1688
client.remove_from_connection()
1689
client.disable_hook = None
1690
# Don't signal anything except ClientRemoved
1691
client.disable(quiet=True)
1694
mandos_dbus_service.ClientRemoved(client.dbus_object_path,
1697
atexit.register(cleanup)
1699
1663
for client in tcp_server.clients:
1701
1665
# Emit D-Bus signal
1737
1700
main_loop.run()
1738
1701
except AvahiError, error:
1739
1702
logger.critical(u"AvahiError: %s", error)
1742
1704
except KeyboardInterrupt:
1744
1706
print >> sys.stderr
1745
1707
logger.debug(u"Server received KeyboardInterrupt")
1746
1708
logger.debug(u"Server exiting")
1747
# Must run before the D-Bus bus name gets deregistered
1750
1710
if __name__ == '__main__':