Changeset 295 for trunk/DNSDB.pm


Ignore:
Timestamp:
03/29/12 17:06:10 (12 years ago)
Author:
Kris Deugau
Message:

/trunk

Move entity-relationship reference hashes up into the same area
as other (semi)globals in DNSDB.pm since I was starting to add
an accidental duplicate of %par_tbl.
Move action logging for bulk domain change to DNSDB.pm: (See #35)

  • Clean up dns.cgi to match previous changes to zoneStatus() and delZone()
  • Less not-quite-identical code in dns.cgi can now be factored down
  • Updated changeGroup() with action logging and more error handling
  • Tweak logging and messages in delZone()
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/DNSDB.pm

    r294 r295  
    154154my %userdata;
    155155
     156# Entity-relationship reference hashes.
     157my %par_tbl = (
     158                group   => 'groups',
     159                user    => 'users',
     160                defrec  => 'default_records',
     161                defrevrec       => 'default_rev_records',
     162                domain  => 'domains',
     163                revzone => 'revzones',
     164                record  => 'records'
     165        );
     166my %id_col = (
     167                group   => 'group_id',
     168                user    => 'user_id',
     169                defrec  => 'record_id',
     170                defrevrec       => 'record_id',
     171                domain  => 'domain_id',
     172                revzone => 'rdns_id',
     173                record  => 'record_id'
     174        );
     175my %par_col = (
     176                group   => 'parent_group_id',
     177                user    => 'group_id',
     178                defrec  => 'group_id',
     179                defrevrec       => 'group_id',
     180                domain  => 'group_id',
     181                revzone => 'group_id',
     182                record  => 'domain_id'
     183        );
     184my %par_type = (
     185                group   => 'group',
     186                user    => 'group',
     187                defrec  => 'group',
     188                defrevrec       => 'group',
     189                domain  => 'group',
     190                revzone => 'group',
     191                record  => 'domain'
     192        );
    156193
    157194##
     
    12311268  #return ('FAIL', "Missing
    12321269
     1270  return ('FAIL', "Can't change the group of a $type")
     1271        unless grep /^$type$/, ('domain','revzone','user','group');     # could be extended for defrecs?
     1272
     1273  # Collect some names for logging and messages
     1274  my $entname;
    12331275  if ($type eq 'domain') {
    1234     $dbh->do("UPDATE domains SET group_id=? WHERE domain_id=?", undef, ($newgrp, $id))
    1235         or return ('FAIL','Group change failed: '.$dbh->errstr);
     1276    $entname = domainName($dbh, $id);
     1277  } elsif ($type eq 'revzone') {
     1278    $entname = revName($dbh, $id);
    12361279  } elsif ($type eq 'user') {
    1237     $dbh->do("UPDATE users SET group_id=? WHERE user_id=?", undef, ($newgrp, $id))
    1238         or return ('FAIL','Group change failed: '.$dbh->errstr);
     1280    $entname = userFullName($dbh, $id, '%u');
    12391281  } elsif ($type eq 'group') {
    1240     $dbh->do("UPDATE groups SET parent_group_id=? WHERE group_id=?", undef, ($newgrp, $id))
    1241         or return ('FAIL','Group change failed: '.$dbh->errstr);
    1242   }
    1243   return ('OK','OK');
     1282    $entname = groupName($dbh, $id);
     1283  }
     1284
     1285  my ($oldgid) = $dbh->selectrow_array("SELECT group_id FROM $par_tbl{$type} WHERE $id_col{$type}=?",
     1286        undef, ($id));
     1287  my $oldgname = groupName($dbh, $oldgid);
     1288  my $newgname = groupName($dbh, $newgrp);
     1289
     1290  return ('FAIL', "Can't move things into a group that doesn't exist") if !$newgname;
     1291
     1292  return ('WARN', "Nothing to do, new group is the same as the old group") if $oldgid == $newgrp;
     1293
     1294  # Allow transactions, and raise an exception on errors so we can catch it later.
     1295  # Use local to make sure these get "reset" properly on exiting this block
     1296  local $dbh->{AutoCommit} = 0;
     1297  local $dbh->{RaiseError} = 1;
     1298
     1299  eval {
     1300    $dbh->do("UPDATE $par_tbl{$type} SET group_id=? WHERE $id_col{$type}=?", undef, ($newgrp, $id));
     1301    # Log the change in both the old and new groups
     1302    _log($dbh, (group_id => $oldgid, entry => "Moved $type $entname from $oldgname to $newgname"));
     1303    _log($dbh, (group_id => $newgrp, entry => "Moved $type $entname from $oldgname to $newgname"));
     1304    $dbh->commit;
     1305  };
     1306  if ($@) {
     1307    my $msg = $@;
     1308    eval { $dbh->rollback; };
     1309    if ($config{log_failures}) {
     1310      _log($dbh, (group_id => $oldgid, entry => "Error moving $type $entname to $newgname: $msg"));
     1311      $dbh->commit;     # since we enabled transactions earlier
     1312    }
     1313    return ('FAIL',"Error moving $type $entname to $newgname: $msg");
     1314  }
     1315
     1316  return ('OK',"Moved $type $entname from $oldgname to $newgname");
    12441317} # end changeGroup()
    12451318
     
    14091482    $msg = $@;
    14101483    eval { $dbh->rollback; };
    1411     $loghash{entry} = "Delete $zone: $failmsg: $msg";
    1412     _log($dbh, %loghash) if $config{log_failures};
    1413     $dbh->commit;       # since we enabled transactions earlier
    1414     return ('FAIL',"Delete $zone: $failmsg: $msg");
     1484    $loghash{entry} = "Error deleting $zone: $msg ($failmsg)";
     1485    if ($config{log_failures}) {
     1486      _log($dbh, %loghash);
     1487      $dbh->commit;     # since we enabled transactions earlier
     1488    }
     1489    return ('FAIL', $loghash{entry});
    14151490  } else {
    1416     return ('OK',$msg);
     1491    return ('OK', $msg);
    14171492  }
    14181493
     
    27512826  return ('OK',$logdata{entry});
    27522827} # end delRec()
    2753 
    2754 
    2755   # Reference hashes.
    2756 my %par_tbl = (
    2757                 group   => 'groups',
    2758                 user    => 'users',
    2759                 defrec  => 'default_records',
    2760                 defrevrec       => 'default_rev_records',
    2761                 domain  => 'domains',
    2762                 revzone => 'revzones',
    2763                 record  => 'records'
    2764         );
    2765 my %id_col = (
    2766                 group   => 'group_id',
    2767                 user    => 'user_id',
    2768                 defrec  => 'record_id',
    2769                 defrevrec       => 'record_id',
    2770                 domain  => 'domain_id',
    2771                 revzone => 'rdns_id',
    2772                 record  => 'record_id'
    2773         );
    2774 my %par_col = (
    2775                 group   => 'parent_group_id',
    2776                 user    => 'group_id',
    2777                 defrec  => 'group_id',
    2778                 defrevrec       => 'group_id',
    2779                 domain  => 'group_id',
    2780                 revzone => 'group_id',
    2781                 record  => 'domain_id'
    2782         );
    2783 my %par_type = (
    2784                 group   => 'group',
    2785                 user    => 'group',
    2786                 defrec  => 'group',
    2787                 defrevrec       => 'group',
    2788                 domain  => 'group',
    2789                 revzone => 'group',
    2790                 record  => 'domain'
    2791         );
    27922828
    27932829
Note: See TracChangeset for help on using the changeset viewer.