Added secDNS in zone generator. more fixes needed.

This commit is contained in:
Pinga 2023-08-27 22:01:58 +03:00
parent 6181ece4de
commit 55b7f3260a

View file

@ -32,9 +32,9 @@ while (list($id, $tld) = $sth->fetch(PDO::FETCH_NUM)) {
$cleanedTld = ltrim(strtolower($tld), '.'); $cleanedTld = ltrim(strtolower($tld), '.');
$zone = new Zone($cleanedTld . '.'); $zone = new Zone($cleanedTld . '.');
$zone->setDefaultTtl(3600); $zone->setDefaultTtl(3600);
$soa = new ResourceRecord; $soa = new ResourceRecord;
$soa->setName('@'); $soa->setName($cleanedTld . '.');
$soa->setClass(Classes::INTERNET); $soa->setClass(Classes::INTERNET);
$soa->setRdata(Factory::Soa( $soa->setRdata(Factory::Soa(
$ns1 . '.', $ns1 . '.',
@ -48,13 +48,13 @@ while (list($id, $tld) = $sth->fetch(PDO::FETCH_NUM)) {
$zone->addResourceRecord($soa); $zone->addResourceRecord($soa);
$nsRecord1 = new ResourceRecord; $nsRecord1 = new ResourceRecord;
$nsRecord1->setName('@'); $nsRecord1->setName($cleanedTld . '.');
$nsRecord1->setClass(Classes::INTERNET); $nsRecord1->setClass(Classes::INTERNET);
$nsRecord1->setRdata(Factory::Ns($ns1 . '.')); $nsRecord1->setRdata(Factory::Ns($ns1 . '.'));
$zone->addResourceRecord($nsRecord1); $zone->addResourceRecord($nsRecord1);
$nsRecord2 = new ResourceRecord; $nsRecord2 = new ResourceRecord;
$nsRecord2->setName('@'); $nsRecord2->setName($cleanedTld . '.');
$nsRecord2->setClass(Classes::INTERNET); $nsRecord2->setClass(Classes::INTERNET);
$nsRecord2->setRdata(Factory::Ns($ns2 . '.')); $nsRecord2->setRdata(Factory::Ns($ns2 . '.'));
$zone->addResourceRecord($nsRecord2); $zone->addResourceRecord($nsRecord2);
@ -103,45 +103,80 @@ while (list($id, $tld) = $sth->fetch(PDO::FETCH_NUM)) {
ORDER BY host.name"); ORDER BY host.name");
$sth2->execute([':id' => $id]); $sth2->execute([':id' => $id]);
while (list($hname, $did, $type, $addr) = $sth2->fetch(PDO::FETCH_NUM)) { while (list($hname, $did, $type, $addr) = $sth2->fetch(PDO::FETCH_NUM)) {
$sthStatus = $dbh->prepare("SELECT id FROM domain_status WHERE domain_id = :did AND status LIKE '%Hold' LIMIT 1"); $sthStatus = $dbh->prepare("SELECT id FROM domain_status WHERE domain_id = :did AND status LIKE '%Hold' LIMIT 1");
$sthStatus->bindParam(':did', $did, PDO::PARAM_INT); $sthStatus->bindParam(':did', $did, PDO::PARAM_INT);
$sthStatus->execute(); $sthStatus->execute();
$status_id = $sthStatus->fetchColumn(); $status_id = $sthStatus->fetchColumn();
if ($status_id) continue; if ($status_id) continue;
$hname = trim($hname, "$tldRE."); $hname = trim($hname, "$tldRE.");
$hname = ($hname == "$tld.") ? '@' : $hname; $hname = ($hname == "$tld.") ? '@' : $hname;
$record = new ResourceRecord; $record = new ResourceRecord;
$record->setName($hname); $record->setName($hname);
$record->setClass(Classes::INTERNET); $record->setClass(Classes::INTERNET);
if ($type == 'v4') { if ($type == 'v4') {
$record->setRdata(Factory::A($addr)); $record->setRdata(Factory::A($addr));
} else { } else {
$record->setRdata(Factory::AAAA($addr)); $record->setRdata(Factory::AAAA($addr));
} }
$zone->addResourceRecord($record); $zone->addResourceRecord($record);
} }
$builder = new AlignedBuilder(); // Fetch DS records for domains from the secdns table
$completed_zone = $builder->build($zone); $sthDS = $dbh->prepare("SELECT domain_id, keytag, alg, digesttype, digest
FROM secdns
WHERE domain_id IN (
SELECT id FROM domain
WHERE tldid = :id
AND (exdate > CURRENT_TIMESTAMP OR rgpstatus = 'pendingRestore')
)");
$sthDS->execute([':id' => $id]);
if ($c['dns_server'] == 'bind') { while (list($did, $keytag, $alg, $digesttype, $digest) = $sthDS->fetch(PDO::FETCH_NUM)) {
$basePath = '/etc/bind/zones'; $sthStatus = $dbh->prepare("SELECT id FROM domain_status WHERE domain_id = :did AND status LIKE '%Hold' LIMIT 1");
} elseif ($c['dns_server'] == 'nsd') { $sthStatus->bindParam(':did', $did, PDO::PARAM_INT);
$basePath = '/etc/nsd'; $sthStatus->execute();
} elseif ($c['dns_server'] == 'knot') { $status_id = $sthStatus->fetchColumn();
$basePath = '/etc/knot';
} else {
// Default path
$basePath = '/etc/bind/zones';
}
file_put_contents("{$basePath}/{$cleanedTld}.zone", $completed_zone); if ($status_id) continue;
// Fetch domain name based on domain_id for the DS record
$sthDomainName = $dbh->prepare("SELECT name FROM domain WHERE id = :did LIMIT 1");
$sthDomainName->bindParam(':did', $did, PDO::PARAM_INT);
$sthDomainName->execute();
$dname = $sthDomainName->fetchColumn();
$dname = trim($dname, "$tldRE.");
$dname = ($dname == "$tld.") ? '@' : $dname;
$dsRecord = new ResourceRecord;
$dsRecord->setName($dname);
$dsRecord->setClass(Classes::INTERNET);
$dsRecord->setRdata(Factory::Ds($keytag, $alg, $digest, $digesttype));
$zone->addResourceRecord($dsRecord);
}
$builder = new AlignedBuilder();
$completed_zone = $builder->build($zone);
if ($c['dns_server'] == 'bind') {
$basePath = '/etc/bind/zones';
} elseif ($c['dns_server'] == 'nsd') {
$basePath = '/etc/nsd';
} elseif ($c['dns_server'] == 'knot') {
$basePath = '/etc/knot';
} else {
// Default path
$basePath = '/etc/bind/zones';
}
file_put_contents("{$basePath}/{$cleanedTld}.zone", $completed_zone);
} }
if ($c['dns_server'] == 'bind') { if ($c['dns_server'] == 'bind') {