Avahi

通過 DBUS 將 CNAME 發佈到 Avahi 需要長期的過程

  • November 22, 2019

我正在嘗試在 Avahi 中設置 CNAME 以廣播多個主機名。我在網上找到了各種各樣的例子,它們都可以工作,但它們都需要長期的過程:

https://github.com/Dalee/avahi-cname-aliases/blob/master/avahi_cname_aliases/init.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 中保持活動狀態?

客戶端什麼都不做,只是保持與 D-Bus 的連接。如果他們消失了,伺服器會清理他們的條目,參見。dbus-protocol.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);
       }
   }
}

引用自:https://serverfault.com/questions/992664