diff --git a/CHANGELOG b/CHANGELOG index 82dcca3..a66b408 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,12 @@ -Version 0.2.3 +Version 0.2.4 (todo) + Check for next availabe server in /etc/ldap.conf if first one is unavialable. +Version 0.2.3 +- Replaced integer variables for DNSserial, DNSttl etc. by strings + to allow better default handling by tinydns-data. +- ldap2dns now writes logfiles. + Version 0.2.2 - Tested with djbdns-1.05 diff --git a/Makefile b/Makefile index 888b4f3..0b94dbe 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # $Id: Makefile,v 1.22 2001/02/16 09:51:23 jrief Exp $ -VERSION=0.2.2 -RELEASE=2 +VERSION=0.2.3 +RELEASE=1 CC=gcc -O2 CFLAGS=$(INC) $(WITHTINYDNS) -DVERSION='"$(VERSION)"' OBJS=ldap2dns.o @@ -36,7 +36,7 @@ clean: tar: clean cd ..; \ - tar czf $(TARFILE) ldap2dns-$(VERSION) --exclude CVS + tar czf $(TARFILE) ldap2dns-$(VERSION) --exclude CVS --exclude DNSadmin $(SPECFILE): Specfile sed -e 's#%VERSION%#$(VERSION)#g' \ diff --git a/README.html b/README.html index 02edb68..8e26116 100644 --- a/README.html +++ b/README.html @@ -327,14 +327,19 @@ for a single domain or to populate Your LDAP directory.

-

6. To Do

+

6. Coming soon

+A browser-based administration toolkit, which connects directly +to the LDAP-directory service. Here is a screenshot +

+ +

7. To Do

-

7. Copyright and disclaimer

+

8. Copyright and disclaimer

This program is licensed under the GPL version 2 or at Your choice any later version.
It is maintained by Jacob Rief. diff --git a/example.html b/example.html new file mode 100644 index 0000000..a2df39e --- /dev/null +++ b/example.html @@ -0,0 +1 @@ +DNS Zone Admin You need a frame capable browser diff --git a/example_b.html b/example_b.html new file mode 100644 index 0000000..1f19a1e --- /dev/null +++ b/example_b.html @@ -0,0 +1,555 @@ + + + +

The nameserver is active and authorized to handle this zone

+

Edit DNS zone tirol.at

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DNS NameTypeMappingTTL

Delete
NSCName:
+Add IP:
+

Delete
NSCName:
+Add IP:
+

Delete
MXCName:
+Add IP:
+
tux
Delete
NSCName:
+Add IP:
+
tux
Delete
NSCName:
+Add IP:
+
mayrhofen
Delete
NSCName:
+Add IP:
+
mayrhofen
Delete
NSCName:
+Add IP:
+
www.serviceline
Delete
AModify IP:
+Add IP:
+
www.mountain-wellness
Delete
AModify IP:
+Add IP:
+
fieberbrunn
Delete
MXCName:
+Add IP:
+
tourist-info
Delete
NSCName:
+Add IP:
+
tourist-info
Delete
NSCName:
+Add IP:
+
serfaus
Delete
NSCName:
+Add IP:
+
serfaus
Delete
NSCName:
+Add IP:
+
neustift
Delete
NSCName:
+Add IP:
+
neustift
Delete
NSCName:
+Add IP:
+
achensee
Delete
NSCName:
+Add IP:
+
achensee
Delete
NSCName:
+Add IP:
+
oberndorf
Delete
NSCName:
+Add IP:
+
oberndorf
Delete
NSCName:
+Add IP:
+
zugspitze
Delete
NSCName:
+Add IP:
+
zugspitze
Delete
NSCName:
+Add IP:
+
www.langlauf
Delete
AModify IP:
+Add IP:
+
vomp
Delete
NSCName:
+Add IP:
+
vomp
Delete
NSCName:
+Add IP:
+
kaunertal
Delete
NSCName:
+Add IP:
+
kaunertal
Delete
NSCName:
+Add IP:
+
defereggen
Delete
NSCName:
+Add IP:
+
defereggen
Delete
NSCName:
+Add IP:
+
www.kisa
Delete
AModify IP:
+Add IP:
+
www.imperialmountains
Delete
AModify IP:
+Add IP:
+
edv
Delete
NSCName:
+Add IP:
+
edv
Delete
NSCName:
+Add IP:
+
seefeld
Delete
NSCName:
+Add IP:
+
seefeld
Delete
NSCName:
+Add IP:
+
chat
Delete
AModify IP:
+Add IP:
+
johann
Delete
NSCName:
+Add IP:
+
johann
Delete
NSCName:
+Add IP:
+
telfs-moesern
Delete
NSCName:
+Add IP:
+
telfs-moesern
Delete
NSCName:
+Add IP:
+
zillertal
Delete
NSCName:
+Add IP:
+
zillertal
Delete
NSCName:
+Add IP:
+
hochzeiger
Delete
NSCName:
+Add IP:
+
hochzeiger
Delete
NSCName:
+Add IP:
+
hopfgarten
Delete
NSCName:
+Add IP:
+
hopfgarten
Delete
NSCName:
+Add IP:
+
alpine-wellness
Delete
AModify IP:
+Add IP:
+
www.leefruimte
Delete
AModify IP:
+Add IP:
+
www.abc
Delete
AModify IP:
+Add IP:
+
www.snowboard
Delete
AModify IP:
+Add IP:
+
mountain.wellness
Delete
AModify IP:
+Add IP:
+
alpine.wellness
Delete
AModify IP:
+Add IP:
+
la
Delete
AModify IP:
+Add IP:
+
www
Delete
AModify IP:
+Add IP:
+
kollektion
Delete
MXCName:
+Add IP:
+
kollektion
Delete
AModify IP:
+Add IP:
+
scharnitz
Delete
NSCName:
+Add IP:
+
scharnitz
Delete
NSCName:
+Add IP:
+
brixental
Delete
NSCName:
+Add IP:
+
brixental
Delete
NSCName:
+Add IP:
+
www.mountainwellness
Delete
AModify IP:
+Add IP:
+
scheffau
Delete
NSCName:
+Add IP:
+
scheffau
Delete
NSCName:
+Add IP:
+
www.livingroom
Delete
CNAMECName:
+
www.snowtimes
Delete
CNAMECName:
+
www.hiking
Delete
CNAMECName:
+
winter
Delete
CNAMECName:
+
www.winter
Delete
CNAMECName:
+
www.young
Delete
CNAMECName:
+
www.golf
Delete
CNAMECName:
+
www.sommer
Delete
CNAMECName:
+
www.familieferie
Delete
CNAMECName:
+
www.family
Delete
CNAMECName:
+
www.marketingplan
Delete
CNAMECName:
+
www.wissenspool-tourismus
Delete
CNAMECName:
+
gletscher
Delete
CNAMECName:
+
www.gletscher
Delete
CNAMECName:
+
www.outdoor
Delete
CNAMECName:
+
www.bergerlebnis
Delete
CNAMECName:
+
www.polska
Delete
CNAMECName:
+
www.trekking
Delete
CNAMECName:
+
www.vakantie
Delete
CNAMECName:
+
www.trecking
Delete
CNAMECName:
+
soulcountry
Delete
CNAMECName:
+
www.soulcountry
Delete
CNAMECName:
+
www.alpingolf
Delete
CNAMECName:
+
www.wandern
Delete
CNAMECName:
+
www.familie
Delete
CNAMECName:
+
www.bibliothek
Delete
CNAMECName:
+
www.gastfreundschaft
Delete
CNAMECName:
+
www.cine
Delete
CNAMECName:
+
vital
Delete
CNAMECName:
+
www.vital
Delete
CNAMECName:
+
www.narty.slonce
Delete
CNAMECName:
+
www.bus
Delete
CNAMECName:
+
www.shop
Delete
CNAMECName:
+
www.voyages
Delete
CNAMECName:
+
www.kollektion
Delete
CNAMECName:
+
www.sonnenski
Delete
CNAMECName:
+
www.magazin
Delete
CNAMECName:
+
www.imperialalps
Delete
CNAMECName:
+
www.bezoek
Delete
CNAMECName:
+
www.bike
Delete
CNAMECName:
+
www.presse
Delete
CNAMECName:
+
www.familiennester
Delete
CNAMECName:
+
www.kampagnen
Delete
CNAMECName:
+
www.ohnehandicap
Delete
CNAMECName:
+
tourismus-manager
Delete
CNAMECName:
+
tourismus.manager
Delete
CNAMECName:
+
test-www.livingroom
Delete
CNAMECName:
+
test-www.snowtimes
Delete
CNAMECName:
+
test-www.hiking
Delete
CNAMECName:
+
test-winter
Delete
CNAMECName:
+
test-www.winter
Delete
CNAMECName:
+
test-www.young
Delete
CNAMECName:
+
test-www.golf
Delete
CNAMECName:
+
test-www.sommer
Delete
CNAMECName:
+
test-www.familieferie
Delete
CNAMECName:
+
test-www.family
Delete
CNAMECName:
+
test-www.marketingplan
Delete
CNAMECName:
+
test-www.wissenspool-tourismus
Delete
CNAMECName:
+
test-gletscher
Delete
CNAMECName:
+
test-www.gletscher
Delete
CNAMECName:
+
test-www.outdoor
Delete
CNAMECName:
+
test-www.bergerlebnis
Delete
CNAMECName:
+
test-www.polska
Delete
CNAMECName:
+
test-www.trekking
Delete
CNAMECName:
+
test-www.vakantie
Delete
CNAMECName:
+
test-www.trecking
Delete
CNAMECName:
+
test-soulcountry
Delete
CNAMECName:
+
test-www.soulcountry
Delete
CNAMECName:
+
test-www.alpingolf
Delete
CNAMECName:
+
test-www.wandern
Delete
CNAMECName:
+
test-www.familie
Delete
CNAMECName:
+
test-www.bibliothek
Delete
CNAMECName:
+
test-www.gastfreundschaft
Delete
CNAMECName:
+
test-www.cine
Delete
CNAMECName:
+
test-vital
Delete
CNAMECName:
+
test-www.vital
Delete
CNAMECName:
+
test-www.narty.slonce
Delete
CNAMECName:
+
test-www.bus
Delete
CNAMECName:
+
test-www.shop
Delete
CNAMECName:
+
test-www.voyages
Delete
CNAMECName:
+
test-www.kollektion
Delete
CNAMECName:
+
test-www.sonnenski
Delete
CNAMECName:
+
test-www.magazin
Delete
CNAMECName:
+
test-www.imperialalps
Delete
CNAMECName:
+
test-www.bezoek
Delete
CNAMECName:
+
test-www.bike
Delete
CNAMECName:
+
test-www.presse
Delete
CNAMECName:
+
test-www.familiennester
Delete
CNAMECName:
+
test-www.kampagnen
Delete
CNAMECName:
+
test-www.ohnehandicap
Delete
CNAMECName:
+
test-tourismus-manager
Delete
CNAMECName:
+
test-tourismus.manager
Delete
CNAMECName:
+
wildschoenau
Delete
MXCName:
+Add IP:
+
wildschoenau
Delete
MXCName:
+Add IP:
+
+

