كيفية توجيه جميع المجالات الفرعية إلى مضيف واحد باستخدام MDNS؟
سؤال
لدي خدمة WebServer التنمية مثل "myhost.local" الموجود باستخدام Bonjour / MDNS. الخادم يقوم بتشغيل avahi-daemon.
يريد WebServer أيضا التعامل مع أي نطاقات فرعية في نفسها. على سبيل المثال "cat.myhost.local" و "dog.myhost.local" و "guppy.myhost.local".
نظرا لأن myhost.local هو على عنوان IP ديناميكي من DHCP، فهل لا تزال هناك طريقة لتوجيه جميع طلبات المجال الفرعي إلى myhost.local؟
بدأت أعتقد أنه غير ممكن حاليا ...
http://marc.info/؟l=freedesktop-avahi&m=119561596630960&w=2.
يمكنك القيام بذلك باستخدام ملف / إلخ / Avahi / Hosts. بدلا من ذلك يمكنك
استخدم Afahi-Publish- اسم المضيف.لا، هو لا يستطيع. لأنه يريد تحديد اسم مستعار، وليس اسم مضيف جديد. أي أنه يريد فقط تسجيل RR، لا عكس PTR RR. ولكن إذا كنت تلتصق بشيء ما في / إلخ / Avahi / Hosts، فهو يسجل كلاهما، واكتشف تصادما إذا كان PTR RR غير فريد من نوعه، فسيكون هذا هو الحال بالنسبة لاسم مستعار.
المحلول 4
لقد أعطيتها غير ممكنة في ذلك الوقت، وأنا لم أعد مراجعتها منذ ذلك الحين.
الحل الحالي هو إضافة كل نسل فرعي من الفائدة إلى ملف المضيفين على الجهاز المحلي.
نصائح أخرى
لقد قمت بحل هذا أفضل ما أستطيع مع كمية صغيرة من الوقت الذي قمت بتعيينه لهذه المهمة.
ولكن لسوء الحظ، لا أعتقد أن تنفيذ Windows ل Avahi / MSDNS / Bonjour يدعم الأسماء المستعارة (تصحيح لي إذا كنت مخطئا في أمثلة حول كيفية دعم هذا).
ما فعلته هو الذي قمت به مع مثال البرنامج النصي Python المقدمة على موقع Afahi:
خلق : /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)، وهذا شيء يتعامل مع العديد من تطبيقات DAEMON على * Nix بالفعل (Apache و APT هي مثالين فقط).
خلق /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")
لا يعني ذلك بأي حال من الأحوال أن تكون قمة برمجة بيثون، لذلك لا تتردد في إجراء تحسينات حيث ترى مناسبا.
الاستعمال
إذا كان اسم المضيف لدينا "خادم" وكان Avahi-Hostname "Server.local"، فيمكننا ملء /etc/avahi/aliases
ملف نصي مع أسماء HostNAMES إضافية مثل:
deluge.server.local
username.server.local
accounts.server.local
something-else.server.local
another.hostname.home
(ولكن حقا، أنا متأكد من أنك يمكن أن يكون لديك أي اسم مضيف موجود هناك تأكد من أنه لم يكن موجودا بالفعل على الشبكة، وهذا هو السبب في أنني فقط خلق "نطفة فرعية" من اسم مضيف Avahi العادي)
ثم نركض:
sudo avahi-publish-aliases
كان السبب الرئيسي لوضع هذا الأمر هو تسهيل محاكاة أسهل لتطوير موقع Django & Drupal على جهاز الكمبيوتر المحمول الخاص بي.
تحفظات
خيبة أمل بلدي الوحيدة هي أن تنفيذ Windows Bonjour / Avahi لا يدعم الأسماء المستعارة التي يعلن بها هذا التنفيذ، وسوف يرى فقط اسم مضيف Avahi الرئيسي الذي أعلنه عادة (أي Server.local في مثالنا أعلاه).
يبدو أن Airtonix نفذت هذا وجعلها متوفرة في https://github.com/airtonix/avahi-aliases.
شوكة محدثة أحدث التي اختبرتها على Ubuntu 11.04 في https://github.com/hmalphettes/avahi-aliases.
يمكنك تسجيل سجلات إضافية باستخدام AVAHI API. هذا المثال على Avahi Wiki يوضح كيفية نشر سجلات CNAME إضافية (الاسم المستعار) في Python.
أعلم أن هذا قديم، ولكن حل أفضل سيكون dnsmasq..
يمكن تحقيق ذلك ببساطة ... عبر الحجج / التكوين ...
إرجاع iPaddr لجميع المضيفين في المجالات المحددة.
-A, --address=/<domain>/<ipaddr>
👍
address=/yourdomain.com/10.0.1.100
هاهو!