Cómo encaminar todos los subdominios de un único host mediante mDNS?
Pregunta
Tengo un servidor web de desarrollo de alojamiento como "myhost.local" que se encuentra mediante Bonjour / mDNS. El servidor ejecuta avahi-daemon.
El servidor web también quiere manejar cualquier subdominio de sí mismo. Por ejemplo, "cat.myhost.local" y "dog.myhost.local" y "guppy.myhost.local".
Dado que myhost.local está en una dirección IP dinámica de DHCP, es todavía una forma de ruta de todas las solicitudes de los subdominios a myhost.local?
Estoy empezando a pensar que no es posible actualmente ...
http://marc.info/?l=freedesktop-avahi&m=119561596630960&w= 2
Esto se puede hacer con el archivo / etc / avahi / hosts. Como alternativa, puede
utilizar a publicar-host-name avahi.No, no puede. Desde que se quiere definir un alias, no una nueva nombre de host. Es decir. él sólo quiere registrar un RR, sin RR PTR reversa. Pero si usted se pega algo en / etc / avahi / hosts entonces se registra tanto, y detecta una colisión si el RR PTR es no único, que sería el caso para un alias.
Solución 4
Se lo di como no es posible en el tiempo, y no he revisado el problema desde entonces.
Mi solución actual es añadir laboriosamente cada subdominio de interés para el archivo hosts en el equipo local.
Otros consejos
He resuelto esto lo mejor que pueda con la pequeña cantidad de tiempo que he asignado a esta tarea.
Pero, por desgracia no creo que la aplicación de ventanas avahi / msdns / Bonjour soporta alias (corríjame si estoy equivocado con ejemplos de cómo apoyar esto).
Lo que hice fue comenzar con el script de ejemplo pitón en la página web avahi:
Crea: /usr/bin/avahi-announce-alias
Que sea ejecutable y Rellenar con
#! /usr/bin/env python
# avahi-alias.py
import avahi, dbus
from encodings.idna import ToASCII
# Got these from /usr/include/avahi-common/defs.h
CLASS_IN = 0x01
TYPE_CNAME = 0x05
TTL = 60
def publish_cname(cname):
bus = dbus.SystemBus()
server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER),
avahi.DBUS_INTERFACE_SERVER)
group = dbus.Interface(bus.get_object(avahi.DBUS_NAME, server.EntryGroupNew()),
avahi.DBUS_INTERFACE_ENTRY_GROUP)
rdata = createRR(server.GetHostNameFqdn())
cname = encode_dns(cname)
group.AddRecord(avahi.IF_UNSPEC, avahi.PROTO_UNSPEC, dbus.UInt32(0),
cname, CLASS_IN, TYPE_CNAME, TTL, rdata)
group.Commit()
def encode_dns(name):
out = []
for part in name.split('.'):
if len(part) == 0: continue
out.append(ToASCII(part))
return '.'.join(out)
def createRR(name):
out = []
for part in name.split('.'):
if len(part) == 0: continue
out.append(chr(len(part)))
out.append(ToASCII(part))
out.append('\0')
return ''.join(out)
if __name__ == '__main__':
import time, sys, locale
for each in sys.argv[1:]:
name = unicode(each, locale.getpreferredencoding())
publish_cname(name)
try:
# Just loop forever
while 1: time.sleep(60)
except KeyboardInterrupt:
print "Exiting"
Este script se encarga el anuncio de cada alias individual, y permanecerá en funcionamiento hasta lo matas. (Debido a esto, tenemos que crear otro script que he mostrado a continuación)
Crear archivo de texto /etc/avahi/aliases
Esto es lo que utilizan a los alias de las tiendas para esta máquina uno por línea
Crea /etc/avahi/aliases.d/
directorio
En realidad no he hecho uso de esta en cualquiera de los guiones que muestro aquí, pero para aquellas personas emprendedoras por ahí, se puede ver lo que hay que hacer.
La idea es que se puede alias de grupo en archivos de texto separados (que tendrá más sentido cuando se trabaja con máquinas virtuales en Apache), esto es algo que muchas aplicaciones demonio en * nix ya proporcionan (Apache y aptos son sólo dos ejemplos ).
Crea /usr/bin/avahi-announce-aliases
Que sea ejecutable y llenarlo con
#!/usr/bin/env python
import os, sys
from subprocess import Popen
def ensure_file (path):
"""
Looks for file at provided path, creates it if it does not exist.
Returns the file.
"""
rfile = None
if not os.path.exists(path) and os.path.isfile(path) :
rfile = open(path,"w+");
print("ensuring file : %s " % path)
print("file ensured : %s " % path)
return rfile
command = '/usr/bin/avahi-announce-alias'
alias_pid_path = "/tmp/avahi-aliases.pid"
alias_file_path = "/etc/avahi/aliases"
alias_file = open(alias_file_path)
if not os.path.exists(alias_pid_path) :
open(alias_pid_path,"w").close()
alias_pid = open(alias_pid_path,"r")
for line in alias_pid :
txt = line.strip('\n')
if len(txt) > 0 :
print("kill %s" % txt )
os.system("kill %s" % txt)
alias_pid.close()
alias_pid = open(alias_pid_path,"w+")
for line in alias_file :
txt = line.strip('\n')
if len(txt) > 0 :
print("publishing : << %s >>" % txt)
process = Popen([command, txt])
alias_pid.write("%s\n" % str(process.pid))
alias_pid.close()
print("done")
Es de ninguna manera pretende ser el pináculo de programación Python, así que no dude en hacer mejoras cuando le parezca.
Uso
Si nuestro nombre de host es "servidor" y el nombre de host-avahi era "server.local", entonces podríamos llenar el archivo de texto /etc/avahi/aliases
con sus nombres de host adicionales, así:
deluge.server.local
username.server.local
accounts.server.local
something-else.server.local
another.hostname.home
(pero en realidad, estoy bastante seguro de que podría tener cualquier nombre de host ahí que le proporciona se aseguró de que no existe ya en la red, por lo que me acaba de crear subdominios '' del nombre de host avahi normales)
A continuación, se corre:
sudo avahi-publish-aliases
La razón principal para configurar esto era más fácil para facilitar la simulación de Django y desarrollo web drupal en mi portátil.
Advertencias
Mi única decepción es que la aplicación de ventanas Bonjour / Avahi no soporta los alias que anuncia esta aplicación, sólo se ve el nombre de host principal avahi anunció normalmente (es decir server.local en nuestro ejemplo anterior).
Parece que airtonix implementado esto y lo puso a disposición en https://github.com/airtonix/avahi- alias
A más reciente tenedor actualizado que he probado en Ubuntu 11.04 es en https://github.com / hmalphettes / avahi-alias
Puede registrar los registros adicionales que utilizan la API de Avahi. Este ejemplo en el wiki de Avahi demuestra cómo publicar registros adicionales CNAME (alias) en Python .
Sé que esto es viejo, pero la mejor solución sería dnsmasq .
Esto se puede lograr de manera tan simple ... a través de los argumentos / config ...
Vuelta ipaddr para todos los hosts en los dominios especificados.
-A, --address=/<domain>/<ipaddr>