+ +
+
diff --git a/example_m.html b/example_m.html new file mode 100644 index 0000000..555d80f --- /dev/null +++ b/example_m.html @@ -0,0 +1,50 @@ + + + Zone-Selector + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Add New Zone
Search for zone:
+
+ 0
+ A
+ B
+ C
+ D
+ E
+ F
+ G
+ H
+ I
+ J
+ K
+ L
+ M
- N
naturarena-kaernten.at
naturarena-kaernten.com
nauders.com
nesselwaengle.at
nesselwaengle.com
netage.at
neustift.com
niederoesterreich.cc
norden.at
notburga-ausstellung.at
notburga-ausstellung.com
notburga.com
+ O
+ P
+ Q
+ R
+ S
+ T
+ U
+ V
+ W
+ X
+ Y
+ Z
Without DNS-lookup
+ \ No newline at end of file diff --git a/index.html b/index.html index f1b05af..3c7d5b3 100644 --- a/index.html +++ b/index.html @@ -34,6 +34,7 @@ 0.1.4ldap2dns2000-Oct-04 0.2.0ldap2dnsldap2dnsldap2dns2000-Dec-14 0.2.2ldap2dnsldap2dnsldap2dns2001-Feb-16 +0.2.3ldap2dnsldap2dnsldap2dns2001-Mar-23 diff --git a/ldap2dns.c b/ldap2dns.c index ffb9a5e..7655a7f 100644 --- a/ldap2dns.c +++ b/ldap2dns.c @@ -1,6 +1,6 @@ /* * Create data from an LDAP directory service to be used for tinydns - * $Id: ldap2dns.c,v 1.26 2001/02/27 10:08:31 jrief Exp $ + * $Id: ldap2dns.c,v 1.27 2001/03/12 12:26:55 jrief Exp $ * Copyright 2000 by Jacob Rief * License: GPL version 2 or later. See http://www.fsf.org for details */ @@ -50,13 +50,13 @@ static struct char zonemaster[64]; char class[16]; char adminmailbox[64]; - unsigned long serial; - unsigned long refresh; - unsigned long retry; - unsigned long expire; - unsigned long minimum; + char serial[12]; + char refresh[12]; + char retry[12]; + char expire[12]; + char minimum[12]; + char ttl[12]; char timestamp[20]; - int ttl; } zone; struct resourcerecord @@ -68,9 +68,9 @@ struct resourcerecord char ipaddr[256][32]; char cipaddr[32]; char cname[64]; + char ttl[12]; char timestamp[20]; - int ttl; - int preference; + char preference[12]; #if defined DRAFT_RFC char rr[1024]; char aliasedobjectname[256]; @@ -298,19 +298,19 @@ static void write_rr(struct resourcerecord* rr, int ipdx, int znix) if (tinyfile) { if (znix==0) { if (ipdx<=0 && rr->cipaddr[0]) { - fprintf(tinyfile, "&%s::%s:%d:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "&%s::%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); if (rr->cname[0]) - fprintf(tinyfile, "=%s:%s:%d:%s\n", rr->cname, rr->cipaddr, rr->ttl, rr->timestamp); + fprintf(tinyfile, "=%s:%s:%s:%s\n", rr->cname, rr->cipaddr, rr->ttl, rr->timestamp); if (ipdx==0) - fprintf(tinyfile, "+%s:%s:%d:%s\n", rr->cname, rr->ipaddr[0], rr->ttl, rr->timestamp); + fprintf(tinyfile, "+%s:%s:%s:%s\n", rr->cname, rr->ipaddr[0], rr->ttl, rr->timestamp); } else if (ipdx<0) - fprintf(tinyfile, "&%s::%s:%d:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "&%s::%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); else if (ipdx==0) - fprintf(tinyfile, "&%s:%s:%s:%d:%s\n", rr->dnsdomainname, rr->ipaddr[0], rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "&%s:%s:%s:%s:%s\n", rr->dnsdomainname, rr->ipaddr[0], rr->cname, rr->ttl, rr->timestamp); else if (ipdx>0 && rr->cname[0]) - fprintf(tinyfile, "+%s:%s:%d:%s\n", rr->cname, rr->ipaddr[ipdx], rr->ttl, rr->timestamp); + fprintf(tinyfile, "+%s:%s:%s:%s\n", rr->cname, rr->ipaddr[ipdx], rr->ttl, rr->timestamp); } else if (ipdx<=0) { - fprintf(tinyfile, "&%s::%s:%d:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "&%s::%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); } } if (namedzone) { @@ -322,32 +322,32 @@ static void write_rr(struct resourcerecord* rr, int ipdx, int znix) if (tinyfile) { if (znix==0) { if (ipdx<=0 && rr->cipaddr[0]) { - fprintf(tinyfile, "@%s::%s:%d:%d:%s\n", rr->dnsdomainname, rr->cname, rr->preference, rr->ttl, rr->timestamp); + fprintf(tinyfile, "@%s::%s:%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->preference, rr->ttl, rr->timestamp); if (rr->cname[0]) - fprintf(tinyfile, "=%s:%s:%d:%s\n", rr->cname, rr->cipaddr, rr->ttl, rr->timestamp); + fprintf(tinyfile, "=%s:%s:%s:%s\n", rr->cname, rr->cipaddr, rr->ttl, rr->timestamp); if (ipdx==0) - fprintf(tinyfile, "+%s:%s:%d:%s\n", rr->cname, rr->ipaddr[0], rr->ttl, rr->timestamp); + fprintf(tinyfile, "+%s:%s:%s:%s\n", rr->cname, rr->ipaddr[0], rr->ttl, rr->timestamp); } else if (ipdx<0) - fprintf(tinyfile, "@%s::%s:%d:%d:%s\n", rr->dnsdomainname, rr->cname, rr->preference, rr->ttl, rr->timestamp); + fprintf(tinyfile, "@%s::%s:%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->preference, rr->ttl, rr->timestamp); else if (ipdx==0) - fprintf(tinyfile, "@%s:%s:%s:%d:%d:%s\n", rr->dnsdomainname, rr->ipaddr[0], rr->cname, rr->preference, rr->ttl, rr->timestamp); + fprintf(tinyfile, "@%s:%s:%s:%s:%s:%s\n", rr->dnsdomainname, rr->ipaddr[0], rr->cname, rr->preference, rr->ttl, rr->timestamp); else if (ipdx>0 && rr->cname[0]) - fprintf(tinyfile, "+%s:%s:%d:%s\n", rr->cname, rr->ipaddr[ipdx], rr->ttl, rr->timestamp); + fprintf(tinyfile, "+%s:%s:%s:%s\n", rr->cname, rr->ipaddr[ipdx], rr->ttl, rr->timestamp); } else if (ipdx<=0) { - fprintf(tinyfile, "@%s::%s:%d:%d:%s\n", rr->dnsdomainname, rr->cname, rr->preference, rr->ttl, rr->timestamp); + fprintf(tinyfile, "@%s::%s:%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->preference, rr->ttl, rr->timestamp); } } if (namedzone) { - fprintf(namedzone, "%s.\tIN MX\t%d %s.\n", rr->dnsdomainname, rr->preference, rr->cname); + fprintf(namedzone, "%s.\tIN MX\t%s %s.\n", rr->dnsdomainname, rr->preference, rr->cname); if (ipdx>=0) fprintf(namedzone, "%s.\tIN A\t%s\n", rr->cname, rr->ipaddr[ipdx]); } } else if ( strcasecmp(rr->type, "A")==0) { if (tinyfile) { if (ipdx<=0 && rr->cipaddr[0]) - fprintf(tinyfile, "%s%s:%s:%d:%s\n", (znix==0 ? "=" : "+"), rr->dnsdomainname, rr->cipaddr, rr->ttl, rr->timestamp); + fprintf(tinyfile, "%s%s:%s:%s:%s\n", (znix==0 ? "=" : "+"), rr->dnsdomainname, rr->cipaddr, rr->ttl, rr->timestamp); if (ipdx>=0) - fprintf(tinyfile, "+%s:%s:%d:%s\n", rr->dnsdomainname, rr->ipaddr[ipdx], rr->ttl, rr->timestamp); + fprintf(tinyfile, "+%s:%s:%s:%s\n", rr->dnsdomainname, rr->ipaddr[ipdx], rr->ttl, rr->timestamp); } if (namedzone) { if (ipdx<=0 && rr->cipaddr[0]) @@ -369,17 +369,17 @@ static void write_rr(struct resourcerecord* rr, int ipdx, int znix) strcpy(buf, rr->dnsdomainname); } if (tinyfile) - fprintf(tinyfile, "^%s:%s:%d:%s\n", buf, rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "^%s:%s:%s:%s\n", buf, rr->cname, rr->ttl, rr->timestamp); if (namedzone) fprintf(namedzone, "%s.\tIN PTR\t%s.\n", buf, rr->cname); } else if (strcasecmp(rr->type, "CNAME")==0) { if (tinyfile) - fprintf(tinyfile, "C%s:%s:%d:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "C%s:%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); if (namedzone) fprintf(namedzone, "%s.\tIN CNAME\t%s.\n", rr->dnsdomainname, rr->cname); } else if (strcasecmp(rr->type, "TXT")==0) { if (tinyfile) - fprintf(tinyfile, "'%s:%s:%d:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); + fprintf(tinyfile, "'%s:%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp); if (namedzone) fprintf(namedzone, "%s.\tIN TXT\t%s.\n", rr->dnsdomainname, rr->cname); } @@ -402,8 +402,8 @@ static void parse_rr(struct resourcerecord* rr) expand_domainname(rr->cname, word1, len); } } else if (strcasecmp(rr->type, "MX")==0) { - if (sscanf(word1, "%d", &rr->preference)!=1) - rr->preference = 0; + if (sscanf(word1, "%s", rr->preference)!=1) + rr->preference[0] = '\0'; if (sscanf(word2, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])==4) { sprintf(rr->ipaddr[0], "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); } else { @@ -450,9 +450,9 @@ static void read_resourcerecords(char* dn, int znix) rr.type[0] = '\0'; rr.cname[0] = '\0'; rr.cipaddr[0] = '\0'; - rr.ttl = time_now; + rr.ttl[0] = '\0'; rr.timestamp[0] = '\0'; - rr.preference = 10; + rr.preference[0] = '\0'; #if defined DRAFT_RFC rr.aliasedobjectname[0] = '\0'; rr.rr[0] = '\0'; @@ -477,49 +477,51 @@ static void read_resourcerecords(char* dn, int znix) if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, bvals[0]->bv_val); } else if (strcasecmp(attr, "DNSclass")==0) { - if (sscanf(bvals[0]->bv_val, "%16s", &rr.class)!=1) + if (sscanf(bvals[0]->bv_val, "%16s", rr.class)!=1) rr.class[0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, rr.class); } else if (strcasecmp(attr, "DNStype")==0) { - if (sscanf(bvals[0]->bv_val, "%16s", &rr.type)!=1) + if (sscanf(bvals[0]->bv_val, "%16s", rr.type)!=1) rr.type[0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, rr.type); } else if (strcasecmp(attr, "DNSipaddr")==0) { int ip[4]; for (ipaddresses = 0; bvals[ipaddresses] && ipaddresses<256; ipaddresses++) { rr.ipaddr[ipaddresses][0] = '\0'; - if (sscanf(bvals[ipaddresses]->bv_val, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])==4) + if (sscanf(bvals[ipaddresses]->bv_val, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])==4) { sprintf(rr.ipaddr[ipaddresses], "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %s\n", attr, rr.ipaddr[ipaddresses]); + if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, rr.ipaddr[ipaddresses]); + } } } else if (strcasecmp(attr, "DNScipaddr")==0) { int ip[4]; - if (sscanf(bvals[0]->bv_val, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])==4) + if (sscanf(bvals[0]->bv_val, "%d.%d.%d.%d", &ip[0], &ip[1], &ip[2], &ip[3])==4) { sprintf(rr.cipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %s\n", attr, rr.cipaddr); + if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, rr.cipaddr); + } } else if (strcasecmp(attr, "DNScname")==0) { if (!expand_domainname(rr.cname, bvals[0]->bv_val, bvals[0]->bv_len)) rr.cname[0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, bvals[0]->bv_val); } else if (strcasecmp(attr, "DNSttl")==0) { - if (sscanf(bvals[0]->bv_val, "%d", &rr.ttl)!=1) - rr.ttl = time_now; - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, rr.ttl); + if (sscanf(bvals[0]->bv_val, "%12s", rr.ttl)!=1) + rr.ttl[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, rr.ttl); } else if (strcasecmp(attr, "DNStimestamp")==0) { if (sscanf(bvals[0]->bv_val, "%16s", &rr.timestamp)!=1) rr.timestamp[0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, rr.timestamp); } else if (strcasecmp(attr, "DNSpreference")==0) { - if (sscanf(bvals[0]->bv_val, "%d", &rr.preference)!=1) - rr.preference = 10; - if (options.ldifname[0]) + if (sscanf(bvals[0]->bv_val, "%s", rr.preference)!=1) + rr.preference[0] = '\0'; + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, bvals[0]->bv_val); } #if defined DRAFT_RFC @@ -530,7 +532,7 @@ static void read_resourcerecords(char* dn, int znix) } else if (strcasecmp(attr, "DNSaliasedobjectname")==0) { if (sscanf(bvals[0]->bv_val, "%256s", rr.aliasedobjectname)!=1) rr.aliasedobjectname[0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, rr.aliasedobjectname); } else if (strcasecmp(attr, "DNSmacaddress")==0) { } @@ -568,9 +570,10 @@ static void write_zone(void) char soa[20]; if (tinyfile) { - fprintf(tinyfile, "Z%s:%s:%s:%d:%d:%d:%d:%d:%d:%s\n", zone.domainname, - zone.zonemaster, zone.adminmailbox, zone.serial, zone.refresh, zone.retry, - zone.expire, zone.minimum, zone.ttl, zone.timestamp); + fprintf(tinyfile, "Z%s:%s:%s:%s:%s:%s:%s:%s:%s:%s\n", + zone.domainname, zone.zonemaster, zone.adminmailbox, + zone.serial, zone.refresh, zone.retry, zone.expire, + zone.minimum, zone.ttl, zone.timestamp); } if (namedmaster) { fprintf(namedmaster, "zone \"%s\" %s {\n\ttype master;\n\tfile \"%s.db\";\n};\n", @@ -578,13 +581,16 @@ static void write_zone(void) } if (namedzone) { fprintf(namedzone, "# Automatically generated by ldap2dns - DO NOT EDIT!\n"); - fprintf(namedzone, "$TTL %d\n", (zone.ttl>0) ? zone.ttl : 3600); + if (zone.ttl[0]) + fprintf(namedzone, "$TTL %s\n", zone.ttl); + else + fprintf(namedzone, "$TTL 3600\n"); fprintf(namedzone, "%s. IN SOA ", zone.domainname); len = strlen(zone.zonemaster); fprintf(namedzone, (zone.zonemaster[len-1]=='.') ? "%s " : "%s. ", zone.zonemaster); len = strlen(zone.adminmailbox); fprintf(namedzone, (zone.adminmailbox[len-1]=='.') ? "%s " : "%s. ", zone.adminmailbox); - fprintf(namedzone, "(\n\t%d\t; Serial\n\t%d\t; Refresh\n\t%d\t; Retry\n\t%d\t; Expire\n\t%d )\t; Minimum\n", zone.serial, zone.refresh, zone.retry, zone.expire, zone.minimum); + fprintf(namedzone, "(\n\t%s\t; Serial\n\t%s\t; Refresh\n\t%s\t; Retry\n\t%s\t; Expire\n\t%s )\t; Minimum\n", zone.serial, zone.refresh, zone.retry, zone.expire, zone.minimum); } if (options.ldifname[0]) fprintf(ldifout, "\n"); @@ -642,12 +648,12 @@ static void read_dnszones(void) char ldif0; strncpy(zone.class, "IN", 3); - zone.serial = time_now; - zone.refresh = 10800; - zone.retry = 3600; - zone.expire = 604800; - zone.minimum = 86400; - zone.ttl = time_now; + zone.serial[0] = '\0'; + zone.refresh[0] = '\0'; + zone.retry[0] = '\0'; + zone.expire[0] = '\0'; + zone.minimum[0] = '\0'; + zone.ttl[0] = '\0'; zone.timestamp[0] = '\0'; dn = ldap_get_dn(ldap_con, m); if (options.ldifname[0]) @@ -666,46 +672,53 @@ static void read_dnszones(void) for (zonenames = 0; bvals[zonenames] && zonenames<256; zonenames++) { if (sscanf(bvals[zonenames]->bv_val, "%64s", &zdn[zonenames])!=1) zdn[zonenames][0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, zdn[zonenames]); } } else if (strcasecmp(attr, "DNSserial")==0) { - sscanf(bvals[0]->bv_val, "%u", &zone.serial); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, zone.serial); + if (sscanf(bvals[0]->bv_val, "%12s", zone.serial)!=1) + zone.serial[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, zone.serial); } else if (strcasecmp(attr, "DNSrefresh")==0) { - sscanf(bvals[0]->bv_val, "%u", &zone.refresh); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, zone.refresh); + if (sscanf(bvals[0]->bv_val, "%12s", zone.refresh)!=1) + zone.refresh[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, zone.refresh); } else if (strcasecmp(attr, "DNSretry")==0) { - sscanf(bvals[0]->bv_val, "%u", &zone.retry); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, zone.retry); + if (sscanf(bvals[0]->bv_val, "%12s", zone.retry)!=1) + zone.retry[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, zone.retry); } else if (strcasecmp(attr, "DNSexpire")==0) { - sscanf(bvals[0]->bv_val, "%u", &zone.expire); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, zone.expire); + if (sscanf(bvals[0]->bv_val, "%12s", zone.expire)!=1) + zone.expire[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, zone.expire); } else if (strcasecmp(attr, "DNSminimum")==0) { - sscanf(bvals[0]->bv_val, "%u", &zone.minimum); - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, zone.minimum); + if (sscanf(bvals[0]->bv_val, "%12s", zone.minimum)!=1) + zone.minimum[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, zone.minimum); } else if (strcasecmp(attr, "DNSadminmailbox")==0) { - sscanf(bvals[0]->bv_val, "%64s", zone.adminmailbox); - if (options.ldifname[0]) + if (sscanf(bvals[0]->bv_val, "%64s", zone.adminmailbox)!=1) + zone.adminmailbox[0] = '\0'; + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, zone.adminmailbox); } else if (strcasecmp(attr, "DNSzonemaster")==0) { - sscanf(bvals[0]->bv_val, "%64s", zone.zonemaster); - if (options.ldifname[0]) + if (sscanf(bvals[0]->bv_val, "%64s", zone.zonemaster)!=1) + zone.zonemaster[0] = '\0'; + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, zone.zonemaster); } else if (strcasecmp(attr, "DNSttl")==0) { - if (sscanf(bvals[0]->bv_val, "%d", &zone.ttl)!=1) - zone.ttl = time_now; - if (options.ldifname[0]) - fprintf(ldifout, "%s: %d\n", attr, zone.ttl); + if (sscanf(bvals[0]->bv_val, "%12s", zone.ttl)!=1) + zone.ttl[0] = '\0'; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %s\n", attr, zone.ttl); } else if (strcasecmp(attr, "DNStimestamp")==0) { - if (sscanf(bvals[0]->bv_val, "%16s", &zone.timestamp)!=1) + if (sscanf(bvals[0]->bv_val, "%16s", zone.timestamp)!=1) zone.timestamp[0] = '\0'; - if (options.ldifname[0]) + else if (options.ldifname[0]) fprintf(ldifout, "%s: %s\n", attr, zone.timestamp); } } diff --git a/ldap2tinydns-conf b/ldap2tinydns-conf index 8c1f042..7dc07bb 100755 --- a/ldap2tinydns-conf +++ b/ldap2tinydns-conf @@ -1,13 +1,32 @@ #!/bin/sh + mkdir ldap2tinydns mkdir ldap2tinydns/env +mkdir ldap2tinydns/log +mkdir ldap2tinydns/log/main +touch ldap2tinydns/log/status + cat << EOF_run > ldap2tinydns/run #!/bin/sh exec 2>&1 exec envdir ./env softlimit -d250000 /usr/bin/ldap2dns -e "cd /var/tinydns/root && /usr/bin/tinydns-data" EOF_run + +chmod +t ldap2tinydns chmod 755 ldap2tinydns/run echo "/var/tinydns/root" > ldap2tinydns/env/TINYDNSDIR -echo "30" > ldap2tinydns/env/LDAP2DNS_UPDATE -echo "DATA" > ldap2tinydns/env/LDAP2DNS_OUTPUT +echo "60" > ldap2tinydns/env/LDAP2DNS_UPDATE +echo "data" > ldap2tinydns/env/LDAP2DNS_OUTPUT + +cat << EOF_logrun > ldap2tinydns/log/run +#!/bin/sh +exec setuidgid nobody multilog t ./main +EOF_logrun + +chown nobody.nobody ldap2tinydns/log/main +chmod g+s ldap2tinydns/log/main +chmod 755 ldap2tinydns/log/run +chown nobody.nobody ldap2tinydns/log/status + +echo "To supervise ldap2dns do a symbolic link from /service onto ldap2dns" diff --git a/zoneedit.pl b/zoneedit.pl deleted file mode 100644 index 88e66e3..0000000 --- a/zoneedit.pl +++ /dev/null @@ -1,509 +0,0 @@ -#!/usr/sbin/perl -use CGI qw(:standard); -use Net::LDAP; -use strict; -use vars qw($LDAPHOST $BASEDN $BINDBASE $BINDUID $ANONBINDDN $ZONEEDIT $DEFAULT_MAIN @our_nameserver @zoneinfo @setinfo); -my $LDAPHOST = "ldap0.server"; -my $BASEDN = "ou=dns,o=tiscover"; -my $BINDBASE = "ou=people,o=tiscover"; -my $BINDUID = "uid"; -my $ANONBINDDN = "ou=dns,o=tiscover"; -my $ZONEEDIT = "zoneedit.pl"; -my $DEFAULT_MAIN = "index.html"; -my $LOGFILE = "/opt/httpd/logs/zoneedit.log"; -my @our_nameserver = ( "ns1.tis.co.at", "ns2.tis.co.at" ); -my @zoneinfo = qw( DNSzonename DNSserial DNSclass DNStype DNSexpire DNSretry DNSminimum DNSzonemaster DNSrefresh DNSadminmailbox DNSttl ); -my @setinfo = qw( DNSdomainname DNStype DNSclass DNScname DNSipaddr DNSttl ); - - -################################################################################ - -eval { - main(); -}; -if ($@) { - errconfirm($@); -} - - -sub main -{ - my $request = Apache->request(); - my $query = new CGI; - my $call = $query->param('call'); - if (defined $call) { - my $ldap = Net::LDAP->new($LDAPHOST) or die "can't make new LDAP object: $@"; - my $user = $request->connection->user(); - my $binddn = $BINDUID."=".$user.",$BINDBASE"; - my ($ret, $password) = $request->get_basic_auth_pw(); - my $mesg = $ldap->bind($binddn, password => $password); - die "Unable to bind to LDAP server.
Reason: ".$mesg->error if ($mesg->code); - my $selet = $query->param('selet') if $query->param('selet'); - if ($call eq "dnslist") { - dns_list($query, $ldap, $selet); - } elsif ($call eq "newzone") { - new_zone($query, $selet); - } elsif ($call eq "addzone") { - my $zonedn = add_zone($query, $ldap); - log_action($user, "add_zone", $zonedn); - $query->delete_all(); - print $query->header, $query->start_html(-title=> 'Edit DNS Zone', - -target=> 'main', - -author=> 'jacob.rief@tiscover.com', - -BGCOLOR=> 'WHITE'), - "


