From 14e06302a8cd689b18032e577afa2cbf4ab5925d Mon Sep 17 00:00:00 2001 From: Ben Klang Date: Fri, 2 Dec 2005 04:28:28 +0000 Subject: [PATCH] Added DNS SRV record support in TinyDNS "unknown record" format git-svn-id: https://svn.alkaloid.net/gpl/ldap2dns/trunk@8 06cd67b6-e706-0410-b29e-9de616bca6e9 --- dns.schema-2.0 | 21 ++++++++++++++++++++- dns.schema-2.2 | 21 ++++++++++++++++++++- ldap2dns.c | 38 +++++++++++++++++++++++++++++++++++++- 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/dns.schema-2.0 b/dns.schema-2.0 index 6bcabbb..b8b06b7 100644 --- a/dns.schema-2.0 +++ b/dns.schema-2.0 @@ -105,6 +105,24 @@ attributetype ( 1.3.6.1.4.1.7222.1.4.23 SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{2} SINGLE-VALUE ) +attributetype ( 1.3.6.1.4.1.7222.1.4.23 + NAME 'dnssrvpriority' + 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.24 + NAME 'dnssrvweight' + 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.25 + NAME 'dnssrvport' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 + SINGLE-VALUE ) + objectclass ( 1.3.6.1.4.1.7222.1.4.19 NAME 'dnszone' MUST ( objectclass $ cn ) @@ -117,7 +135,8 @@ objectclass ( 1.3.6.1.4.1.7222.1.4.20 SUP dnszone MUST ( objectclass $ cn ) MAY ( dnsdomainname $ dnsrr $ dnsclass $ dnstype $ dnsipaddr $ dnscipaddr - $ dnscname $ dnspreference $ dnsttl $ dnstimestamp $ owner ) ) + $ dnscname $ dnspreference $ dnsttl $ dnstimestamp $ owner + $ dnssrvpriority $ dnssrvweight $ dnssrvport ) ) objectclass ( 1.3.6.1.4.1.7222.1.4.24 NAME 'dnsloccodes' diff --git a/dns.schema-2.2 b/dns.schema-2.2 index 1be6a2e..cb72b44 100644 --- a/dns.schema-2.2 +++ b/dns.schema-2.2 @@ -108,6 +108,24 @@ attributetype ( 1.3.6.1.4.1.7222.1.4.22 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 'dnssrvpriority' + 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.24 + NAME 'dnssrvweight' + 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.25 + NAME 'dnssrvport' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 + SINGLE-VALUE ) + objectclass ( 1.3.6.1.4.1.7222.1.4.19 NAME 'dnszone' MUST ( objectclass $ cn ) @@ -120,7 +138,8 @@ objectclass ( 1.3.6.1.4.1.7222.1.4.20 SUP dnszone MUST ( objectclass $ cn ) MAY ( dnsdomainname $ dnsrr $ dnsclass $ dnstype $ dnsipaddr $ dnscipaddr - $ dnscname $ dnspreference $ dnsttl $ dnstimestamp $ owner ) ) + $ dnscname $ dnspreference $ dnsttl $ dnstimestamp $ owner + $ dnssrvpriority $ dnssrvweight $ dnssrvport ) ) diff --git a/ldap2dns.c b/ldap2dns.c index d70d8bd..1634195 100644 --- a/ldap2dns.c +++ b/ldap2dns.c @@ -85,6 +85,9 @@ struct resourcerecord char aliasedobjectname[256]; char macaddress[32]; #endif + int dnssrvpriority; + int dnssrvweight; + int dnssrvport; }; @@ -361,6 +364,9 @@ static void write_rr(struct resourcerecord* rr, int ipdx, int znix) { char ip[4]; char buf[4]; + char *tmp; + char *p; + int i; if (strcasecmp(rr->class, "IN")) return; @@ -452,10 +458,21 @@ static void write_rr(struct resourcerecord* rr, int ipdx, int znix) fprintf(tinyfile, "'%s:%s:%s:%s:%s\n", rr->dnsdomainname, rr->cname, rr->ttl, rr->timestamp, rr->location); if (namedzone) fprintf(namedzone, "%s.\tIN TXT\t%s.\n", rr->dnsdomainname, rr->cname); + } else if (strcasecmp(rr->type, "SRV")==0) { + if (tinyfile) + fprintf(tinyfile, ":%s:33:\\%03o\\%03o\\%03o\\%03o\\%03o\\%03o", rr->dnsdomainname, rr->dnssrvpriority >> 8, rr->dnssrvpriority & 0xff, rr->dnssrvweight >> 8, rr->dnssrvweight & 0xff, rr->dnssrvport >> 8, rr->dnssrvport & 0xff); + tmp = strdup(rr->cname); + while (p = strchr(tmp, '.')) { + *p = '\0'; + p++; + fprintf(tinyfile, "\\%03o%s", strlen(tmp), tmp); + tmp = p; + } + fprintf(tinyfile, "\\%03o%s", strlen(tmp), tmp); + fprintf(tinyfile, "\\000:%s:%s:%s\n", rr->ttl, rr->timestamp, rr->location); } } - #if defined DRAFT_RFC static void parse_rr(struct resourcerecord* rr) { @@ -528,6 +545,9 @@ static void read_resourcerecords(char* dn, int znix) rr.aliasedobjectname[0] = '\0'; rr.rr[0] = '\0'; #endif + rr.dnssrvpriority = 0; + rr.dnssrvweight = 0; + rr.dnssrvport = 0; for (attr = ldap_first_attribute(ldap_con, m, &ber); attr; attr = ldap_next_attribute(ldap_con, m, ber)) { int len = strlen(attr); struct berval** bvals; @@ -613,6 +633,22 @@ static void read_resourcerecords(char* dn, int znix) } else if (strcasecmp(attr, "DNSmacaddress")==0) { } #endif + else if (strcasecmp(attr, "DNSsrvpriority")==0) { + if (!(rr.dnssrvpriority = atoi(bvals[0]->bv_val))) + rr.dnssrvpriority = 0; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %d\n", attr, rr.dnssrvpriority); + } else if (strcasecmp(attr, "DNSsrvweight")==0) { + if (!(rr.dnssrvweight = atoi(bvals[0]->bv_val))) + rr.dnssrvweight = 0; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %d\n", attr, rr.dnssrvweight); + } else if (strcasecmp(attr, "DNSsrvport")==0) { + if (!(rr.dnssrvport = atoi(bvals[0]->bv_val))) + rr.dnssrvport = 0; + else if (options.ldifname[0]) + fprintf(ldifout, "%s: %d\n", attr, rr.dnssrvport); + } } ldap_value_free_len(bvals); }