题
我有一个发展的网络服务器托管作为被使用Bonjour /的mDNS发现“myhost.local”。服务器正在运行的avahi守护进程。
在网络服务器还希望处理的自身的任何子域。例如 “cat.myhost.local” 和 “dog.myhost.local” 和 “guppy.myhost.local”。
由于myhost.local是从DHCP动态IP地址,是还有一个办法路线的子域的所有请求myhost.local?
我开始认为这目前还不可能......
http://marc.info/?l=freedesktop-avahi&m=119561596630960&w= 2个
您可以在/ etc /的avahi / hosts文件做到这一点。另外,您可以点击 使用的avahi-发布主机名。
没有,他不能。既然他要确定一个别名,而不是一个新的 主机名。即他只想要注册的A RR,没有反向PTR RR。但 如果你坚持的东西在/ etc /的avahi / hosts文件,然后它注册两种, 并检测碰撞,如果PTR RR是非唯一的,这将是 情况下的一个别名。
解决方案 4
我给它作为不可能的时候,我还没有重新以来的问题。
我的当前的解决方案是费力添加感兴趣的每个子域的主机在本地机器上的文件。
其他提示
我已经解决了这个作为最好的,我可以与我分配给该任务的时间量小。
但不幸的是,我不认为Windows实现的avahi / msdns /卓悦的支持别名(如果我错了,如何来支持这方面的例子指正)。
我所做的就是开始提供的avahi网站上的例子python脚本:
创建:/usr/bin/avahi-announce-alias
请它可执行与&填充它
#! /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"
该脚本处理每一个人别名的公告,并将继续运行,直到你杀了它。 (因为这一点,我们需要创建另一个脚本我已经如下所示)
创建文本文件/etc/avahi/aliases
此,我们使用存储的别名到本机每行一个
创建目录/etc/avahi/aliases.d/
我还没有实际使用了这个在任何脚本,我还没有在这里展示,但对于那些积极进取的个人在那里,你可以看到需要做什么。
我们的想法是,你可以组别名到单独的文本文件(这会更有意义,当你应对apache的虚拟主机),这是在* nix的东西很多后台应用已经提供了(Apache和容易只是两个例子)。
创建/usr/bin/avahi-announce-aliases
请它可执行与填充它
#!/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")
这是绝不意味着是Python编程的巅峰之作,所以放心大胆地在那里你认为合适的改进。
用法
如果我们的主机名称是“服务器”和的avahi主机名是“server.local”,那么我们就可以填补/etc/avahi/aliases
文本文件,将额外的主机名,像这样:
deluge.server.local
username.server.local
accounts.server.local
something-else.server.local
another.hostname.home
(不过说真的,我敢肯定,你可以有任何的主机名在那里提供您确信它并不存在在网络上,这就是为什么我刚刚创建的avahi正常主机名“子域”)
然后,我们运行:
sudo avahi-publish-aliases
我的设置它们的主要原因是为了便于在我的笔记本电脑的Django和Drupal的网站开发更容易模拟。
注意事项
我唯一失望的是,Windows实现卓悦/的avahi的不支持,这个实现宣布别名,它只能看到主要的主机名的avahi宣布正常(即server.local在上面的例子)。
看起来airtonix实现这一点,并使其位于 https://github.com/airtonix/avahi-别名
,我已经在Ubuntu 11.04测试一个更近的更新车叉处于 https://github.com / hmalphettes /的avahi-别名
可以注册使用的avahi API的其他记录。 这个例子上的avahi维基的演示了如何发布在Python额外的CNAME(别名)记录
我知道这是旧的,但更好的解决办法是的dnsmasq 。
这可被SO简单地完成...经由参数/配置...
返回IPADDR所有主机中指定的域。
-A, --address=/<domain>/<ipaddr>