"; - edit_zone($query, $ldap, $zonedn, $selet); - print $query->end_html; - } elsif ($call eq "editzone") { - my $zonedn = $query->param('zonedn'); - if (defined $query->param('modifyzone')) { - modify_zone($query, $ldap, $zonedn); - log_action($user, "modify_zone_soa", $zonedn); - } elsif (defined $query->param('addrrset')) { - add_rrset($query, $ldap, $zonedn); - log_action($user, "add_rrset", $zonedn); - } elsif (defined $query->param('modifyrrset')) { - my $setdn = $query->param('setdn'); - modify_rrset($query, $ldap, $zonedn, $setdn); - log_action($user, "modify_rrset", $setdn); - } elsif (defined $query->param('deleterrset')) { - my $setdn = $query->param('setdn'); - delete_rrset($query, $ldap, $zonedn, $setdn); - log_action($user, "delete_rrset", $setdn); - } - $query->delete_all(); - print $query->header, $query->start_html(-title=> 'Edit DNS Zone', - -target=> 'main', - -author=> 'jacob.rief@tiscover.com', - -BGCOLOR=> 'WHITE'), - "

"; - print_whois($ldap, $zonedn) if ($request->method eq "GET"); - edit_zone($query, $ldap, $zonedn, $selet); - print $query->end_html; - } elsif ($call eq "deletezone") { - my $zonedn = $query->param('zonedn'); - delete_zone($query, $ldap, $zonedn); - log_action($user, "delete_zone", $zonedn); - } - $ldap->unbind(); - } else { - # print frame - print $query->header, - "", - " ", - " ", - ""; - } -} - - -sub errconfirm -{ - my $errmsg = shift; - my $request = Apache->request(); - $request->note_basic_auth_failure(); - my $query = new CGI; - print $query->header, $query->start_html(-title=> 'DNS Zone Admin', - -target=> 'main', - -author=> 'jacob.rief@tiscover.com', - -BGCOLOR=> 'WHITE'), - "

