WARNING - EXTREMELY RAW PATCH AHEAD
Hi,
I'm in the process of migrating a whole load of domains from bind to
tinydns and also tidying up and standardising the domain records.
I've set up the default records as follows:
DOMAIN NS ns2.example.com
DOMAIN NS ns1.example.com
ftp.DOMAIN CNAME DOMAIN
www.DOMAIN CNAME DOMAIN
webmail.DOMAIN CNAME webmail.example.com
pop3.DOMAIN CNAME pop3.example.com
smtp.DOMAIN CNAME smtp.example.com
mail.DOMAIN CNAME mail.example.com
DOMAIN MX smtp.example.com
imap.DOMAIN CNAME imap.example.com
(example.com is the domain of the ISP)
The vast majority of the domains will have identical records except for
the A record which points to the host on which the website is hosted,
i.e. they will have the above records plus an A record, e.g.
DOMAIN A 1.2.3.4
(1.2.3.4 is the IP address of the server hosting the main website for
DOMAIN)
I've successfully transferred all the domains from bind to vegadns using
axfr.
Now what I want to do is to tidy up the domain records without having to
manually edit every one.
So, I've written some code that does the following:
1. move the code that adds the default records into a function so it can
be called when adding a domain and also independently.
2. Add a new action to the default_domains code:
"apply_default_records_to_all". This shows up as a link at the bottom of
the Default Records page. THERE IS NO CONFIRMATION OR WARNING OF WHAT
THIS DOES - CLICK THE LINK AND IT HAPPENS.
3. When the new link is clicked, FOR ALL DOMAINS: all records are
deleted except the main A record (the one with the host the same as the
domain), and the default records are added.
It works for me, but it's rough, ugly, etc. etc. but I thought I'd throw
the idea out there before integrating this in a better way.
R.
diff -ur --exclude=config.php vegadns-0.9.9.1/axfr_get.php
vegadns-0.9.9.1-working/axfr_get.php
--- vegadns-0.9.9.1/axfr_get.php 2005-02-04 00:07:16.000000000 +0000
+++ vegadns-0.9.9.1-working/axfr_get.php 2006-04-25 01:23:48.000000000
+0100
@@ -45,7 +45,7 @@
$rand = rand();
$file = "/tmp/$domain.$rand";
-$command = "/usr/local/bin/tcpclient '".escapeshellcmd($hostname)."' 53
/usr/local/bin/axfr-get '".escapeshellcmd($domain)."' $file $file.tmp 2>&1";
+$command = "/usr/local/bin/tcpclient -R '".escapeshellcmd($hostname)."' 53
/usr/local/bin/axfr-get '".escapeshellcmd($domain)."' $file $file.tmp 2>&1";
exec($command, $out);
// Print any errors first
diff -ur --exclude=config.php vegadns-0.9.9.1/index.php
vegadns-0.9.9.1-working/index.php
--- vegadns-0.9.9.1/index.php 2005-09-10 17:49:22.000000000 +0100
+++ vegadns-0.9.9.1-working/index.php 2006-03-29 20:26:44.000000000 +0100
@@ -23,6 +23,7 @@
ini_set('log_errors', 1);
ini_set('allow_url_fopen', 0);
ini_set('session.use_cookies',0);
+ini_set('error_reporting', E_ALL);
// Check that register_globals is off
if(ini_get('register_globals')) {
diff -ur --exclude=config.php vegadns-0.9.9.1/src/create_tables.php
vegadns-0.9.9.1-working/src/create_tables.php
--- vegadns-0.9.9.1/src/create_tables.php 2005-02-04 00:05:34.000000000
+0000
+++ vegadns-0.9.9.1-working/src/create_tables.php 2006-03-29
20:28:51.000000000 +0100
@@ -40,7 +40,7 @@
) TYPE=MyISAM";
mysql_query($q) or die(mysql_error());
-$q = "INSERT INTO accounts VALUES
(0,0,'[email protected]','".md5(test)."','Test','User','','senior_admin','active')";
+$q = "INSERT INTO accounts VALUES
(0,0,'[email protected]','".md5('test')."','Test','User','','senior_admin','active')";
mysql_query($q) or die(mysql_error()."<br>".$q);
$q = "CREATE TABLE active_sessions (
diff -ur --exclude=config.php vegadns-0.9.9.1/src/default_records.php
vegadns-0.9.9.1-working/src/default_records.php
--- vegadns-0.9.9.1/src/default_records.php 2005-09-10 17:27:50.000000000
+0100
+++ vegadns-0.9.9.1-working/src/default_records.php 2006-04-30
21:04:43.000000000 +0100
@@ -102,7 +102,7 @@
$counter++;
}
}
-
+ $smarty->assign('apply_default_records_to_all_url',
"$base_url&mode=default_records&record_mode=apply_default_records_to_all");
$smarty->assign('edit_soa_url',
"$base_url&mode=default_records&record_mode=edit_soa");
$smarty->assign('add_record_url',
"$base_url&mode=default_records&record_mode=add_record");
$smarty->assign('soa_array', $soa_array);
@@ -211,6 +211,21 @@
exit;
}
+} else if($_REQUEST['record_mode'] == 'apply_default_records_to_all') {
+ // Apply default records too all domains
+ echo "<h1>Apply Default Records to All domains</h1>";
+ $q = 'select * from domains';
+ $result = mysql_query($q) or die(mysql_error());
+ $totaldomains = mysql_num_rows($result);
+ while ($row = mysql_fetch_array($result)) {
+ $domain = $row['domain'];
+ $id = get_dom_id($domain);
+ $dq = "delete from records where domain_id = '" . $id . "' and not
(host = '" . $domain . "' and type = 'A')";
+ mysql_query($dq) or die(mysql_error());
+ add_default_records($row['domain'], $user_info);
+ }
+ exit;
+
} else if($_REQUEST['record_mode'] == 'delete') {
// Get record info
diff -ur --exclude=config.php vegadns-0.9.9.1/src/domains.php
vegadns-0.9.9.1-working/src/domains.php
--- vegadns-0.9.9.1/src/domains.php 2005-09-10 12:35:33.000000000 +0100
+++ vegadns-0.9.9.1-working/src/domains.php 2006-04-30 20:04:03.000000000
+0100
@@ -220,7 +220,7 @@
exit;
}
// make sure it's at least a correct domain name
- if (!eregi("^[\.a-z0-9-]+$",$domain)) {
+ if (!eregi("^[\.a-z0-9-]+$",$domain)) {
set_msg_err("Error: domain $domain does not appear to be a valid
domain name");
$smarty->display('header.tpl');
require('src/new_domain_form.php');
@@ -267,76 +267,7 @@
if($id == -1) die("Error getting domain id");
dns_log($id,"added domain $domain with status $domain_status");
- // Get default records
- if($user_info['Account_Type'] == 'user') {
- $q = "select * from default_records where default_type='group' and
group_owner_id='".$user_info['gid']."'";
- $result = mysql_query($q) or die(mysql_error());
- if(mysql_num_rows($result) == 0) {
- // Get system default records
- $q = "select * from default_records where default_type='system'";
- $result = mysql_query($q) or die(mysql_error());
- }
- } else if($user_info['Account_Type'] == 'group_admin') {
- $q = "select * from default_records where default_type='group' and
group_owner_id='".$user_info['cid']."'";
- $result = mysql_query($q) or die(mysql_error());
- if(mysql_num_rows($result) == 0) {
- // Get system default records
- $q = "select * from default_records where default_type='system'";
- $result = mysql_query($q) or die(mysql_error());
- }
- } else if($user_info['Account_Type'] == 'senior_admin') {
- // Get system default records
- $q = "select * from default_records where default_type='system'";
- $result = mysql_query($q) or die(mysql_error());
- }
-
- if(mysql_num_rows($result) == 0) {
- set_msg_err("Error: you have not yet setup default records");
- header("Location: $base_url");
- exit;
- }
-
- // Build arrays
- $counter = 0;
- while($row = mysql_fetch_array($result)) {
- if($row['type'] == 'S' && !isset($soa_array)) {
- $soa_array = $row;
- } else {
- $records_array[$counter] = $row;
- $counter++;
- }
- }
-
-
- // Add SOA record
- $host = ereg_replace("DOMAIN", $domain, $soa_array['host']);
- $val = ereg_replace("DOMAIN", $domain, $soa_array['val']);
- $q = "insert into records (domain_id,host,type,val,ttl)
- values('$id',
- '".mysql_escape_string($host)."',
- 'S',
- '$val',
- '".$soa_array['ttl']."')";
- mysql_query($q) or die(mysql_error());
- dns_log($id, "added soa");
-
- // Add default records
-
- if(is_array($records_array)) {
- while(list($key,$row) = each($records_array)) {
- $host = ereg_replace("DOMAIN", $domain, $row['host']);
- $val = ereg_replace("DOMAIN", $domain, $row['val']);
- $q = "insert into records (domain_id,host,type,val,distance,ttl)
- values('$id',
- '".mysql_escape_string($host)."',
- '".$row['type']."',
- '$val',
- '".$row['distance']."',
- '".$row['ttl']."')";
- mysql_query($q) or die(mysql_error());
- dns_log($id, "added ".$row['type']." $host with value $val");
- }
- }
+ add_default_records($domain, $user_info);
// Email the support address if an inactive domain is added
$body = "inactive domain \"$domain\" added by ".$user_info['Email']."\n\n";
@@ -531,10 +462,10 @@
$counter = 0;
// default SOA and NS
- if ($_REQUEST['default_soa']=="on")
+ if (isset($_REQUEST['default_soa']) && $_REQUEST['default_soa']=="on")
$def_soa=mysql_fetch_array(
mysql_query("SELECT host,val FROM default_records WHERE type='S'"));
- if ($_REQUEST['default_ns']=="on") {
+ if (isset($_REQUEST['default_ns']) && $_REQUEST['default_ns']=="on") {
$q=mysql_query("SELECT host,val,distance,ttl FROM default_records WHERE
type='N'");
while ($l = mysql_fetch_array($q))
$def_ns[]=$l;
@@ -582,11 +513,11 @@
if($line_key != 'domain' && !ereg("^#", $value)) {
$result = parse_dataline($value);
if(is_array($result)) {
- if (($_REQUEST['default_soa']=="on") &&
($result['type']=='S')) {
+ if ((isset($_REQUEST['default_soa']) &&
$_REQUEST['default_soa']=="on") && ($result['type']=='S')) {
$result['val']=$def_soa['val'];
$result['host']=$def_soa['host'];
}
- if (($_REQUEST['default_ns']!="on") ||
($result['type']!='N')) {
+ if ((isset($_REQUEST['default_ns']) &&
$_REQUEST['default_ns']!="on") || ($result['type']!='N')) {
$q = "insert into records
(domain_id,host,type,val,distance,ttl)
values(
@@ -601,22 +532,23 @@
}
}
}
- if ($_REQUEST['default_ns']=="on") {
- $counter=0;
- while ($ns = $def_ns[$counter]) {
- $host = ereg_replace("DOMAIN", $domain, $ns['host']);
- $q = "insert into records
- (domain_id,host,type,val,distance,ttl)
- values(
- $domain_id,
- '".mysql_escape_string($host)."',
- 'N',
- '".mysql_escape_string($ns['val'])."',
- '".$ns['distance']."',
- '".$ns['ttl']."')";
- mysql_query($q) or die(mysql_error().$q);
- $counter++;
- }
+ if (isset($_REQUEST['default_ns']) && $_REQUEST['default_ns']=="on") {
+ $counter=0;
+ while (isset($def_ns[$counter])) {
+ $ns = $def_ns[$counter];
+ $host = ereg_replace("DOMAIN", $domain, $ns['host']);
+ $q = "insert into records
+ (domain_id,host,type,val,distance,ttl)
+ values(
+ $domain_id,
+ '".mysql_escape_string($host)."',
+ 'N',
+ '".mysql_escape_string($ns['val'])."',
+ '".$ns['distance']."',
+ '".$ns['ttl']."')";
+ mysql_query($q) or die(mysql_error().$q);
+ $counter++;
+ }
}
$log_entry = "imported via axfr from ".$_REQUEST['hostname'];
dns_log($domain_id,$log_entry);
diff -ur --exclude=config.php vegadns-0.9.9.1/src/functions.php
vegadns-0.9.9.1-working/src/functions.php
--- vegadns-0.9.9.1/src/functions.php 2005-09-10 17:48:07.000000000 +0100
+++ vegadns-0.9.9.1-working/src/functions.php 2006-04-30 20:04:05.000000000
+0100
@@ -35,7 +35,7 @@
mysql_query("delete from active_sessions where time < $oldsessions");
$result = mysql_query("select Email from accounts where
Email='".mysql_real_escape_string(strtolower($email))."' and
- Password='".md5($password)."' and
+ Password='".$password."' and
Status='active' LIMIT 1") or die(mysql_error());
$resultarray = mysql_fetch_array($result);
if($resultarray['Email'] != "") {
@@ -294,36 +294,39 @@
function parse_soa($soa) {
$email_soa = explode(":", $soa['host']);
- $array['tldemail'] = $email_soa[0];
- $array['tldhost'] = $email_soa[1];
-
+ if (isset($email_soa[0])) {
+ $array['tldemail'] = $email_soa[0];
+ }
+ if (isset($email_soa[1])) {
+ $array['tldhost'] = $email_soa[1];
+ }
$ttls_soa = explode(":", $soa['val']);
// ttl
- if($soa['ttl'] == "") {
+ if(!isset($soa['ttl']) || $soa['ttl'] == "") {
$array['ttl'] = 86400;
} else {
$array['ttl'] = $soa['ttl'];
}
// refresh
- if($ttls_soa[0] == "") {
+ if(!isset($ttls_soa[0]) || $ttls_soa[0] == "") {
$array['refresh'] = 16384;
} else {
$array['refresh'] = $ttls_soa[0];
}
// retry
- if($ttls_soa[1] == "") {
+ if (!isset($ttls_soa[1]) || $ttls_soa[1] == "") {
$array['retry'] = 2048;
} else {
$array['retry'] = $ttls_soa[1];
}
// expiration
- if($ttls_soa[2] == "") {
+ if (!isset($ttls_soa[2]) || $ttls_soa[2] == "") {
$array['expire'] = 1048576;
} else {
$array['expire'] = $ttls_soa[2];
}
// min
- if($ttls_soa[3] == "") {
+ if(!isset($ttls_soa[3]) || $ttls_soa[3] == "") {
$array['minimum'] = 2560;
} else {
$array['minimum'] = $ttls_soa[3];
@@ -381,6 +384,7 @@
// Strip first char
$stripped = ereg_replace("^.", "", $line);
$array = explode(":", $stripped);
+ $out_array = '';
// Format the array according to the type
if(strncmp('+', $line, 1) == 0) {
@@ -462,6 +466,83 @@
}
}
+// Add the default records to an existing domain
+function add_default_records($domain, $user_info) {
+ // Get domain ID
+ $id = get_dom_id($domain);
+ if($id == -1) die("Error getting domain id");
+
+ // Get default records
+ if($user_info['Account_Type'] == 'user') {
+ $q = "select * from default_records where default_type='group' and
group_owner_id='".$user_info['gid']."'";
+ $result = mysql_query($q) or die(mysql_error());
+ if(mysql_num_rows($result) == 0) {
+ // Get system default records
+ $q = "select * from default_records where default_type='system'";
+ $result = mysql_query($q) or die(mysql_error());
+ }
+ } else if($user_info['Account_Type'] == 'group_admin') {
+ $q = "select * from default_records where default_type='group' and
group_owner_id='".$user_info['cid']."'";
+ $result = mysql_query($q) or die(mysql_error());
+ if(mysql_num_rows($result) == 0) {
+ // Get system default records
+ $q = "select * from default_records where default_type='system'";
+ $result = mysql_query($q) or die(mysql_error());
+ }
+ } else if($user_info['Account_Type'] == 'senior_admin') {
+ // Get system default records
+ $q = "select * from default_records where default_type='system'";
+ $result = mysql_query($q) or die(mysql_error());
+ }
+
+ if(mysql_num_rows($result) == 0) {
+ set_msg_err("Error: you have not yet setup default records");
+ header("Location: $base_url");
+ exit;
+ }
+ // Build arrays
+ $counter = 0;
+ while($row = mysql_fetch_array($result)) {
+ if($row['type'] == 'S' && !isset($soa_array)) {
+ $soa_array = $row;
+ } else {
+ $records_array[$counter] = $row;
+ $counter++;
+ }
+ }
+
+
+ // Add SOA record
+ $host = ereg_replace("DOMAIN", $domain, $soa_array['host']);
+ $val = ereg_replace("DOMAIN", $domain, $soa_array['val']);
+ $q = "insert into records (domain_id,host,type,val,ttl)
+ values('$id',
+ '".mysql_escape_string($host)."',
+ 'S',
+ '$val',
+ '".$soa_array['ttl']."')";
+ mysql_query($q) or die(mysql_error());
+ dns_log($id, "added soa");
+
+ // Add default records
+
+ if(is_array($records_array)) {
+ while(list($key,$row) = each($records_array)) {
+ $host = ereg_replace("DOMAIN", $domain, $row['host']);
+ $val = ereg_replace("DOMAIN", $domain, $row['val']);
+ $q = "insert into records (domain_id,host,type,val,distance,ttl)
+ values('$id',
+ '".mysql_escape_string($host)."',
+ '".$row['type']."',
+ '$val',
+ '".$row['distance']."',
+ '".$row['ttl']."')";
+ mysql_query($q) or die(mysql_error());
+ dns_log($id, "added ".$row['type']." $host with value $val");
+ }
+ }
+}
+
// END FUNCTIONS
?>
diff -ur --exclude=config.php
vegadns-0.9.9.1/templates/list_default_records.tpl
vegadns-0.9.9.1-working/templates/list_default_records.tpl
--- vegadns-0.9.9.1/templates/list_default_records.tpl 2004-04-25
16:33:40.000000000 +0100
+++ vegadns-0.9.9.1-working/templates/list_default_records.tpl 2006-04-30
20:41:26.000000000 +0100
@@ -70,4 +70,8 @@
</table>
</td></tr>
+<tr>
+<td width="100%">
+<a href="{$apply_default_records_to_all_url}">Add default records to all
domains</a>
+</td></tr>
</table>