--- /dev/null
+#!/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()
# 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
# 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
}
#
# 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"