/usr/share/pyshared/tp/netlib/discover/avahi_server.py is in python-tp-netlib 0.2.5-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | import os, sys
import traceback
import time
import avahi, avahi.ServiceTypeDatabase
import gobject
import dbus
if getattr(dbus, 'version', (0,0,0)) >= (0,41,0):
import dbus.glib
service_type_browsers = {}
service_browsers = {}
service_type_db = avahi.ServiceTypeDatabase.ServiceTypeDatabase()
service_seen = {}
from server import ZeroConfServer as ZeroConfServerBase
class ZeroConfServer(ZeroConfServerBase):
def check():
bus = dbus.SystemBus()
try:
server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
print "avahi version", server.GetVersionString()
except dbus.DBusException, e:
print e
return False
return False
check = staticmethod(check)
def __init__(self):
ZeroConfServerBase.__init__(self)
self.groups = {}
self.topublish = {}
bus = dbus.SystemBus()
self.server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)
def ServiceRemove(self, name, type, addr):
#print "ServiceRemove"
key = (name, type, addr)
if key in self.groups:
group = self.groups[key]
del self.groups[key]
group.Reset()
def ServiceAdd(self, name, type, addr, required, optional):
#print "ServiceAdd"
stype = "_%s._tcp" % type
entrygroup = self.server.EntryGroupNew()
group = dbus.Interface(dbus.SystemBus().get_object(avahi.DBUS_NAME, entrygroup), avahi.DBUS_INTERFACE_ENTRY_GROUP)
def entry_group_state_changed(state, hrm, self=self, entrygroup=entrygroup):
#print "entry_group_state_changed...."
#print state, hrm, self, entrygroup
group = dbus.Interface(dbus.SystemBus().get_object(avahi.DBUS_NAME, self.server.EntryGroupNew()), avahi.DBUS_INTERFACE_ENTRY_GROUP)
self.entry_group_state_changed(group, state)
group.connect_to_signal('StateChanged', entry_group_state_changed)
#print "Adding service '%s' of type '%s' ..." % (name, stype)
txt = self.dict_to_pair(required) + self.dict_to_pair(optional)
#print txt, addr, avahi.string_array_to_txt_array(txt)
group.AddService(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, 0,
name, stype, "", "", dbus.UInt16(addr[2]),
avahi.string_array_to_txt_array(txt))
group.Commit()
self.groups[(name, type, addr)] = group
def entry_group_state_changed(self, group, state):
#print "entry_group_state_changed..."
if state == avahi.ENTRY_GROUP_ESTABLISHED:
print group, "Service established."
elif state == avahi.ENTRY_GROUP_COLLISION:
n_rename = n_rename + 1
if n_rename >= 12:
print "ERROR: No suitable service name found after %i retries, exiting." % n_rename
else:
name = self.server.GetAlternativeServiceName(name)
print "WARNING: Service name collision, changing name to '%s' ..." % name
def dict_to_pair(self, l):
res = []
for key, value in l.items():
if value is None:
res.append(key)
else:
res.append("%s=%s" % (key, value))
return res
######################################
# Callback functions
######################################
def run(self):
#print "avahi_browse", self
self.mainloop = gobject.MainLoop()
gcontext = self.mainloop.get_context()
bus = dbus.SystemBus()
while not self.mainloop is None:
if gcontext.pending():
gcontext.iteration()
else:
time.sleep(0.01)
def exit(self):
if hasattr(self, 'mainloop'):
self.mainloop.quit()
self.mainloop = None
def main():
from game import Game
game1 = Game("testing 1")
game1.updateRequired({'tp': '0.3', 'server': 'None', 'sertype':'Avahi Testing Script', 'rule': "Testing Avahi!", 'rulever': 'None'})
game1.addLocation("tp", ("mithro.local", "10.1.1.1", 80))
game2 = Game("testing 2")
game2.updateRequired({'tp': '0.3', 'server': 'None', 'sertype':'Avahi Testing Script', 'rule': "Testing Avahi!", 'rulever': 'None'})
game2.addLocation("tp", ("mithro.local", "10.1.1.1", 8080))
# game2.addLocation("tp", ("mithro.local", "10.1.1.1", 443)) -- Can't have to services on the same name and type
game2.addLocation("tps", ("mithro.local", "10.1.1.1", 90))
a = ZeroConfServer()
a.GameAdd(game1)
a.GameAdd(game2)
a.run()
if __name__ == "__main__":
main()
|