Hoe om die roete al subdomeine om'n enkele gasheer met behulp van mDNS?
Vra
Ek het'n ontwikkeling webserver hosting as "myhost.plaaslike" wat gevind word met behulp van Bonjour/mDNS.Die bediener loop avahi-daemon.
Die webbediener wil ook om te hanteer enige subdomeine van die self.Bv. "kat.myhost.plaaslike" en "hond.myhost.plaaslike" en "guppy.myhost.plaaslike".
Gegewe dat myhost.plaaslike is op'n dinamiese ip-adres van dhcp, is daar nog steeds'n manier om die roete alle versoeke vir die subdomeine te myhost.plaaslike?
Ek begin om te dink dit tans nie moontlik is...
http://marc.info/?l=freedesktop-avahi&m=119561596630960&w=2
Jy kan dit doen met die /etc/avahi/hosts lêer.Alternatiewelik kan jy
gebruik avahi-publiseer-gasheer-naam.Nee, hy kan nie.Sedert hy wil om te definieer'n alias, nie'n nuwe gasheernaam.I. e.hy wil net om te registreer'N RR, geen omgekeerde PTR RR.Maar as jy hou iets in /etc/avahi/leërskare dan is dit registers beide, en ontdek'n botsing as die PTR RR is nie-unieke, wat sou die geval vir'n alias.
Oplossing 4
Ek het dit as nie moontlik destyds, en ek het nie hersien die probleem sedert.
My huidige oplossing is om moeite te voeg elke subdomein van belang is vir die hosts lêer op die plaaslike masjien.
Ander wenke
Ek het opgelos dit as die beste as wat ek kan met die klein bedrag van die tyd het ek opgedra aan hierdie taak.
Maar ongelukkig dink ek nie die vensters implementering van avahi/msdns/bonjour ondersteun aliasse (korrek my as ek verkeerd is met voorbeelde van hoe om dit te ondersteun).
Wat ek gedoen het, was om te begin met die voorbeeld python script wat op die avahi webwerf :
Skep : /usr/bin/avahi-announce-alias
Maak dit uitvoerbare & Vul dit met
#! /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"
Hierdie script hanteer die aankondiging van elke individuele alias, en sal bly loop totdat jy die dood van dit.(as gevolg van hierdie, ons nodig het om te skep'n ander script wat ek het hieronder getoon)
Skep teks lêer /etc/avahi/aliases
Dit is wat ons gebruik om te stoor aliasse om hierdie masjien een per lyn
Skep gids /etc/avahi/aliases.d/
Ek het nie eintlik gebruik gemaak van hierdie in enige van die skrifte ek wys hier nie, maar vir diegene wat ondernemende mense daar buite, jy kan sien wat gedoen moet word.
Die idee is dat jy kan groep aliasse in aparte teks lêers (wat sal dit meer sin maak wanneer jy gaan met die virtuele die leërskare in apache), dit is iets baie daemon aansoeke op *nix reeds voorsien (apache en bekwaam is net twee voorbeelde).
Skep /usr/bin/avahi-announce-aliases
Maak dit uitvoerbare en vul dit met
#!/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")
Dit is geensins bedoel om te wees die toppunt van die python-programmeertaal, so voel vry om te maak verbeterings waar jy sien pas.
Gebruik
As ons gasheer was "server" en die avahi-gasheernaam was "bediener.plaaslike", dan kan ons vul die /etc/avahi/aliases
teks lêer met jou ekstra hostnames soos so :
deluge.server.local
username.server.local
accounts.server.local
something-else.server.local
another.hostname.home
(maar regtig, ek is redelik seker dat jy kan enige gasheernaam daar in die verskaffing van wat jy het seker gemaak dat dit nie reeds bestaan nie op die netwerk, wat is die rede waarom ek net skep 'subdomeine van die normale avahi gasheernaam)
Dan loop ons :
sudo avahi-publish-aliases
My hoof rede vir die opstel van hierdie up was te fasiliteer makliker simulasie van django & drupal webwerf-ontwikkeling op my laptop.
Protest
My enigste teleurstelling is dat die vensters implementering van Bonjour/Avahi ondersteun nie die aliasse dat hierdie implementering kondig, dit sal slegs sien die belangrikste avahi gasheernaam normaalweg aangekondig (dws bediener.plaaslike in ons voorbeeld hierbo).
Dit lyk asof airtonix hierdie geïmplementeer en het dit by https://github.com/airtonix/avahi- aliasse
'n meer onlangse opgedateer vurk dat ek op Ubuntu 11,04 het getoets is by https://github.com / hmalphettes / avahi-aliasse
Jy kan addisionele rekords met behulp van die Avahi API registreer. Hierdie voorbeeld op die Avahi wiki demonstreer hoe om bykomende CNAME (alias) rekords in Python publiseer .
Ek weet dit is oud, maar 'n beter oplossing sou wees dnsmasq .
Dit kan SO eenvoudig bereik ... via die argumente / config ...
Terug IpAddr vir al die leërskare in bepaalde gebiede.
-A, --address=/<domain>/<ipaddr>