Changeset 224 for trunk/DNSDB.pm


Ignore:
Timestamp:
01/24/12 17:59:24 (12 years ago)
Author:
Kris Deugau
Message:

/trunk

Start adding rDNS (See #26)

  • Initial SQL tabledef, default records, and record types (we'll abuse the reserved range of DNS record types from 65280 to 65534 for some extra custom types)
  • Start passing $webvar{revrec} around similar to $webvar{defrec}
  • Adjust record list page to handle reverse records. Tested on group-default reverse records but should work fine for live zones
  • Add "Reverse Zones" and "Default Reverse Records" to menu
  • While we're rearranging it, add a little more paranoia on some of the SQL
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/DNSDB.pm

    r223 r224  
    129129                perpage         => 15,
    130130        );
     131
     132
     133##
     134## utilty functions
     135# _rectable()
     136# Takes default+rdns flags, returns appropriate table name
     137sub _rectable {
     138  my $def = shift;
     139  my $rev = shift;
     140
     141  return 'records' if $def ne 'y';
     142  return 'default_records' if $rev ne 'y';
     143  return 'default_rev_records';
     144} # end _rectable()
     145
     146# _recparent()
     147# Takes default+rdns flags, returns appropriate parent-id column name
     148sub _recparent {
     149  my $def = shift;
     150  my $rev = shift;
     151
     152  return 'group_id' if $def eq 'y';
     153  return 'rdns_id' if $rev eq 'y';
     154  return 'domain_id';
     155} # end _recparent()
    131156
    132157
     
    703728
    704729
     730## DNSDB::revName()
     731# Return the reverse zone name based on an rDNS ID
     732# Takes a database handle and the rDNS ID
     733# Returns the reverse zone name or undef on failure
     734sub revName {
     735  $errstr = '';
     736  my $dbh = shift;
     737  my $revid = shift;
     738  my ($revname) = $dbh->selectrow_array("SELECT revnet FROM revzones WHERE rdns_id=?", undef, ($revid) );
     739  $errstr = $DBI::errstr if !$revname;
     740  return $revname if $revname;
     741} # end revName()
     742
     743
    705744## DNSDB::domainID()
    706745# Takes a database handle and domain name
     
    12121251## DNSDB::getSOA()
    12131252# Return all suitable fields from an SOA record in separate elements of a hash
    1214 # Takes a database handle, default/live flag, and group (default) or domain (live) ID
     1253# Takes a database handle, default/live flag, domain/reverse flag, and parent ID
    12151254sub getSOA {
    12161255  $errstr = '';
    12171256  my $dbh = shift;
    12181257  my $def = shift;
     1258  my $rev = shift;
    12191259  my $id = shift;
    12201260  my %ret;
    12211261
    1222   # (ab)use distance and weight columns to store SOA data
    1223 
    1224   my $sql = "SELECT record_id,host,val,ttl,distance from";
    1225   if ($def eq 'def' or $def eq 'y') {
    1226     $sql .= " default_records WHERE group_id=? AND type=$reverse_typemap{SOA}";
    1227   } else {
    1228     # we're editing a live SOA record;  find based on domain
    1229     $sql .= " records WHERE domain_id=? AND type=$reverse_typemap{SOA}";
    1230   }
     1262  # (ab)use distance and weight columns to store SOA data?  can't for default_rev_records...
     1263  # - should really attach serial to the zone parent somewhere
     1264
     1265  my $sql = "SELECT record_id,host,val,ttl from "._rectable($def,$rev).
     1266        " WHERE "._recparent($def,$rev)." = ? AND type=$reverse_typemap{SOA}";
     1267
    12311268  my $sth = $dbh->prepare($sql);
    12321269  $sth->execute($id);
    12331270
    1234   my ($recid,$host,$val,$ttl,$serial) = $sth->fetchrow_array() or return;
     1271  my ($recid,$host,$val,$ttl) = $sth->fetchrow_array() or return;
    12351272  my ($contact,$prins) = split /:/, $host;
    12361273  my ($refresh,$retry,$expire,$minttl) = split /:/, $val;
     
    12381275  $ret{recid}   = $recid;
    12391276  $ret{ttl}     = $ttl;
    1240   $ret{serial}  = $serial;
     1277#  $ret{serial} = $serial;      # ca't use distance for serial with default_rev_records
    12411278  $ret{prins}   = $prins;
    12421279  $ret{contact} = $contact;
     
    12891326  $errstr = '';
    12901327  my $dbh = shift;
    1291   my $type = shift;
     1328  my $def = shift;
     1329  my $rev = shift;
    12921330  my $id = shift;
    12931331  my $nrecs = shift || 'all';
     
    13001338  my $filter = shift || '';
    13011339
    1302   $type = 'y' if $type eq 'def';
    1303 
    1304   my $sql = "SELECT r.record_id,r.host,r.type,r.val,r.distance,r.weight,r.port,r.ttl FROM ";
    1305   $sql .= "default_" if $type eq 'y';
    1306   $sql .= "records r ";
     1340  my $sql = "SELECT r.record_id,r.host,r.type,r.val,r.ttl";
     1341  $sql .= ",r.distance,r.weight,r.port" if $rev eq 'n';
     1342  $sql .= " FROM "._rectable($def,$rev)." r ";
    13071343  $sql .= "INNER JOIN rectypes t ON r.type=t.val ";     # for sorting by type alphabetically
    1308   if ($type eq 'y') {
    1309     $sql .= "WHERE r.group_id=?";
    1310   } else {
    1311     $sql .= "WHERE r.domain_id=?";
    1312   }
     1344  $sql .= "WHERE "._recparent($def,$rev)." = ?";
    13131345  $sql .= " AND NOT r.type=$reverse_typemap{SOA}";
    13141346  $sql .= " AND host ~* ?" if $filter;
    13151347  # use alphaorder column for "correct" ordering of sort-by-type instead of DNS RR type number
    13161348  $sql .= " ORDER BY ".($order eq 'type' ? 't.alphaorder' : "r.$order")." $direction";
    1317   $sql .= " LIMIT $nrecs OFFSET ".($nstart*$nrecs) if $nstart ne 'all';
    13181349
    13191350  my @bindvars = ($id);
    13201351  push @bindvars, $filter if $filter;
     1352
     1353  # just to be ultraparanoid about SQL injection vectors
     1354  if ($nstart ne 'all') {
     1355    $sql .= " LIMIT ? OFFSET ?";
     1356    push @bindvars, $nrecs;
     1357    push @bindvars, ($nstart*$nrecs);
     1358  }
    13211359  my $sth = $dbh->prepare($sql) or warn $dbh->errstr;
    13221360  $sth->execute(@bindvars) or warn "$sql: ".$sth->errstr;
     
    13331371
    13341372## DNSDB::getRecCount()
    1335 # Return count of non-SOA records in domain (or default records in a group)
    1336 # Takes a database handle, default/live flag, group/domain ID, and optional filtering modifier
     1373# Return count of non-SOA records in zone (or default records in a group)
     1374# Takes a database handle, default/live flag, reverse/forward flag, group/domain ID,
     1375# and optional filtering modifier
    13371376# Returns the count
    13381377sub getRecCount {
    13391378  my $dbh = shift;
    13401379  my $defrec = shift;
     1380  my $revrec = shift;
    13411381  my $id = shift;
    13421382  my $filter = shift || '';
     
    13481388  my @bindvars = ($id);
    13491389  push @bindvars, $filter if $filter;
    1350   my ($count) = $dbh->selectrow_array("SELECT count(*) FROM ".
    1351         ($defrec eq 'y' ? 'default_' : '')."records ".
    1352         "WHERE ".($defrec eq 'y' ? 'group' : 'domain')."_id=? ".
    1353         "AND NOT type=$reverse_typemap{SOA}".
    1354         ($filter ? " AND host ~* ?" : ''),
    1355         undef, (@bindvars) );
     1390  my $sql = "SELECT count(*) FROM ".
     1391        _rectable($defrec,$revrec).
     1392        " WHERE "._recparent($defrec,$revrec)."=? ".
     1393        "AND NOT type=$reverse_typemap{SOA}".
     1394        ($filter ? " AND host ~* ?" : '');
     1395  my ($count) = $dbh->selectrow_array($sql, undef, (@bindvars) );
    13561396
    13571397  return $count;
Note: See TracChangeset for help on using the changeset viewer.