Dbus errors on org.freedesktop.Avahi.EntryGroup

91 Views Asked by At

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
0

There are 0 best solutions below