From dcad728f395a86d806c582b00bbc3075ab1ecbfe Mon Sep 17 00:00:00 2001 From: Ben Klang Date: Mon, 5 Dec 2005 02:39:30 +0000 Subject: [PATCH] Preparing for ldap2dns-0.3.6 + Fixed bug with duplicate OIDs in dns.schema from partially applied patch + Renamed schema file to ldap2dns.schema + Updated RPM specfile (UNTESTED, may need editing) + Removed already merged patchfiles + Restructured file layout, created doc directory + Deprecated unfinished webadmin work. Will be replaced with Beatnik + Deprecated OpenLDAP 2.0 schema support + Deprecated djbdns-1.0.5 native LDAP patch (status of patch unknown) + Removed old index.html + Removed TODO.schema + Updated Makefile git-svn-id: https://svn.alkaloid.net/gpl/ldap2dns/trunk@124 06cd67b6-e706-0410-b29e-9de616bca6e9 --- CHANGELOG | 10 ++ Makefile | 20 ++- Specfile | 29 ++-- TODO.schema | 1 - .../djbdns-1.0.5.patch | 0 .../openldap20-ldap2dns.schema | 0 {webadmin => deprecated/webadmin}/.htaccess | 0 {webadmin => deprecated/webadmin}/common.inc | 0 {webadmin => deprecated/webadmin}/config.inc | 0 {webadmin => deprecated/webadmin}/footer.inc | 0 .../webadmin}/framesets.inc | 0 .../webadmin}/icons/branch-cont.gif | Bin .../webadmin}/icons/branch-end.gif | Bin .../webadmin}/icons/folder-closed.gif | Bin .../webadmin}/icons/folder-open.gif | Bin .../webadmin}/icons/img-blank.gif | Bin .../webadmin}/icons/img-vert-line.gif | Bin .../webadmin}/icons/minus-cont.gif | Bin .../webadmin}/icons/minus-end.gif | Bin .../webadmin}/icons/plus-cont.gif | Bin .../webadmin}/icons/plus-end.gif | Bin .../webadmin}/icons/zone_forb.gif | Bin .../webadmin}/icons/zone_new.gif | Bin .../webadmin}/icons/zone_unkn.gif | Bin .../webadmin}/icons/zone_unre.gif | Bin .../webadmin}/icons/zone_val.gif | Bin {webadmin => deprecated/webadmin}/index.php | 0 {webadmin => deprecated/webadmin}/main.css | 0 .../webadmin}/mainheader.inc | 0 {webadmin => deprecated/webadmin}/menu.css | 0 .../webadmin}/menuheader.inc | 0 {webadmin => deprecated/webadmin}/xearth.css | 0 {webadmin => deprecated/webadmin}/xearth.php | 0 .../webadmin}/xearthimage.php | 0 README.html => doc/README.html | 0 example.ldif => doc/example.ldif | 0 index.html | 46 ------ ldap2dns-dbg | Bin 71947 -> 0 bytes ldap2dns-ldapuri.patch | 134 ------------------ ldap2dns-loccode.patch | 31 ---- dns.schema-2.2 => ldap2dns.schema | 0 41 files changed, 38 insertions(+), 233 deletions(-) delete mode 100644 TODO.schema rename djbdns-1.0.5.patch => deprecated/djbdns-1.0.5.patch (100%) rename dns.schema-2.0 => deprecated/openldap20-ldap2dns.schema (100%) rename {webadmin => deprecated/webadmin}/.htaccess (100%) rename {webadmin => deprecated/webadmin}/common.inc (100%) rename {webadmin => deprecated/webadmin}/config.inc (100%) rename {webadmin => deprecated/webadmin}/footer.inc (100%) rename {webadmin => deprecated/webadmin}/framesets.inc (100%) rename {webadmin => deprecated/webadmin}/icons/branch-cont.gif (100%) rename {webadmin => deprecated/webadmin}/icons/branch-end.gif (100%) rename {webadmin => deprecated/webadmin}/icons/folder-closed.gif (100%) rename {webadmin => deprecated/webadmin}/icons/folder-open.gif (100%) rename {webadmin => deprecated/webadmin}/icons/img-blank.gif (100%) rename {webadmin => deprecated/webadmin}/icons/img-vert-line.gif (100%) rename {webadmin => deprecated/webadmin}/icons/minus-cont.gif (100%) rename {webadmin => deprecated/webadmin}/icons/minus-end.gif (100%) rename {webadmin => deprecated/webadmin}/icons/plus-cont.gif (100%) rename {webadmin => deprecated/webadmin}/icons/plus-end.gif (100%) rename {webadmin => deprecated/webadmin}/icons/zone_forb.gif (100%) rename {webadmin => deprecated/webadmin}/icons/zone_new.gif (100%) rename {webadmin => deprecated/webadmin}/icons/zone_unkn.gif (100%) rename {webadmin => deprecated/webadmin}/icons/zone_unre.gif (100%) rename {webadmin => deprecated/webadmin}/icons/zone_val.gif (100%) rename {webadmin => deprecated/webadmin}/index.php (100%) rename {webadmin => deprecated/webadmin}/main.css (100%) rename {webadmin => deprecated/webadmin}/mainheader.inc (100%) rename {webadmin => deprecated/webadmin}/menu.css (100%) rename {webadmin => deprecated/webadmin}/menuheader.inc (100%) rename {webadmin => deprecated/webadmin}/xearth.css (100%) rename {webadmin => deprecated/webadmin}/xearth.php (100%) rename {webadmin => deprecated/webadmin}/xearthimage.php (100%) rename README.html => doc/README.html (100%) rename example.ldif => doc/example.ldif (100%) delete mode 100644 index.html delete mode 100755 ldap2dns-dbg delete mode 100644 ldap2dns-ldapuri.patch delete mode 100644 ldap2dns-loccode.patch rename dns.schema-2.2 => ldap2dns.schema (100%) diff --git a/CHANGELOG b/CHANGELOG index 8bc1f1d..4135625 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -5,6 +5,16 @@ Version ?.?.? (next) Version 0.3.6 (latest) + Fixed bug with duplicate OIDs in dns.schema from partially applied patch ++ Renamed schema file to ldap2dns.schema ++ Updated RPM specfile (UNTESTED, may need editing) ++ Removed already merged patchfiles ++ Restructured file layout, created doc directory ++ Deprecated unfinished webadmin work. Will be replaced with Beatnik ++ Deprecated OpenLDAP 2.0 schema support ++ Deprecated djbdns-1.0.5 native LDAP patch (status of patch unknown) ++ Removed old index.html ++ Removed TODO.schema ++ Updated Makefile Version 0.3.5 - 2005/11/30 + Added support for DNS SRV records diff --git a/Makefile b/Makefile index 05e29d5..55abf4f 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ # $Id: Makefile,v 1.30 2003/01/20 14:33:25 jrief Exp $ -VERSION=0.3.4 +VERSION=0.3.6 RELEASE=1 CC=gcc -O2 CCDEBUG=gcc -g @@ -10,10 +10,14 @@ LDFLAGS= INSTALL_PREFIX= PREFIXDIR=$(INSTALL_PREFIX)/usr LDAPCONFDIR=$(INSTALL_PREFIX)/etc/openldap -TARFILE=/usr/src/redhat/SOURCES/ldap2dns-$(VERSION).tar.gz SPECFILE=ldap2dns.spec +RPMSRCDIR=/usr/src/packages/SOURCES +# For Red Hat use +# make RPMSRCDIR=/usr/src/redhat/SOURCES rpm -all: ldap2dns ldap2dnsd ldap2dns-dbg +all: ldap2dns ldap2dnsd + +debug: ldap2dns-dbg ldap2dns: ldap2dns.o $(LIBS) $(LD) $(LDFLAGS) -o $@ $+ @@ -36,14 +40,17 @@ install: all install -s -o root -g root -m 755 ldap2dns $(PREFIXDIR)/bin/ ln -f $(PREFIXDIR)/bin/ldap2dns $(PREFIXDIR)/bin/ldap2dnsd install -o root -g root -m 755 ldap2tinydns-conf $(PREFIXDIR)/bin/ - install -o root -g root -m 644 dns.schema $(LDAPCONFDIR)/schema/ + install -o root -g root -m 644 ldap2dns.schema $(LDAPCONFDIR)/schema/ clean: rm -f *.o *.o-dbg ldap2dns ldap2dnsd data* *.db core $(SPECFILE) tar: clean cd ..; \ - tar czf $(TARFILE) ldap2dns-$(VERSION) --exclude CVS + mv ldap2dns ldap2dns-$(VERSION); \ + tar --exclude .svn -czf ldap2dns-$(VERSION).tar.gz ldap2dns-$(VERSION); \ + mv ldap2dns-$(VERSION) ldap2dns; \ + cd ldap2dns $(SPECFILE): Specfile sed -e 's#%VERSION%#$(VERSION)#g' \ @@ -51,6 +58,7 @@ $(SPECFILE): Specfile < $< > $@ rpm: tar $(SPECFILE) - rpm -ba $(SPECFILE) + mv ../ldap2dns-$(VERSION).tar.gz $(RPMSRCDIR) + rpmbuild -ba $(SPECFILE) diff --git a/Specfile b/Specfile index 61c48ef..0b9d8c0 100644 --- a/Specfile +++ b/Specfile @@ -1,5 +1,3 @@ -%define djbdns djbdns-1.02 - Summary: LDAP to DNS gateway. Name: ldap2dns Version: %VERSION% @@ -8,19 +6,19 @@ Copyright: GPL Group: Daemons/DNS Source: ldap2dns-%{version}.tar.gz BuildRoot: /var/tmp/%{name}-root -Requires: openldap +Requires: openldap-devel %description -ldap2dns is a program to create DNS records directly from an LDAP database. It can -be be used to replace the secondary name-server by a second primary one. -ldap2dns helps to reduce all kind of administration overhead. No more flat file editing, -no more zone file editing. After having installed ldap2dns, the administrator only has -to access the LDAP database. -If he desires he can add access control for each zone, create a webbased GUI and add -all other kind of zone and resource record information without interfering with the DNS -server. -ldap2dns is designed to write binary data.cdb files used by tinydns, but also may be -used to write .db-files used by named. +ldap2dns is a program to create DNS records directly from an LDAP database. It +can be be used to replace the secondary name-server by a second primary one. +ldap2dns helps to reduce all kind of administration overhead. No more flat file +editing, no more zone file editing. After having installed ldap2dns, the +administrator only has to access the LDAP database. +If he desires he can add access control for each zone, create a webbased GUI +and add all other kind of zone and resource record information without +interfering with the DNS server. +ldap2dns is designed to write binary data.cdb files used by tinydns, but also +may be used to write .db-files used by named. %prep %setup @@ -42,10 +40,11 @@ make INSTALL_PREFIX=$RPM_BUILD_ROOT install /usr/bin/ldap2tinydns-conf %doc README.html %doc import.pl -%config /etc/openldap/dns.at.conf -%config /etc/openldap/dns.oc.conf +%config /etc/openldap/schema/ldap2dns.schema %changelog +* Sun Dec 04 2005 Ben Klang +- Updated Specfile to version 0.3.6 * Wed Dec 06 2000 Jacob Rief - initial revision for version 0.2.0 diff --git a/TODO.schema b/TODO.schema deleted file mode 100644 index 668aa32..0000000 --- a/TODO.schema +++ /dev/null @@ -1 +0,0 @@ -# schema for DNS data# include this file into Your slapd.conf for openldap-2.0.x# $Id: dns.schema,v 1.9 2001/11/06 08:01:51 config Exp $attributetype ( 1.3.6.1.4.1.7222.1.4.1 NAME 'dnszonename' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.2 NAME 'dnsserial' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.3 NAME 'dnsrefresh' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.4 NAME 'dnsretry' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.5 NAME 'dnsexpire' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.6 NAME 'dnsminimum' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.7 NAME 'dnsadminmailbox' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.8 NAME 'dnszonemaster' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.9 NAME 'dnstype' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.10 NAME 'dnsclass' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.11 NAME 'dnsdomainname' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.12 NAME 'dnsipaddr' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} ) SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.13 NAME 'dnscipaddr' EQUALITY caseIgnoreIA5Match SUBSTR caseIgnoreIA5SubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{16} )attributetype ( 1.3.6.1.4.1.7222.1.4.14 NAME 'dnscname' SUP name )attributetype ( 1.3.6.1.4.1.7222.1.4.15 NAME 'dnspreference' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.16 NAME 'dnsrr' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.17 NAME 'dnsttl' EQUALITY integerMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.18 NAME 'dnstimestamp' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )attributetype ( 1.3.6.1.4.1.7222.1.4.21 NAME 'NIChandle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{16} )attributetype ( 1.3.6.1.4.1.7222.1.4.22 NAME 'TIShandle' EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{16} )objectclass ( 1.3.6.1.4.1.7222.1.4.19 NAME 'dnszone' MUST ( objectclass $ cn ) MAY ( dnszonename $ dnsserial $ dnsrefresh $ dnsretry $ dnsexpire $ dnsminimum $ dnsadminmailbox $ dnszonemaster $ dnstype $ dnsclass $ dnsttl $ dnstimestamp $ owner $ NIChandle $ TIShandle ) )objectclass ( 1.3.6.1.4.1.7222.1.4.20 NAME 'dnsrrset' SUP dnszone MUST ( objectclass $ cn ) MAY ( dnsdomainname $ dnsrr $ dnsclass $ dnstype $ dnsipaddr $ dnscipaddr $ dnscname $ dnspreference $ dnsttl $ dnstimestamp $ owner ) ) diff --git a/djbdns-1.0.5.patch b/deprecated/djbdns-1.0.5.patch similarity index 100% rename from djbdns-1.0.5.patch rename to deprecated/djbdns-1.0.5.patch diff --git a/dns.schema-2.0 b/deprecated/openldap20-ldap2dns.schema similarity index 100% rename from dns.schema-2.0 rename to deprecated/openldap20-ldap2dns.schema diff --git a/webadmin/.htaccess b/deprecated/webadmin/.htaccess similarity index 100% rename from webadmin/.htaccess rename to deprecated/webadmin/.htaccess diff --git a/webadmin/common.inc b/deprecated/webadmin/common.inc similarity index 100% rename from webadmin/common.inc rename to deprecated/webadmin/common.inc diff --git a/webadmin/config.inc b/deprecated/webadmin/config.inc similarity index 100% rename from webadmin/config.inc rename to deprecated/webadmin/config.inc diff --git a/webadmin/footer.inc b/deprecated/webadmin/footer.inc similarity index 100% rename from webadmin/footer.inc rename to deprecated/webadmin/footer.inc diff --git a/webadmin/framesets.inc b/deprecated/webadmin/framesets.inc similarity index 100% rename from webadmin/framesets.inc rename to deprecated/webadmin/framesets.inc diff --git a/webadmin/icons/branch-cont.gif b/deprecated/webadmin/icons/branch-cont.gif similarity index 100% rename from webadmin/icons/branch-cont.gif rename to deprecated/webadmin/icons/branch-cont.gif diff --git a/webadmin/icons/branch-end.gif b/deprecated/webadmin/icons/branch-end.gif similarity index 100% rename from webadmin/icons/branch-end.gif rename to deprecated/webadmin/icons/branch-end.gif diff --git a/webadmin/icons/folder-closed.gif b/deprecated/webadmin/icons/folder-closed.gif similarity index 100% rename from webadmin/icons/folder-closed.gif rename to deprecated/webadmin/icons/folder-closed.gif diff --git a/webadmin/icons/folder-open.gif b/deprecated/webadmin/icons/folder-open.gif similarity index 100% rename from webadmin/icons/folder-open.gif rename to deprecated/webadmin/icons/folder-open.gif diff --git a/webadmin/icons/img-blank.gif b/deprecated/webadmin/icons/img-blank.gif similarity index 100% rename from webadmin/icons/img-blank.gif rename to deprecated/webadmin/icons/img-blank.gif diff --git a/webadmin/icons/img-vert-line.gif b/deprecated/webadmin/icons/img-vert-line.gif similarity index 100% rename from webadmin/icons/img-vert-line.gif rename to deprecated/webadmin/icons/img-vert-line.gif diff --git a/webadmin/icons/minus-cont.gif b/deprecated/webadmin/icons/minus-cont.gif similarity index 100% rename from webadmin/icons/minus-cont.gif rename to deprecated/webadmin/icons/minus-cont.gif diff --git a/webadmin/icons/minus-end.gif b/deprecated/webadmin/icons/minus-end.gif similarity index 100% rename from webadmin/icons/minus-end.gif rename to deprecated/webadmin/icons/minus-end.gif diff --git a/webadmin/icons/plus-cont.gif b/deprecated/webadmin/icons/plus-cont.gif similarity index 100% rename from webadmin/icons/plus-cont.gif rename to deprecated/webadmin/icons/plus-cont.gif diff --git a/webadmin/icons/plus-end.gif b/deprecated/webadmin/icons/plus-end.gif similarity index 100% rename from webadmin/icons/plus-end.gif rename to deprecated/webadmin/icons/plus-end.gif diff --git a/webadmin/icons/zone_forb.gif b/deprecated/webadmin/icons/zone_forb.gif similarity index 100% rename from webadmin/icons/zone_forb.gif rename to deprecated/webadmin/icons/zone_forb.gif diff --git a/webadmin/icons/zone_new.gif b/deprecated/webadmin/icons/zone_new.gif similarity index 100% rename from webadmin/icons/zone_new.gif rename to deprecated/webadmin/icons/zone_new.gif diff --git a/webadmin/icons/zone_unkn.gif b/deprecated/webadmin/icons/zone_unkn.gif similarity index 100% rename from webadmin/icons/zone_unkn.gif rename to deprecated/webadmin/icons/zone_unkn.gif diff --git a/webadmin/icons/zone_unre.gif b/deprecated/webadmin/icons/zone_unre.gif similarity index 100% rename from webadmin/icons/zone_unre.gif rename to deprecated/webadmin/icons/zone_unre.gif diff --git a/webadmin/icons/zone_val.gif b/deprecated/webadmin/icons/zone_val.gif similarity index 100% rename from webadmin/icons/zone_val.gif rename to deprecated/webadmin/icons/zone_val.gif diff --git a/webadmin/index.php b/deprecated/webadmin/index.php similarity index 100% rename from webadmin/index.php rename to deprecated/webadmin/index.php diff --git a/webadmin/main.css b/deprecated/webadmin/main.css similarity index 100% rename from webadmin/main.css rename to deprecated/webadmin/main.css diff --git a/webadmin/mainheader.inc b/deprecated/webadmin/mainheader.inc similarity index 100% rename from webadmin/mainheader.inc rename to deprecated/webadmin/mainheader.inc diff --git a/webadmin/menu.css b/deprecated/webadmin/menu.css similarity index 100% rename from webadmin/menu.css rename to deprecated/webadmin/menu.css diff --git a/webadmin/menuheader.inc b/deprecated/webadmin/menuheader.inc similarity index 100% rename from webadmin/menuheader.inc rename to deprecated/webadmin/menuheader.inc diff --git a/webadmin/xearth.css b/deprecated/webadmin/xearth.css similarity index 100% rename from webadmin/xearth.css rename to deprecated/webadmin/xearth.css diff --git a/webadmin/xearth.php b/deprecated/webadmin/xearth.php similarity index 100% rename from webadmin/xearth.php rename to deprecated/webadmin/xearth.php diff --git a/webadmin/xearthimage.php b/deprecated/webadmin/xearthimage.php similarity index 100% rename from webadmin/xearthimage.php rename to deprecated/webadmin/xearthimage.php diff --git a/README.html b/doc/README.html similarity index 100% rename from README.html rename to doc/README.html diff --git a/example.ldif b/doc/example.ldif similarity index 100% rename from example.ldif rename to doc/example.ldif diff --git a/index.html b/index.html deleted file mode 100644 index b930020..0000000 --- a/index.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - LDAP to DNS gateway - - - - -
-

