]> git.meshlink.io Git - catta/blob - avahi-utils/avahi-publish-address.in
* add avahi-utils in autoconf
[catta] / avahi-utils / avahi-publish-address.in
1 #!/usr/bin/env @PYTHON@
2 # -*-python-*-
3 # $Id$
4
5 import avahi, dbus, gobject, sys, getopt, string
6
7 try:
8     import dbus.glib
9 except ImportError, e:
10     pass
11
12 def usage(retval = 0):
13     print "%s <name> <address>" % sys.argv[0]
14     sys.exit(retval)
15
16 if len(sys.argv) != 3:
17     usage(2)
18
19 name = sys.argv[1]
20 address = sys.argv[2]
21
22 group = None
23 n_rename = 0
24
25 def remove_address():
26     global group
27     
28     if not (group is None):
29         group.Free()
30         group = None
31
32 def add_address():
33     global server, group, name, address
34     assert group is None
35
36     print "Adding address '%s' for '%s' ..." % (name, address)
37     group = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP)
38     group.connect_to_signal('StateChanged', entry_group_state_changed)
39     group.AddAddress(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, name, address)
40     group.Commit()
41
42 def entry_group_state_changed(state):
43     global name, server, n_rename, main_loop
44     
45     if state == avahi.ENTRY_GROUP_ESTABLISHED:
46         print "Address established."
47     elif state == avahi.ENTRY_GROUP_COLLISION:
48
49         n_rename = n_rename + 1
50         if n_rename >= 12:
51             print "ERROR: No suitable name found after %i retries, exiting." % n_rename
52             main_loop.quit()
53         else:
54             hn = name.split('.')
55             hn[0] = server.GetAlternativeHostName(hn[0])
56             name = string.join(hn, '.')
57             print "WARNING: Address/host name collision, changing name to '%s' ..." % name
58             remove_address()
59             add_address()
60
61 main_loop = gobject.MainLoop()
62
63 bus = dbus.SystemBus()
64 server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
65
66 add_address()
67
68 try:
69     main_loop.run()
70 except KeyboardInterrupt, k:
71     pass
72
73 remove_address()