Я пытаюсь настроить CNAME в Avahi, чтобы транслировать несколько имен хостов. Я нашел в Интернете множество примеров, которые все работают, но все они требуют долгоживущих процессов:
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?
Клиенты ничего не делают, просто остаются подключенными к 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);
}
}
}