- -

-

Download

- - - - - - - - - - - - -
Versiontar.gzrpmsrpmReleased
0.1.1ldap2dns2000-Sep-19
0.1.2ldap2dns2000-Sep-22
0.1.3ldap2dns2000-Sep-28
0.1.4ldap2dns2000-Oct-04
0.2.0ldap2dnsldap2dnsldap2dns2000-Dec-14
0.2.2ldap2dnsldap2dnsldap2dns2001-Feb-16
0.2.3ldap2dnsldap2dnsldap2dns2001-Mar-23
0.2.4ldap2dnsldap2dnsldap2dns2001-May-08
0.2.5ldap2dnsldap2dnsldap2dns2001-Jun-27
0.2.6ldap2dnsldap2dnsldap2dns2001-Aug-09
- -
- - - diff --git a/ldap2dns-dbg b/ldap2dns-dbg deleted file mode 100755 index 0427d1802dbe3d01c48d9900ef03d8a4f3bce222..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71947 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 diff --git a/ldap2dns-ldapuri.patch b/ldap2dns-ldapuri.patch deleted file mode 100644 index 40c15a1..0000000 --- a/ldap2dns-ldapuri.patch +++ /dev/null @@ -1,134 +0,0 @@ ---- ldap2dns-0.3.1-orig/ldap2dns.c 2002-08-02 17:19:36.000000000 +0200 -+++ ldap2dns-0.3.1/ldap2dns.c 2002-09-01 13:31:52.000000000 +0200 -@@ -14,7 +14,7 @@ - #include - - #define UPDATE_INTERVALL 59 --#define LDAP_CONF "/etc/ldap.conf" -+#define LDAP_CONF "/etc/ldap/ldap.conf" - #define OUTPUT_DATA 1 - #define OUTPUT_DB 2 - #define MAXHOSTS 10 -@@ -85,6 +85,7 @@ - char searchbase[128]; - char binddn[128]; - char hostname[MAXHOSTS][128]; -+ char urildap[MAXHOSTS][128]; - int port[MAXHOSTS]; - char password[128]; - int usedhosts; -@@ -94,6 +95,7 @@ - int verbose; - char ldifname[128]; - char exec_command[128]; -+ int use_tls[MAXHOSTS]; - } options; - - -@@ -130,7 +132,8 @@ - static void print_usage(void) - { - print_version(); -- printf("usage: ldap2dns[d] [-D binddn] [-b searchbase] [-o data|db] [-h host] [-p port] [-w password] [-L[filename]] [-u numsecs] [-v[v]] [-V]\n\n"); -+ printf("usage: ldap2dns[d] [-D binddn] [-b searchbase] [-o data|db] [-h host] [-p port] [-H hostURI] " -+ "[-w password] [-L[filename]] [-u numsecs] [-v[v]] [-V]\n\n"); - printf("ldap2dns connects to an LDAP server reads the DNS information stored in objectclasses\n" - "\t\tDNSzone and DNSrrset and writes a file to be used by tinydns or named.\n" - "\t\tldap2dnsd starts as background-job and continouesly updates DNS information.\n"); -@@ -143,6 +146,7 @@ - printf(" -L[filename] Print output in LDIF format for reimport\n"); - printf(" -h host\tHostname of LDAP server, defaults to localhost\n"); - printf(" -p port\tPortnumber to connect to LDAP server, defaults to %d\n", LDAP_PORT); -+ printf(" -H hostURI\tURI (ldap://hostname or ldaps://hostname of LDAP server\n"); - printf(" -u numsecs\tUpdate DNS data after numsecs. Defaults to %d if started as daemon.\n\t\t" - "Important notice: data.cdb is rewritten only after DNSserial in DNSzone is increased.\n", - UPDATE_INTERVALL); -@@ -159,7 +163,18 @@ - - options.usedhosts = 0; - for (i = 0; i=2) { -+ if (!strncasecmp(buf, "ldaps://", 8) || !strncasecmp(buf, "ldap://", 7)) { -+ // LDAP-URI is given/found, at the moment only the standard-ports 389 and 636 are supported -+ if (!strncasecmp(buf, "ldap://", 7)) -+ options.use_tls[i] = 1; -+ if ((k = sscanf(buf, "%128s %512[A-Za-z0-9 .:/_+-]", value, rest))>=1) { -+ strcpy(options.urildap[i], value); -+ options.usedhosts++; -+ if (k==1) -+ break; -+ buf = rest; -+ } else break; -+ } else if ((k = sscanf(buf, "%128s:%d %512[A-Za-z0-9 .:_+-]", value, &port, rest))>=2) { - strcpy(options.hostname[i], value); - options.port[i] = port; - options.usedhosts++; -@@ -194,6 +209,8 @@ - int i; - if (sscanf(buf, "BASE %128s", value)==1) - strcpy(options.searchbase, value); -+ if (sscanf(buf, "URI %512[A-Za-z0-9 .:/_+-]", value)==1) -+ parse_hosts(value); - if (sscanf(buf, "HOST %512[A-Za-z0-9 .:_+-]", value)==1) - parse_hosts(value); - if (sscanf(buf, "PORT %d", &len)==1) -@@ -239,7 +256,7 @@ - options.ldifname[0] = '\0'; - strcpy(options.password, ""); - strcpy(options.exec_command, ""); -- while ( (len = getopt(main_argc, main_argv, "b:D:e:h:o:p:u:V:v::w:L::"))>0 ) { -+ while ( (len = getopt(main_argc, main_argv, "b:D:e:h:H:o:p:u:V:v::w:L::"))>0 ) { - if (optarg && strlen(optarg)>127) { - fprintf(stderr, "argument %s too long\n", optarg); - continue; -@@ -260,6 +277,10 @@ - strcpy(options.hostname[0], optarg); - options.usedhosts = 1; - break; -+ case 'H': -+ strcpy(options.urildap[0], optarg); -+ options.usedhosts = 1; -+ break; - case 'L': - if (optarg==NULL) - strcpy(options.ldifname, "-"); -@@ -796,12 +817,37 @@ - - static int connect() - { -- int i; -+ int i, rc, version; - for (i = 0; i 0) { -+ rc = ldap_initialize(&ldap_con, options.urildap[i]); -+ if (options.verbose&1 && rc == LDAP_SUCCESS) { -+ printf("ldap_initialization successful (%s)\n", options.urildap[i]); -+ } else if ( rc != LDAP_SUCCESS ) { -+ printf("ldap_initialization to %s failed %d\n", options.urildap[i], ldap_err2string(rc)); -+ ldap_con = NULL; -+ return 0; -+ } -+ version = LDAP_VERSION3; -+ if ( (rc=ldap_set_option(ldap_con, LDAP_OPT_PROTOCOL_VERSION, &version)) != LDAP_SUCCESS ) { -+ printf("ldap_set_option to %s failed with err %s!\n", options.urildap[i], ldap_err2string(rc)); -+ ldap_con = NULL; -+ return 0; -+ } -+ if ( options.use_tls[i] && (rc=ldap_start_tls_s( ldap_con, NULL, NULL )) != LDAP_SUCCESS ) { -+ printf("ldap_start_tls_s to %s failed with err %s!\n", options.urildap[i], ldap_err2string(rc)); -+ ldap_con = NULL; -+ return 0; -+ } -+ } else { - ldap_con = ldap_init(options.hostname[i], options.port[i]); -+ } - if (ldap_simple_bind_s(ldap_con, options.binddn, options.password)==LDAP_SUCCESS) { -- if (options.verbose&1) -+ if (options.verbose&1 && strlen(options.urildap[i]) > 0) { -+ printf("Connected to %s as \"%s\"\n", options.urildap[i], options.binddn); -+ } else if (options.verbose&1) { - printf("Connected to %s:%d as \"%s\"\n", options.hostname[i], options.port[i], options.binddn); -+ } - return 1; - } - } diff --git a/ldap2dns-loccode.patch b/ldap2dns-loccode.patch deleted file mode 100644 index 56b7704..0000000 --- a/ldap2dns-loccode.patch +++ /dev/null @@ -1,31 +0,0 @@ -diff -bu ldap2dns-0.3.1-p1/dns.schema-2.2 ldap2dns-0.3.1/dns.schema-2.2 ---- ldap2dns-0.3.1-p1/dns.schema-2.2 2002-08-13 14:23:53.000000000 +0200 -+++ ldap2dns-0.3.1/dns.schema-2.2 2002-09-02 10:10:32.000000000 +0200 -@@ -99,12 +99,18 @@ - SUBSTR caseIgnoreSubstringsMatch - SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{16} ) - -+attributetype ( 1.3.6.1.4.1.7222.1.4.23 -+ NAME 'dnslocation' -+ EQUALITY caseExactIA5Match -+ SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{2} -+ SINGLE-VALUE ) -+ - objectclass ( 1.3.6.1.4.1.7222.1.4.19 - NAME 'dnszone' - MUST ( objectclass $ cn ) - MAY ( dnszonename $ dnsserial $ dnsrefresh $ dnsretry $ dnsexpire - $ dnsminimum $ dnsadminmailbox $ dnszonemaster $ dnstype $ dnsclass -- $ dnsttl $ dnstimestamp $ owner $ NIChandle $ TIShandle ) ) -+ $ dnsttl $ dnstimestamp $ owner $ NIChandle $ TIShandle $ dnslocation ) ) - - objectclass ( 1.3.6.1.4.1.7222.1.4.20 - NAME 'dnsrrset' -@@ -113,3 +119,7 @@ - MAY ( dnsdomainname $ dnsrr $ dnsclass $ dnstype $ dnsipaddr $ dnscipaddr - $ dnscname $ dnspreference $ dnsttl $ dnstimestamp $ owner ) ) - -+objectclass ( 1.3.6.1.4.1.7222.1.4.24 -+ NAME 'dnsloccodes' -+ MUST ( objectclass $ dnslocation ) -+ MAY ( dnsipaddr $ uid $ description ) ) diff --git a/dns.schema-2.2 b/ldap2dns.schema similarity index 100% rename from dns.schema-2.2 rename to ldap2dns.schema