Index: /trunk/DNSDB.pm
===================================================================
--- /trunk/DNSDB.pm	(revision 282)
+++ /trunk/DNSDB.pm	(revision 283)
@@ -80,4 +80,5 @@
 our $group = 1;
 our $errstr = '';
+our $resultstr = '';
 
 # Halfway sane defaults for SOA, TTL, etc.
@@ -2847,10 +2848,38 @@
   return undef if $id !~ /^\d+$/;
 
-# ooo, fun!  let's see what we were passed for status
+  # Allow transactions, and raise an exception on errors so we can catch it later.
+  # Use local to make sure these get "reset" properly on exiting this block
+  local $dbh->{AutoCommit} = 0;
+  local $dbh->{RaiseError} = 1;
+
   if ($newstatus ne 'mu') {
-    $newstatus = 0 if $newstatus eq 'domoff';
-    $newstatus = 1 if $newstatus eq 'domon';
-    $dbh->do("UPDATE ".($revrec eq 'n' ? 'domains' : 'revzones')." SET status=? WHERE ".
+    # ooo, fun!  let's see what we were passed for status
+    eval {
+      $newstatus = 0 if $newstatus eq 'domoff';
+      $newstatus = 1 if $newstatus eq 'domon';
+      $dbh->do("UPDATE ".($revrec eq 'n' ? 'domains' : 'revzones')." SET status=? WHERE ".
 	($revrec eq 'n' ? 'domain_id' : 'rdns_id')."=?", undef, ($newstatus,$id) );
+
+##fixme  switch to more consise "Enabled <domain"/"Disabled <domain>" as with users?
+      $resultstr = "Changed ".($revrec eq 'n' ? domainName($dbh, $id) : revName($dbh, $id)).
+	" state to ".($newstatus ? 'active' : 'inactive');
+
+      my %loghash;
+      $loghash{domain_id} = $id if $revrec eq 'n';
+      $loghash{rdns_id} = $id if $revrec eq 'y';
+      $loghash{group_id} = parentID($dbh,
+	(id => $id, type => ($revrec eq 'n' ? 'domain' : 'revzone'), revrec => $revrec) );
+      $loghash{entry} = $resultstr;
+      _log($dbh, %loghash);
+
+      $dbh->commit;
+    };
+    if ($@) {
+      my $msg = $@;
+      eval { $dbh->rollback; };
+      $resultstr = '';
+      $errstr = $msg;
+      return;
+    }
   }
 
@@ -3262,5 +3291,5 @@
 
 ## DNSDB::mailNotify()
-# Sends notification mail to recipients regarding an IPDB operation
+# Sends notification mail to recipients regarding a DNSDB operation
 sub mailNotify {
   my $dbh = shift;
Index: /trunk/dns.cgi
===================================================================
--- /trunk/dns.cgi	(revision 282)
+++ /trunk/dns.cgi	(revision 283)
@@ -330,10 +330,5 @@
     if ($flag && ($permissions{admin} || $permissions{domain_edit})) {
       my $stat = zoneStatus($dbh,$webvar{id},'n',$webvar{zonestatus});
-##fixme  switch to more consise "Enabled <domain"/"Disabled <domain>" as with users?
-      logaction($webvar{id}, $session->param("username"),
-	parentID($dbh, (id => $webvar{id}, type => 'domain', revrec => $webvar{revrec})),
-	"Changed ".domainName($dbh, $webvar{id})." state to ".($stat ? 'active' : 'inactive'));
-      $page->param(resultmsg => "Changed ".domainName($dbh, $webvar{id})." state to ".
-	($stat ? 'active' : 'inactive'));
+      $page->param(resultmsg => $DNSDB::resultstr);
     } else {
       $page->param(errmsg => "You are not permitted to view or change the requested domain");
@@ -450,10 +445,5 @@
     if ($flag && ($permissions{admin} || $permissions{domain_edit})) {
       my $stat = zoneStatus($dbh,$webvar{id},'y',$webvar{zonestatus});
-##fixme  switch to more consise "Enabled <domain"/"Disabled <domain>" as with users?
-      logaction($webvar{id}, $session->param("username"),
-	parentID($dbh, (id => $webvar{id}, type => 'revzone', revrec => $webvar{revrec})),
-	"Changed ".revName($dbh, $webvar{id})." state to ".($stat ? 'active' : 'inactive'));
-      $page->param(resultmsg => "Changed ".revName($dbh, $webvar{id})." state to ".
-	($stat ? 'active' : 'inactive'));
+      $page->param(resultmsg => $DNSDB::resultstr);
     } else {
       $page->param(errmsg => "You are not permitted to view or change the requested reverse zone");
