summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-rwxr-xr-xsource4/scripting/bin/samba_dnsupdate76
-rw-r--r--source4/scripting/python/pyglue.c7
-rw-r--r--source4/scripting/python/samba/provision.py2
3 files changed, 60 insertions, 25 deletions
diff --git a/source4/scripting/bin/samba_dnsupdate b/source4/scripting/bin/samba_dnsupdate
index 2e9c469adf..4fdd10de0a 100755
--- a/source4/scripting/bin/samba_dnsupdate
+++ b/source4/scripting/bin/samba_dnsupdate
@@ -20,6 +20,7 @@
import getopt
import os
+import fcntl
import sys
import tempfile
@@ -49,6 +50,8 @@ sambaopts = options.SambaOptions(parser)
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
@@ -63,7 +66,12 @@ lp = sambaopts.get_loadparm()
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:
@@ -94,38 +102,37 @@ def get_credentials(lp):
#############################################
# 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
############################################
@@ -142,6 +149,24 @@ def check_dns_name(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:
@@ -167,6 +192,7 @@ def check_dns_name(d):
d.existing_weight = str(rdata.weight)
if opts.verbose:
print "Failed to find DNS entry %s" % d
+
return False
@@ -195,6 +221,14 @@ def call_nsupdate(d):
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":
diff --git a/source4/scripting/python/pyglue.c b/source4/scripting/python/pyglue.c
index 6fe789ae73..89cf18e16a 100644
--- a/source4/scripting/python/pyglue.c
+++ b/source4/scripting/python/pyglue.c
@@ -614,8 +614,9 @@ static PyObject *py_interface_ips(PyObject *self, PyObject *args)
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);
@@ -633,7 +634,7 @@ static PyObject *py_interface_ips(PyObject *self, PyObject *args)
/* 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++;
}
}
@@ -641,7 +642,7 @@ static PyObject *py_interface_ips(PyObject *self, PyObject *args)
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++;
}
diff --git a/source4/scripting/python/samba/provision.py b/source4/scripting/python/samba/provision.py
index cb90141730..bac234cfac 100644
--- a/source4/scripting/python/samba/provision.py
+++ b/source4/scripting/python/samba/provision.py
@@ -1182,7 +1182,7 @@ def provision(setup_dir, message, session_info,
paths.bind_gid = bind_gid
if hostip is None:
- hostips = glue.interface_ips(lp)
+ hostips = glue.interface_ips(lp, False)
if len(hostips) == 0:
message("No external IPv4 address has been found: I use the loopback.")
hostip = '127.0.0.1'