]> git.meshlink.io Git - catta/blob - avahi-utils/avahi-publish
* add avahi-publish
[catta] / avahi-utils / avahi-publish
1 #!/usr/bin/python2.4
2 # -*-python-*-
3 # $Id$
4
5 import avahi, dbus, gobject, sys, getopt
6
7 try:
8     import dbus.glib
9 except ImportError, e:
10     pass
11
12 def usage(retval = 0):
13     print "%s [options] <name> <type> <port> [<txt> ...]\n" % sys.argv[0]
14     print "   -h --help      Show this help"
15     print "   -d --domain    Domain where to register this service"
16     print "   -H --host      Host where this service resides"
17     sys.exit(retval)
18
19 try:
20     opts, args = getopt.getopt(sys.argv[1:], "d:H:", ["help", "domain=", "host="])
21 except getopt.GetoptError:
22     usage(2)
23
24 domain = ""
25 host = ""
26     
27 for o, a in opts:
28     if o in ("-h", "--help"):
29         usage()
30
31     if o in ("-d", "--domain"):
32         domain = a
33
34     if o in ("-H", "--host"):
35         host = a
36
37 if len(args) < 3:
38     sys.stderr.write("Invalid number of arguments\n")
39     sys.exit(1)
40
41 name = args[0]
42 stype = args[1]
43 port = int(args[2])
44 txt = args[3:]
45
46 # python-dbus doesn't allow transmission of empty arrays, therefore we "fix" it with a bogus entry
47 if len(txt) == 0:
48     txt.append("python-dbus=brain-damage")
49
50 group = None
51
52 def remove_service():
53     global group
54
55     if not (group is None):
56         group.Free()
57         group = None
58
59 def add_service():
60     global group, name, stype, domain, host, port, txt
61
62     assert group is None
63
64     print "Adding service '%s' of type '%s' ..." % (name, args[1])
65     
66     group = dbus.Interface(bus.get_object("org.freedesktop.Avahi", server.EntryGroupNew()), 'org.freedesktop.Avahi.EntryGroup')
67     group.connect_to_signal('StateChanged', entry_group_state_changed)
68     group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, name, stype, domain, host, dbus.UInt16(port), txt)
69     group.Commit()
70
71 def entry_group_state_changed(state):
72     global name, server
73     
74     if state == avahi.ENTRY_GROUP_ESTABLISHED:
75         print "Service established."
76     elif state == avahi.ENTRY_GROUP_COLLISION:
77         name = server.GetAlternativeServiceName(name)
78         print "WARNING: Service name collision, changing name to '%s' ..." % name
79         remove_service()
80         add_service()
81
82 def server_state_changed(state):
83     if state == avahi.SERVER_COLLISION:
84         print "WARNING: Server name collision"
85         remove_service()
86     elif state == avahi.SERVER_RUNNING:
87         add_service()
88
89 bus = dbus.SystemBus()
90 server = dbus.Interface(bus.get_object("org.freedesktop.Avahi", '/org/freedesktop/Avahi/Server'), 'org.freedesktop.Avahi.Server')
91 server.connect_to_signal("StateChanged", server_state_changed)
92 server_state_changed(server.GetState())
93
94 try:
95     gobject.MainLoop().run()
96 except KeyboardInterrupt, k:
97     pass
98
99 remove_service()