", - $query->h2("An error occured"), - "Message: $errmsg
\n", - $query->end_html; - $request->child_terminate(); -} - - -sub log_action -{ - my ($user, $action, $dn) = @_; - my ($sec,$min,$hour,$mday,$mon,$year) = localtime(); - my @month = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); - my ($m, $y) = ($month[$mon], $year+1900); - open(FILE, ">>$LOGFILE"); - print FILE "[$mday/$m/$y:$hour:$min:$sec] $user $action $dn\n"; - close(FILE); -} - - -sub list_attrs -{ - my $attr = shift; - my (@list, $key, $value); - while (($key, $value) = each %$attr) { - push(@list, $key => $value); - } - return \@list; -} - - -sub dns_list -{ - my ($query, $ldap, $selet) = @_; - my @letters = qw( 0 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ); - print $query->header, $query->start_html(-title=> 'Zone-Selector', - -target=> 'menu', - -author=> 'jacob.rief@tiscover.com', - -BGCOLOR=> 'WHITE'); - my ($dnslookup, $resolver); - if ($selet =~ /\~/) { - $dnslookup = 1; - use Net::DNS; - $resolver = new Net::DNS::Resolver; - } else { - $dnslookup = 0; - } - print "\n", - "\n"; - foreach my $let (@letters) { - if ($selet =~ /$let/) { - my $newselet = $selet; - $newselet =~ s/$let//; - print "\n"; - } else { - my $newselet = $selet.$let; - print "\n"; - next; - } - my $mesg = $ldap->search(base => $BASEDN, filter => "(&(objectclass=DNSzone)(DNSzonename=$let*))"); - my @entries = $mesg->entries; - my ($zonename, %dn_entry, @unsorted); - foreach my $entry (@entries) { - $zonename = $entry->get_value('DNSzonename'); - push @unsorted, $zonename; - $dn_entry{$zonename} = $entry->dn(); - } - @entries = sort @unsorted; - foreach $zonename (@entries) { - my $zonedn = $dn_entry{$zonename}; - if ($dnslookup) { - my $query = $resolver->search($zonename, "NS"); - my @ns; - if ($query) { - foreach my $rr ($query->answer) { - next unless $rr->type eq "NS"; - push @ns, $rr->nsdname; - } - } - if (lc($ns[0]) eq lc($our_nameserver[0]) || lc($ns[1]) eq lc($our_nameserver[1]) - || lc($ns[0]) eq lc($our_nameserver[1]) || lc($ns[1]) eq lc($our_nameserver[0]) ) { - print "\n"; - } - } - print "\n"; - } else { - print "&selet=$selet~\" TARGET=\"menu\">With DNS-lookup\n"; - } - print "
Add New Zone
- $let
+ $let
"; - } elsif (defined $ns[0] || defined $ns[1]) { - print "
"; - } else { - print "
"; - } - } else { - print "
"; - } - print "$zonename
Without DNS-lookup
\n", $query->end_html; -} - - -sub print_zone_soa -{ - my $zonedata = shift; - print "Serial: ", - textfield(-name=>'DNSserial', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSserial'}), - "", "Refresh: ", - textfield(-name=>'DNSrefresh', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSrefresh'}), - "\n", - - "Retry: ", - textfield(-name=>'DNSretry', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSretry'}), - "", "Expire: ", - textfield(-name=>'DNSexpire', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSexpire'}), - "\n", - - "Minimum: ", - textfield(-name=>'DNSminimum', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSminimum'}), - "", "Adminmailbox: ", - textfield(-name=>'DNSadminmailbox', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSadminmailbox'}), - "\n", - - "Zonemaster: ", - textfield(-name=>'DNSzonemaster', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSzonemaster'}), - "", "Time to live: ", - textfield(-name=>'DNSttl', -size=>16, -maxlength=>24, -default=>$$zonedata{'DNSttl'}), - "\n"; -} - - -sub new_zone -{ - my ($query, $selet) = @_; - my %default_zonedata = ( - "DNSzonename" => "", - "DNSserial" => "", - "DNSclass" => "IN", - "DNStype" => "SOA", - "DNSexpire" => "259200", - "DNSretry" => "3600", - "DNSminimum" => "86400", - "DNSzonemaster" => "ns1.tis.co.at.", - "DNSrefresh" => "10800", - "DNSadminmailbox" => "domreg.tis.co.at.", - "DNSttl" => "3600", - ); - my ($sec,$min,$hour,$mday,$mon,$year) = localtime(); - $default_zonedata{"DNSserial"} = sprintf "%04d%02d%02d01", $year+1900, $mon+1, $mday; - my $onsubmit = "{ parent.frames.menu.location='$ZONEEDIT?call=dnslist&selet=$selet'; }"; - $query->param(call=>'addzone'); - print $query->header, $query->start_html(-title=> 'Add DNS Zone', - -target=> 'main', - -author=> 'jacob.rief@tiscover.com', - -BGCOLOR=> 'WHITE'), - "

