import getopt
import os
+import fcntl
import sys
import tempfile
parser.add_option_group(sambaopts)
parser.add_option_group(options.VersionOptions(parser))
parser.add_option("--verbose", action="store_true")
+parser.add_option("--all-interfaces", action="store_true")
+parser.add_option("--use-file", type="string", help="Use a file, rather than real DNS calls")
creds = None
ccachename = None
domain = lp.get("realm")
host = lp.get("netbios name")
-IPs = glue.interface_ips(lp)
+if opts.all_interfaces:
+ all_interfaces = True
+else:
+ all_interfaces = False
+
+IPs = glue.interface_ips(lp, all_interfaces)
nsupdate_cmd = lp.get('nsupdate command')
if len(IPs) == 0:
#############################################
# an object to hold a parsed DNS line
class dnsobj(object):
- def __init__(self):
- self.type = None
- self.name = None
+ def __init__(self, string_form):
+ list = string_form.split()
self.dest = None
self.port = None
self.ip = None
self.existing_port = None
self.existing_weight = None
+ self.type = list[0]
+ self.name = list[1]
+ if self.type == 'SRV':
+ self.dest = list[2]
+ self.port = list[3]
+ elif self.type == 'A':
+ self.ip = list[2] # usually $IP, which gets replaced
+ elif self.type == 'CNAME':
+ self.dest = list[2]
+ else:
+ print "Received unexpected DNS reply of type %s" % self.type
+ raise
+
def __str__(self):
- if d.type == "A": return "%s:%s:%s" % (self.type, self.name, self.ip)
- if d.type == "SRV": return "%s:%s:%s:%s" % (self.type, self.name, self.dest, self.port)
- if d.type == "CNAME": return "%s:%s:%s" % (self.type, self.name, self.dest)
+ if d.type == "A": return "%s %s %s" % (self.type, self.name, self.ip)
+ if d.type == "SRV": return "%s %s %s %s" % (self.type, self.name, self.dest, self.port)
+ if d.type == "CNAME": return "%s %s %s" % (self.type, self.name, self.dest)
################################################
# parse a DNS line from
def parse_dns_line(line, sub_vars):
- d = dnsobj()
subline = samba.substitute_var(line, sub_vars)
- list = subline.split()
- d.type = list[0]
- d.name = list[1]
- if d.type == 'SRV':
- d.dest = list[2]
- d.port = list[3]
- elif d.type == 'A':
- d.ip = list[2] # usually $IP, which gets replaced
- elif d.type == 'CNAME':
- d.dest = list[2]
- else:
- print "Received unexpected DNS reply of type %s" % d.type
- raise
+ d = dnsobj(subline)
return d
############################################
normalised_name = d.name.rstrip('.') + '.'
if opts.verbose:
print "Looking for DNS entry %s as %s" % (d, normalised_name)
+
+ if opts.use_file is not None:
+ try:
+ dns_file = open(opts.use_file, "r")
+ except IOError:
+ return False
+
+ line = dns_file.readline()
+ while line:
+ line = line.rstrip().lstrip()
+ if line[0] == "#":
+ line = dns_file.readline()
+ continue
+ if line.lower() == str(d).lower():
+ return True
+ line = dns_file.readline()
+ return False
+
try:
ans = resolver.query(normalised_name, d.type)
except resolver.NXDOMAIN:
d.existing_weight = str(rdata.weight)
if opts.verbose:
print "Failed to find DNS entry %s" % d
+
return False
if opts.verbose:
print "Calling nsupdate for %s" % d
+
+ if opts.use_file is not None:
+ wfile = open(opts.use_file, 'a')
+ fcntl.lockf(wfile, fcntl.LOCK_EX)
+ wfile.write(str(d)+"\n")
+ fcntl.lockf(wfile, fcntl.LOCK_UN)
+ return
+
(tmp_fd, tmpfile) = tempfile.mkstemp()
f = os.fdopen(tmp_fd, 'w')
if d.type == "A":
struct loadparm_context *lp_ctx;
struct interface *ifaces;
int i, ifcount;
+ int all_interfaces;
- if (!PyArg_ParseTuple(args, "O", &py_lp_ctx))
+ if (!PyArg_ParseTuple(args, "Oi", &py_lp_ctx, &all_interfaces))
return NULL;
lp_ctx = lp_from_py_object(py_lp_ctx);
/* first count how many are not loopback addresses */
for (ifcount = i = 0; i<count; i++) {
const char *ip = iface_n_ip(ifaces, i);
- if (!iface_same_net(ip, "127.0.0.1", "255.0.0.0")) {
+ if (!(!all_interfaces && iface_same_net(ip, "127.0.0.1", "255.0.0.0"))) {
ifcount++;
}
}
pylist = PyList_New(ifcount);
for (ifcount = i = 0; i<count; i++) {
const char *ip = iface_n_ip(ifaces, i);
- if (!iface_same_net(ip, "127.0.0.1", "255.0.0.0")) {
+ if (!(!all_interfaces && iface_same_net(ip, "127.0.0.1", "255.0.0.0"))) {
PyList_SetItem(pylist, ifcount, PyString_FromString(ip));
ifcount++;
}