このタスクに割り当てたわずかな時間で、これを可能な限り解決しました。
しかし残念ながら、avahi / msdns / bonjourのWindows実装がエイリアスをサポートしているとは思いません(これをサポートする方法の例が間違っている場合は訂正してください)。
私がしたことは、avahiWebサイトで提供されている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
これは、このマシンのエイリアスを1行に1つずつ格納するために使用します
ディレクトリを作成する/etc/avahi/aliases.d/
ここに示すスクリプトでは、これを実際に使用していませんが、進取の気性に富んだ個人の場合は、何をする必要があるかを確認できます。
アイデアは、エイリアスを別々のテキストファイルにグループ化できるということです(これは、apacheで仮想ホストを扱うときに意味があります)。これは、* nixの多くのデーモンアプリケーションがすでに提供しているものです(apacheとaptは2つの例にすぎません)。
作成/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プログラミングの頂点となることを意図したものではないため、適切と思われる箇所で自由に改善を行ってください。
使用法
ホスト名が「server」で、avahi-hostnameが「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のWebサイト開発のシミュレーションを容易にするためでした。
警告
私の唯一の失望は、Bonjour / AvahiのWindows実装が、この実装がアナウンスするエイリアスをサポートしておらず、通常アナウンスされるメインのavahiホスト名(つまり、上記の例ではserver.local)のみが表示されることです。