From: Evan Broder Date: Mon, 25 Feb 2008 03:34:49 +0000 (-0500) Subject: Created init scripts and moved dnsserver.py script into sipb-xen-dns package X-Git-Tag: sipb-xen-dns/1~10 X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-dns.git/commitdiff_plain/fbabf89bd5bbb2d312d68e8841b692421cb7a08e?hp=8df303d1e34d29f58de28eb6e3892875aee9fe87 Created init scripts and moved dnsserver.py script into sipb-xen-dns package svn path=/trunk/packages/sipb-xen-dns/; revision=269 --- diff --git a/code/dnsserver.py b/code/dnsserver.py new file mode 100644 index 0000000..3cc8dc5 --- /dev/null +++ b/code/dnsserver.py @@ -0,0 +1,61 @@ +#!/usr/bin/python +from twisted.internet import reactor +from twisted.names import server +from twisted.names import dns +from twisted.names import common +from twisted.internet import defer +from twisted.python import failure + +import sipb_xen_database + +class DatabaseAuthority(common.ResolverBase): + """An Authority that is loaded from a file.""" + + soa = None + + def __init__(self, domain, database=None): + common.ResolverBase.__init__(self) + if database is not None: + sipb_xen_database.connect(database) + self.domain = domain + self.soa = dns.Record_SOA(mname='sipb-xen-dev.mit.edu', + rname='sipb-xen.mit.edu', + serial=1, refresh=3600, retry=900, + expire=3600000, minimum=21600, ttl=3600) + def _lookup(self, name, cls, type, timeout = None): + if not (name.lower() == self.domain or + name.lower().endswith('.'+self.domain)): + #Not us + return defer.fail(failure.Failure(dns.DomainError(name))) + results = [] + if cls == dns.IN and type in (dns.A, dns.ALL_RECORDS): + host = name[:-len(self.domain)-1] + value = sipb_xen_database.Machine.get_by(name=host) + if value is None or not value.nics: + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + ip = value.nics[0].ip + if ip is None: #Deactivated? + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + ttl = 900 + record = dns.Record_A(ip, ttl) + results.append(dns.RRHeader(name, dns.A, dns.IN, + ttl, record, auth=True)) + authority = [] + authority.append(dns.RRHeader(self.domain, dns.SOA, dns.IN, 3600, + self.soa, auth=True)) + return defer.succeed((results, authority, [])) + #Doesn't exist + return defer.fail(failure.Failure(dns.AuthoritativeDomainError(name))) + +if '__main__' == __name__: + resolver = DatabaseAuthority('servers.csail.mit.edu', + 'postgres://sipb-xen@sipb-xen-dev/sipb_xen') + + verbosity = 0 + f = server.DNSServerFactory(authorities=[resolver], verbose=verbosity) + p = dns.DNSDatagramProtocol(f) + f.noisy = p.noisy = verbosity + + reactor.listenUDP(53, p) + reactor.listenTCP(53, f) + reactor.run() diff --git a/debian/control b/debian/control index 6bcaba1..0b8540e 100644 --- a/debian/control +++ b/debian/control @@ -7,8 +7,5 @@ Standards-Version: 3.7.2 Package: sipb-xen-dns Architecture: all -Depends: ${misc:Depends}, -Description: Base configuration required for all SIPB xen servers - This package includes apt configuration, .k5login and other files that - should be synchronized among all our servers. - Installing this on a non-sipb-xen machine would be very anti-social. +Depends: ${misc:Depends}, daemon +Description: Install and enable the DNS server diff --git a/debian/rules b/debian/rules index 25812e0..4d88e52 100755 --- a/debian/rules +++ b/debian/rules @@ -3,4 +3,4 @@ include /usr/share/cdbs/1/rules/debhelper.mk binary-fixup/sipb-xen-dns:: - svn co file:///mit/sipb-xen/svn/trunk/dns/ $(DEB_DESTDIR)/usr/local/lib/sipb-xen-dns + svn co file:///mit/sipb-xen/svn/trunk/packages/sipb-xen-dns/code/ $(DEB_DESTDIR)/usr/local/lib/sipb-xen-dns diff --git a/debian/sipb-xen-dns.init b/debian/sipb-xen-dns.init index 1472184..2b8d3cb 100644 --- a/debian/sipb-xen-dns.init +++ b/debian/sipb-xen-dns.init @@ -18,10 +18,10 @@ # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin -DESC="Description of the service" -NAME=daemonexecutablename -DAEMON=/usr/sbin/$NAME -DAEMON_ARGS="--options args" +DESC="The sipb-xen DNS server" +NAME=sipb-xen-dns +DAEMON=/usr/local/lib/sipb-xen-dns/dnsserver.py +DAEMON_ARGS="" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME @@ -47,14 +47,8 @@ do_start() # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ - || return 1 - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ - $DAEMON_ARGS \ - || return 2 - # Add code here, if necessary, that waits for the process to be ready - # to handle requests from services started subsequently which depend - # on this one. As a last resort, sleep for some time. + daemon --running -n $NAME && return 1 + daemon -r -n $NAME -U $DAEMON $DAEMON_ARGS || return 2 } # @@ -67,35 +61,14 @@ do_stop() # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred - start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME + daemon --stop -n $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 - # Wait for children to finish too if this is a daemon that forks - # and if the daemon is only ever run from this initscript. - # If the above conditions are not satisfied then add some other code - # that waits for the process to drop all resources that could be - # needed by services started subsequently. A last resort is to - # sleep for some time. - start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON - [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } -# -# Function that sends a SIGHUP to the daemon/service -# -do_reload() { - # - # If the daemon can reload its configuration without - # restarting (for example, when it is sent a SIGHUP), - # then implement that here. - # - start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME - return 0 -} - case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"