I'm trying to use the dbus interface in order to free/dispose of my server as well as update it, but I keep getting the error:
org.freedesktop.DBus.Error.UnknownMethod: Method "UpdateServiceTxt" with signature "iiusssaay" on interface "org.freedesktop.Avahi.EntryGroup" doesn't exist
And the same one on Method Free/ Dispose / Reset
Method "Free" with signature "" on interface "org.freedesktop.Avahi.EntryGroup" doesn't exist
However according to https://github.com/lathiat/avahi/blob/master/avahi-daemon/org.freedesktop.Avahi.service
It should exists, furthermore AddService and Commit works. does anyone know how to fix this?
The AvahiServer is simply accessing org.freedesktop.Avahi.Server
My code:
def start_dbus(self, name, service_type, port, txt = []):
try:
logger.info(f'Received name {name} type {service_type} port {port} txt {txt}')
self.server = self.get_avahi_interface()
self.service_name = name
self.service_type = service_type
txt_in_dbus_bytes = [[dbus.Byte(ord(c)) for c in s] for s in txt] if bool(txt) else dbus.Array([], signature='ay')
hostname, domainname = self.avahiserver.GetHostName(), self.avahiserver.GetDomainName()
self.server.AddService(dbus.Int32(-1), # avahi.IF_UNSPEC
dbus.Int32(-1), # avahi.PROTO_UNSPEC
dbus.UInt32(0), # flags
name, # sname - machine name
service_type, # stype - tcp
domainname, # sdomain
"{}.{}".format(hostname, domainname), # shost
dbus.UInt16(port), # port
txt_in_dbus_bytes) # TXT field, has be have a signuture of aay - 'a': Array of D-Bus, 'ay': Array of bytes
self.server.Commit()
except dbus.exceptions.DBusException as dbus_err:
if "CollisionError" in str(dbus_err):
logger.error(f"This service already exists, Exception: {dbus_err} - updating the info")
return self.update_additional_info(txt)
except Exception as err:
logger.error(f'Failed starting avahi service. Exception: {err}')
return False
logger.info('Starting to publish ip')
return True
def update_additional_info(self,txt=[]):
try:
logger.info(f'Additional info text was changed, updating machine {self.service_name} with the service {self.service_type} with: {txt}')
domainname =self.avahiserver.GetDomainName()
txt_in_dbus_bytes = [[dbus.Byte(ord(c)) for c in s] for s in txt] if bool(txt) else dbus.Array([], signature='ay')
self.server.UpdateService(dbus.Int32(-1), # avahi.IF_UNSPEC
dbus.Int32(-1), # avahi.PROTO_UNSPEC
dbus.UInt32(0), # flags
self.service_name, # sname - machine name
self.service_type, # stype - tcp
domainname, # sdomain
txt_in_dbus_bytes) # TXT field, has be have a signuture of 'aay': 'a'- Array of D-Bus, 'ay'- Array of bytes
except Exception as err:
logger.error(f'Failed updating avahi service. Exception: {err}')
return False
return True
def stop_dbus(self):
logger.info('Stopping all dbus communications')
try:
try:
self.server.Reset()
except Exception as err:
logger.error(f'Reset() {err}')
try:
self.server.Dispose()
except Exception as err:
logger.error(f'{err}')
try:
self.server.Free()
except Exception as err:
logger.error(f'{err}')
is_freed = self.server.IsEmpty()
logger.info(f"Current server status of communications is updated to {is_freed}")
return is_freed
except Exception as err:
logger.error(f'Failed stopping avahi service. Exception: {err}')
return False
def get_avahi_interface(self):
if self.bus is None or self.server is None or self.avahiserver is None:
self.bus = dbus.SystemBus()
self.avahiserver = AvahiServer()
self.path = self.avahiserver.EntryGroupNew()
raw_server = self.bus.get_object('org.freedesktop.Avahi', self.path)
self.server = dbus.Interface(raw_server, f'org.freedesktop.Avahi.EntryGroup')
return self.server