diff --git a/AvahiAlias b/AvahiAlias new file mode 100644 index 0000000..7cb0675 --- /dev/null +++ b/AvahiAlias @@ -0,0 +1,68 @@ +#!/usr/bin/env python3 +import dbus +import time +import sys + +from encodings.idna import ToASCII + + +class AvahiAliases: + def __init__(self): + self.CLASS_IN = 0x01 + self.TYPE_CNAME = 0x05 + self.TTL = 60 + self.DBUS_NAME = 'org.freedesktop.Avahi' + self.DBUS_PATH_SERVER = '/' + self.DBUS_INTERFACE_SERVER = self.DBUS_NAME + '.Server' + self.DBUS_INTERFACE_ENTRY_GROUP = self.DBUS_NAME + '.EntryGroup' + self.IF_UNSPEC = -1 + self.PROTO_UNSPEC = -1 + + def publish_cname(self, cname): + bus = dbus.SystemBus() + server = dbus.Interface(bus.get_object(self.DBUS_NAME, self.DBUS_PATH_SERVER), + self.DBUS_INTERFACE_SERVER) + group = dbus.Interface(bus.get_object(self.DBUS_NAME, server.EntryGroupNew()), + self.DBUS_INTERFACE_ENTRY_GROUP) + + rdata = self.create_rr(server.GetHostNameFqdn()) + cname = self.encode_dns(cname) + + group.AddRecord(self.IF_UNSPEC, self.PROTO_UNSPEC, dbus.UInt32(0), + cname, self.CLASS_IN, self.TYPE_CNAME, self.TTL, rdata) + group.Commit() + print("Published " + cname.decode()) + + @staticmethod + def encode_dns(name): + out = [] + name = name.decode() + for part in str(name).split('.'): + if len(part) == 0: + continue + out.append(ToASCII(part)) + return b'.'.join(out) + + @staticmethod + def create_rr(name): + out = [] + for part in name.split('.'): + if len(part) == 0: + continue + out.append(chr(len(part)).encode()) + out.append(ToASCII(part)) + out.append(b'\0') + + return b''.join(out) + + +if __name__ == '__main__': + avahi_aliases = AvahiAliases() + for each in sys.argv[1:]: + avahi_aliases.publish_cname(str(each).encode("utf-8", "strict")) + + try: + while True: + time.sleep(60) + except KeyboardInterrupt: + print("Exiting")