28

Bonjour/mDNS を使用して検出される「myhost.local」としてホスティングする開発 Web サーバーがあります。サーバーは avahi-daemon を実行しています。

Web サーバーは、それ自体のサブドメインも処理する必要があります。たとえば、「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-publish-host-name を使用できます。

いや、彼はできない。彼は新しいホスト名ではなくエイリアスを定義したいので。つまり、彼は A RR を登録したいだけで、逆 PTR RR は登録したくないのです。しかし、/etc/avahi/hosts に何かを挿入すると、両方が登録され、PTR RR が一意でない場合 (エイリアスの場合など) に衝突が検出されます。

4

5 に答える 5

13

このタスクに割り当てたわずかな時間で、これを可能な限り解決しました。

しかし残念ながら、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)のみが表示されることです。

于 2010-10-09T08:05:15.197 に答える
5

airtonixがこれを実装し、https://github.com/airtonix/avahi-aliasesで利用できるようにしたようです

Ubuntu 11.04でテストした最近更新されたフォークは、https://github.com/hmalphettes/avahi-aliasesにあります。

于 2011-12-31T01:02:48.633 に答える
5

当時は無理だとあきらめてしまい、それ以来、この問題を再検討していません。

私の現在の解決策は、関心のある各サブドメインをローカル マシンのホスト ファイルに面倒に追加することです。

于 2010-03-14T01:01:40.730 に答える
4

AvahiAPIを使用して追加のレコードを登録できます。Avahi wikiのこの例は、Pythonで追加のCNAME(エイリアス)レコードを公開する方法を示しています。

于 2009-05-10T04:15:42.860 に答える
0

I know this is old, but a better solution would be dnsmasq.

This can be accomplished SO simply... via the arguments/config...

Return ipaddr for all hosts in specified domains.

-A, --address=/<domain>/<ipaddr>

address=/yourdomain.com/10.0.1.100

Voila!

于 2015-02-02T11:44:57.190 に答える