Changeset 224 for trunk/DNSDB.pm
- Timestamp:
- 01/24/12 17:59:24 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/DNSDB.pm
r223 r224 129 129 perpage => 15, 130 130 ); 131 132 133 ## 134 ## utilty functions 135 # _rectable() 136 # Takes default+rdns flags, returns appropriate table name 137 sub _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 148 sub _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() 131 156 132 157 … … 703 728 704 729 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 734 sub 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 705 744 ## DNSDB::domainID() 706 745 # Takes a database handle and domain name … … 1212 1251 ## DNSDB::getSOA() 1213 1252 # 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)ID1253 # Takes a database handle, default/live flag, domain/reverse flag, and parent ID 1215 1254 sub getSOA { 1216 1255 $errstr = ''; 1217 1256 my $dbh = shift; 1218 1257 my $def = shift; 1258 my $rev = shift; 1219 1259 my $id = shift; 1220 1260 my %ret; 1221 1261 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 1231 1268 my $sth = $dbh->prepare($sql); 1232 1269 $sth->execute($id); 1233 1270 1234 my ($recid,$host,$val,$ttl ,$serial) = $sth->fetchrow_array() or return;1271 my ($recid,$host,$val,$ttl) = $sth->fetchrow_array() or return; 1235 1272 my ($contact,$prins) = split /:/, $host; 1236 1273 my ($refresh,$retry,$expire,$minttl) = split /:/, $val; … … 1238 1275 $ret{recid} = $recid; 1239 1276 $ret{ttl} = $ttl; 1240 $ret{serial} = $serial; 1277 # $ret{serial} = $serial; # ca't use distance for serial with default_rev_records 1241 1278 $ret{prins} = $prins; 1242 1279 $ret{contact} = $contact; … … 1289 1326 $errstr = ''; 1290 1327 my $dbh = shift; 1291 my $type = shift; 1328 my $def = shift; 1329 my $rev = shift; 1292 1330 my $id = shift; 1293 1331 my $nrecs = shift || 'all'; … … 1300 1338 my $filter = shift || ''; 1301 1339 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 "; 1307 1343 $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)." = ?"; 1313 1345 $sql .= " AND NOT r.type=$reverse_typemap{SOA}"; 1314 1346 $sql .= " AND host ~* ?" if $filter; 1315 1347 # use alphaorder column for "correct" ordering of sort-by-type instead of DNS RR type number 1316 1348 $sql .= " ORDER BY ".($order eq 'type' ? 't.alphaorder' : "r.$order")." $direction"; 1317 $sql .= " LIMIT $nrecs OFFSET ".($nstart*$nrecs) if $nstart ne 'all';1318 1349 1319 1350 my @bindvars = ($id); 1320 1351 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 } 1321 1359 my $sth = $dbh->prepare($sql) or warn $dbh->errstr; 1322 1360 $sth->execute(@bindvars) or warn "$sql: ".$sth->errstr; … … 1333 1371 1334 1372 ## 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 1337 1376 # Returns the count 1338 1377 sub getRecCount { 1339 1378 my $dbh = shift; 1340 1379 my $defrec = shift; 1380 my $revrec = shift; 1341 1381 my $id = shift; 1342 1382 my $filter = shift || ''; … … 1348 1388 my @bindvars = ($id); 1349 1389 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 1354 ($filter ? " AND host ~* ?" : '') ,1355 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) ); 1356 1396 1357 1397 return $count;
Note:
See TracChangeset
for help on using the changeset viewer.