通过 DBUS 将 CNAME 发布到 Avahi 需要长时间的过程

通过 DBUS 将 CNAME 发布到 Avahi 需要长时间的过程

我正在尝试在 Avahi 中设置 CNAME,以便广播多个主机名。我在网上找到了各种示例,它们都可以工作,但它们都需要长期存在的进程:

https://github.com/Dalee/avahi-cname-aliases/blob/master/avahi_cname_aliases/在里面.py#L83

    # run and stay foreground
    def run(self):
        self.set_handlers()
        self.load_aliases()
        self.publish_aliases()

        # keep aliases published
        while self.running:
            time.sleep(TTL)

https://github.com/george-hawkins/avahi-aliases-notes/blob/master/avahi-alias#L48

    for name in sys.argv[1:]:
        publish_cname(name)
    try:
        # Just loop forever
        while 1: time.sleep(60)
    except KeyboardInterrupt:
        print("Exiting")

https://public.msli.com/lcs/jaf/publish_cnames.c

/** cnames should be a NULL-terminated array of alias hostnames for this host.
  * Example invocation:  const char * cnames = {"foo.local", "bar.local", NULL}; PublishAvahiCNames(cnames);  
  * Note that this function normally does not ever return!
  */
void PublishAvahiCNames(const char ** cnames)

我已经确认,如果设置 CNAME 的过程结束,CNAME 就会消失,但我找不到任何关于 avahi 或 dbus 的文档来说明这些工具为什么需要永久存在。我的使用并没有dbus-monitor显示出任何明显的迹象表明脚本正在做什么来保持 CNAME 处于活动状态。

有谁知道这些脚本是如何使已发布的 CNAME 在 avahi 中保持活跃的?

答案1

客户端什么也不做,只是保持与 D-Bus 的连接。如果它们消失,服务器会清理它们的条目,参见dbus-协议.c

} else if (dbus_message_is_signal(m, DBUS_INTERFACE_DBUS, "NameOwnerChanged")) {
    char *name, *old, *new;

    if (!dbus_message_get_args(m, &error, DBUS_TYPE_STRING, &name, DBUS_TYPE_STRING, &old, DBUS_TYPE_STRING, &new, DBUS_TYPE_INVALID)) {
        avahi_log_warn("Error parsing NameOwnerChanged message");
        goto fail;
    }

    if (!*new) {
        Client *client;

        if ((client = client_get(name, FALSE))) {
            avahi_log_debug(__FILE__": client %s vanished.", name);
            client_free(client);
        }
    }
}

相关内容