", - $query->h2('Add DNS zone'), - $query->start_multipart_form(-method=>'POST', -action=>"$ZONEEDIT", -target=>'main', -onSubmit=>$onsubmit), - $query->hidden('call'), $query->hidden('selet'), - "\n", - "\n"; - print_zone_soa(\%default_zonedata); - print "
New Zonename: ", - $query->textfield(-name=>'DNSzonename', -size=>40, -maxlength=>64), - "
", - $query->submit(-name=>" Submit "), - "", - $query->reset(), - "
\n", - $query->end_form(), - $query->end_html; -} - - -sub add_zone -{ - my ($query, $ldap) = @_; - my %zonedata; - foreach my $za (@zoneinfo) { - $zonedata{$za} = $query->param($za) if defined $query->param($za); - } - my ($zonename, $zonedn) = ($zonedata{'DNSzonename'}, "cn=$zonedata{'DNSzonename'},$BASEDN"); - my $attrs = list_attrs(\%zonedata); - push(@$attrs, "objectclass", "DNSzone", "cn", "$zonename"); - my $mesg = $ldap->add(dn=>$zonedn, attr=>$attrs); - die "Failed to add zone: $zonename
Reason: ".$mesg->error if ($mesg->code); - my @attr = ( "cn", "NS1:", "objectclass", "DNSrrset", "dnstype", "NS", "dnsclass", "IN", - "dnsttl", "3600", "dnscname", $our_nameserver[0]."." ); - my $dnch = "cn=NS1:,$zonedn"; - die "Failed to add $dnch " if (($mesg = $ldap->add(dn=>$dnch, attr=>\@attr))->code); - - @attr = ( "cn", "NS2:", "objectclass", "DNSrrset", "dnstype", "NS", "dnsclass", "IN", - "dnsttl", "3600", "dnscname", $our_nameserver[1]."." ); - $dnch = "cn=NS2:,$zonedn"; - die "Failed to add $dnch " if (($mesg = $ldap->add(dn=>$dnch, attr=>\@attr))->code); - - @attr = ( "cn", "A:www", "objectclass", "DNSrrset", "dnstype", "A", "dnsclass", "IN", - "dnsdomainname", "www", "dnsttl", "3600", "dnsipaddr", "195.96.23.204" ); - $dnch = "cn=A:www,$zonedn"; - die "Failed to add $dnch
Reason: ".$mesg->error if (($mesg = $ldap->add(dn=>$dnch, attr=>\@attr))->code); - return $zonedn; -} - - -sub modify_zone -{ - my ($query, $ldap, $zonedn) = @_; - my %zonedata; - foreach my $za (@zoneinfo) { - $zonedata{$za} = $query->param($za) if defined $query->param($za); - } - my @zonename; - my $zn = ($ldap->search(base=>$zonedn, scope=>'base', filter=>"(objectclass=DNSzone)")->entry(0))->get_value('DNSzonename'); - push @zonename, $zn; - for (my $zc = 0; defined $query->param("DNSzonename$zc"); $zc++) { - $zn = $query->param("DNSzonename$zc"); - push @zonename, $zn if (length($zn)>3); - } - my $mesg = $ldap->modify($zonedn, delete => [ 'DNSzonename' ]); - $mesg = $ldap->modify($zonedn, replace => \%zonedata) unless ($mesg->code); - $mesg = $ldap->modify($zonedn, add => [ 'DNSzonename' => \@zonename ] ) unless ($mesg->code); - die "Unable to modify zone: $zonedn
Reason: ".$mesg->error if ($mesg->code); -} - - -sub delete_zone -{ - my ($query, $ldap, $zonedn) = @_; - my $zonedn = $query->param('zonedn'); - my $mesg = $ldap->search(base=>$zonedn, filter => "(objectclass=DNSrrset)"); - my @entries = $mesg->entries; - foreach my $entry (@entries) { - $mesg = $ldap->delete($entry->dn()); - last if ($mesg->code); - } - $mesg = $ldap->delete($zonedn) unless ($mesg->code); - die "Unable to delete zone $zonedn.
Reason: ".$mesg->error if ($mesg->code); - dnslist($query, $ldap); -} - - -sub edit_zone -{ - my ($query, $ldap, $zonedn, $selet) = @_; - my @zonename = ($ldap->search(base=>$zonedn, scope=>'base', filter=>"(objectclass=DNSzone)")->entry(0))->get_value('DNSzonename'); - my $zonemaster = shift @zonename; - $query->param(call=>'editzone'); - $query->param(zonedn=>$zonedn); - $query->param(selet=>$selet); - - # Table for SOA - print $query->h2("Edit DNS zone $zonemaster"); - print $query->start_multipart_form(-method=>'POST', -action=>"$ZONEEDIT", -target=>'main'), - $query->hidden('call'), $query->hidden('zonedn'), $query->hidden('selet'), - "\n"; - my $zc = 0; - my $entry = $ldap->search(base=>$zonedn, scope=>'base', filter=>"(objectclass=DNSzone)")->entry(0); - my %zonedata; - foreach my $za (@zoneinfo) { - $zonedata{$za} = $entry->get_value($za); - } - print_zone_soa(\%zonedata); - print "\n"; - foreach my $zn (@zonename) { - print "\n"; - $zc++; - } - print "
Additional Zonename: ", - $query->textfield(-name=>"DNSzonename$zc", -default=>$zn, -size=>40, -maxlength=>64), - "
Add additional Zonename: ", - $query->textfield(-name=>"DNSzonename$zc", -size=>40, -maxlength=>64), - "
\n"; - print "\n", $query->end_form(), - "
", - $query->submit(-name=>"modifyzone", -value=>" Modify Zone "), - ""; - my $onclick = "if(confirm('Do you really want to remove zone \"$zonemaster\" and all its resource records?'))" - ."{ parent.frames.menu.location='$ZONEEDIT?call=deletezone&zonedn=$zonedn&selet=$selet'; parent.frames.main.location='$DEFAULT_MAIN'; }"; - print $query->submit(-name=>"deletezone", -value=>" Delete Zone ", -onClick=>$onclick), - "", $query->start_multipart_form(-method=>'POST', -action=>"$ZONEEDIT", -target=>'main'), - $query->hidden('call'), $query->hidden('zonedn'), $query->hidden('selet'), - $query->submit(-name=>"resetform", -value=>" Reset Form "), - $query->end_form(), "
\n"; - - # Tables for RRsets - my $mesg = $ldap->search(base=>$zonedn, filter => "(objectclass=DNSrrset)"); - my @entries = $mesg->entries; - print "\n\n", - "\n"; - foreach $entry (@entries) { - my $setdn = $entry->dn(); - my $domainname = $entry->get_value('DNSdomainname'); - $domainname = "." if (!defined $domainname || length($domainname)<1); - my $ipaddr = $entry->get_value('DNSipaddr'); - my $cname = $entry->get_value('DNScname'); - my $type = $entry->get_value('DNStype'); - my $ttl = $entry->get_value('DNSttl'); - $query->param(setdn => $setdn); - print "", $query->start_multipart_form(-method=>'POST', -action=>"$ZONEEDIT", -target=>'main'), $query->hidden('call'), - $query->hidden('selet'), $query->hidden('zonedn'), $query->hidden('setdn'), - "", - "", - "", - "", - "", - "", - $query->end_form(), "\n"; - } - print "\n", $query->start_multipart_form(-method=>'POST', -action=>"$ZONEEDIT", -target=>'main'), $query->hidden('call'), - $query->hidden('selet'), $query->hidden('zonedn'), - "", - "", - "", - "", - "", - "", - $query->end_form(); - print "
Name $#entriesTypeIPaddrCNAMETTL
$domainname$type", $query->textfield(-name=>'DNSipaddr', -default=>$ipaddr, -size=>16, -maxlength=>16), "", $query->textfield(-name=>'DNScname', -default=>$cname, -size=>16, -maxlength=>64), "", $query->textfield(-name=>'DNSttl', -default=>$ttl, -size=>6, -maxlength=>6), "", $query->submit(-name=>"modifyrrset", -value=>" Modify "), - $query->submit(-name=>"deleterrset", -value=>" Delete "), "
", textfield(-name=>'DNSdomainname', -size=>8, -maxlength=>32), "", $query->popup_menu(-name=>'DNStype', -values=>['CNAME','A','MX','NS','PTR','TXT'], -default=>"A"), "", textfield(-name=>'DNSipaddr', -size=>16, -maxlength=>16), "", textfield(-name=>'DNScname', -size=>16, -maxlength=>64), "", textfield(-name=>'DNSttl', -default=>"3600", -size=>6, -maxlength=>6), "", $query->submit(-name=>"addrrset", -value=>" Add "), "
\n"; -} - - -sub add_rrset -{ - my ($query, $ldap, $zonedn) = @_; - my ($domainname, $type, @setattrs) = ($query->param('DNSdomainname'), $query->param('DNStype')); - foreach my $za (@setinfo) { - next unless (defined $query->param($za)); - push (@setattrs, $za, $query->param($za)); - } - my $chdn = "$type:$domainname"; - push (@setattrs, "objectclass", "DNSrrset", "cn", "$chdn"); - $chdn = "cn=$chdn,$zonedn"; - my $mesg = $ldap->add($chdn, attr => \@setattrs); - die "Unable to add rrset: $chdn ".$mesg->error if ($mesg->code); - my $newserial = $ldap->search(base=>$zonedn, scope=>'base', filter => "(objectclass=DNSzone)")->entry(0)->get_value('DNSserial')+1; - $mesg = $ldap->modify($zonedn, replace => { 'DNSserial', $newserial }); - die "Unable to modify serial number for: $zonedn ".$mesg->error if ($mesg->code); -} - - -sub modify_rrset -{ - my ($query, $ldap, $zonedn, $setdn) = @_; - my %setattrs; - foreach my $za (@setinfo) { - next unless (defined $query->param($za)); - $setattrs{$za} = $query->param($za); - } - my $mesg = $ldap->modify($setdn, replace => \%setattrs); - die "Unable to modify rrset: $setdn".$mesg->error if ($mesg->code); - my $newserial = $ldap->search(base=>$zonedn, scope=>'base', filter => "(objectclass=DNSzone)")->entry(0)->get_value('DNSserial')+1; - $mesg = $ldap->modify($zonedn, replace => { 'DNSserial', $newserial }); - die "Unable to modify serial number for: $zonedn ".$mesg->error if ($mesg->code); -} - - -sub delete_rrset -{ - my ($query, $ldap, $zonedn, $setdn) = @_; - my $mesg = $ldap->delete($setdn); - die "Unable to modify rrset: $setdn".$mesg->error if ($mesg->code); - my $newserial = $ldap->search(base=>$zonedn, scope=>'base', filter => "(objectclass=DNSzone)")->entry(0)->get_value('DNSserial')+1; - $mesg = $ldap->modify($zonedn, replace => { 'DNSserial', $newserial }); - die "Unable to modify serial number for: $zonedn ".$mesg->error if ($mesg->code); -} - - -sub print_whois -{ - my ($ldap, $zonedn) = @_; - my ($zonename, $whois) = ($ldap->search(base=>$zonedn, scope=>'base', filter=>"(objectclass=DNSzone)")->entry(0))->get_value('DNSzonename'); - use Net::Whois; - unless ($whois = new Net::Whois::Domain $zonename) { - print "

Unable to contact Whois-server

"; - return; - }; - unless ($whois->ok) { - print "

No Whois-record found for zone $zonename trying with "; - # try with parent zone - if ($zonename =~ /[^.]+\.(.*)/) { - $zonename = $1; - } - print "$zonename

\n"; - $whois = new Net::Whois::Domain($zonename); - return unless ($whois->ok); - } - print "

Whois record for zone $zonename

\n"; - print "Domain: ", $whois->domain, "
\n"; - print "Name: ", $whois->name, "
\n"; - print "Tag: ", $whois->tag, "
\n"; - print "Address:\n", map { " $_
\n" } $whois->address; - print "Country: ", $whois->country, "
\n"; - print "Name Servers:
\n", map { " $$_[0] ($$_[1])
\n" } @{$whois->servers}; - print "Record created:", $whois->record_created, "
\n"; - print "Record updated:", $whois->record_updated, "
\n" ; -} -