Compare commits

...

2 Commits

Author SHA1 Message Date
tracer 94334694d4 added systemd service & timer 2024-04-21 13:49:02 +02:00
tracer 6fc85b8692 added semaphore fo zone creation 2024-04-21 13:04:38 +02:00
6 changed files with 85 additions and 7 deletions

View File

@ -2,7 +2,7 @@
"name": "24unix/bindapi", "name": "24unix/bindapi",
"description": "manage Bind9 DNS server via REST API", "description": "manage Bind9 DNS server via REST API",
"version": "1.0.7", "version": "1.0.7",
"build_number": "349", "build_number": "351",
"authors": [ "authors": [
{ {
"name": "Micha Espey", "name": "Micha Espey",

6
dist/systemd/README.md vendored Normal file
View File

@ -0,0 +1,6 @@
Copy this files to /etc/systems/system, adapt the path in the service unit and enable the timer by issuing:
systemctl daemon-reload
systemctl enable bindAPI.timer
systemctl start bindAPI.timer
systemctl list-timers

5
dist/systemd/bindAPI.service vendored Normal file
View File

@ -0,0 +1,5 @@
[Unit]
Description=BindAPI Service to check zone file and reload configuration
[Service]
ExecStart=/home/users/<user>/<bindApi>/bin/console cron:run -q

10
dist/systemd/bindAPI.timer vendored Normal file
View File

@ -0,0 +1,10 @@
[Unit]
Description=Runs BindAPI every minute
[Timer]
OnBootSec=1min
OnUnitActiveSec=1min
Unit=bindAPI.service
[Install]
WantedBy=timers.target

View File

@ -94,7 +94,12 @@ class CLIController
$this->apikeysDelete(); $this->apikeysDelete();
}, },
mandatoryParameters: ['ID']))) mandatoryParameters: ['ID'])))
->addCommandGroup(commandGroup: (new CommandGroup(name: 'cron', description: 'Run zone fle maintenance'))
->addCommand(command: new Command(
name: 'run',
callback: function () {
$this->cronRun();
})))
->addCommandGroup(commandGroup: (new CommandGroup(name: 'check', description: 'health checks the system can perform')) ->addCommandGroup(commandGroup: (new CommandGroup(name: 'check', description: 'health checks the system can perform'))
->addCommand(command: new Command( ->addCommand(command: new Command(
name: 'permissions', name: 'permissions',
@ -919,13 +924,34 @@ class CLIController
} }
exit(1); exit(1);
} }
if (!$this->panelRepository->findByID(id: $id)) { if (!$this->panelRepository->findByID(id: $id)) {
if (!$this->quiet) { if (!$this->quiet) {
echo "Panel with ID : $id doesn't exist." . PHP_EOL; echo "Panel with ID : $id doesn't exist." . PHP_EOL;
} }
exit(1); exit(1);
} }
if ($apikey) { if ($apikey) {
// sanity check for panel apikey
if (!str_contains(haystack: $apikey, needle: '.')) {
$this->exitInvalidPanelApiKey();
} else {
[$prefix, $key] = explode(separator: '.', string: $apikey);
$prefixLen = strlen(string: $prefix);
if ($prefixLen != 8) {
$errorMessage = 'The prefix must be 8 characters long';
$this->exitInvalidPanelApiKey(details: $errorMessage);
}
var_dump($prefix, $key);
echo 'Length of prefix: ' . strlen($prefix) . PHP_EOL;
echo 'Length of key: ' . strlen($key) . PHP_EOL;
die();
}
$panel = new Panel(name: $name, id: $id, a: $a, aaaa: $aaaa, passphrase: $apikey, self: $self); $panel = new Panel(name: $name, id: $id, a: $a, aaaa: $aaaa, passphrase: $apikey, self: $self);
} else { } else {
$panel = new Panel(name: $name, id: $id, a: $a, aaaa: $aaaa, self: $self); $panel = new Panel(name: $name, id: $id, a: $a, aaaa: $aaaa, self: $self);
@ -1100,7 +1126,9 @@ class CLIController
if ($result['data'] == 'pong') { if ($result['data'] == 'pong') {
echo ' ' . COLOR_GREEN . $result['data']; echo ' ' . COLOR_GREEN . $result['data'];
} else { } else {
echo COLOR_BLUE . ' skip' . COLOR_DEFAULT; var_dump($result);
die;
echo COLOR_BLUE . ' xxskip' . COLOR_DEFAULT;
if (!$this->configController->getConfig(configKey: 'quiet')) { if (!$this->configController->getConfig(configKey: 'quiet')) {
echo ' ' . $result['data']; echo ' ' . $result['data'];
} }
@ -1657,8 +1685,24 @@ class CLIController
$this->domainController->checkDomains(); $this->domainController->checkDomains();
} }
public function exitInvalidPanelApiKey(string $details = null): void
{
if (!$this->quiet) {
if ($details) {
echo COLOR_YELLOW . $details . COLOR_DEFAULT . PHP_EOL;
}
echo 'This is no valid panel apikey. A valid key looks like this one:' . PHP_EOL;
echo COLOR_YELLOW . 'A7hjZx52.u8Rzj2S5KUvqozPlQwh4k3eDCrLikL8ZYlcdPr488QkbOW2JaS6Hg5syNllgnNOpQv6TntNMzt62LiH5CTlrMovRQhMcwZzM5dOfLKzqEePFRv1y6qZ7CT9' . PHP_EOL;
}
exit(1);
}
/** public function exitInvalidNameserverApiKey(string $details = null): void
{
echo 'fixme';
}
/**
*/ */
private function dynDnsPush(): void private function dynDnsPush(): void
{ {
@ -1775,7 +1819,7 @@ class CLIController
} }
if (!empty($result['error'])) { if (!empty($result['error'])) {
echo $result['data'] . PHP_EOL; echo 'Error: ' . $result['data'] . PHP_EOL;
exit(1); exit(1);
} }
if (!empty($result['data'])) { if (!empty($result['data'])) {
@ -2142,4 +2186,10 @@ class CLIController
} }
} }
private function cronRun()
{
$this->logger->debug(message: 'cronRun()');
$this->domainsUpdate();
}
} }

View File

@ -111,10 +111,15 @@ class DomainController
if (!$this->quiet) { if (!$this->quiet) {
echo 'Removing stale zone: ' . COLOR_YELLOW . $zone . COLOR_DEFAULT . PHP_EOL; echo 'Removing stale zone: ' . COLOR_YELLOW . $zone . COLOR_DEFAULT . PHP_EOL;
} }
echo $zone . PHP_EOL;
unlink(filename: $zone); unlink(filename: $zone);
} }
$this->createIncludeFile(); $semaphore = $this->localZonesDir . 'zones.flag';
if (file_exists(filename: $semaphore)) {
unlink(filename: $semaphore);
$this->createIncludeFile();
}
} }
@ -323,7 +328,9 @@ class DomainController
*/ */
public function createSlaveZoneFile(Domain $domain): bool public function createSlaveZoneFile(Domain $domain): bool
{ {
$domainName = $domain->getName(); touch(filename: $this->localZonesDir . 'zones.flag');
$domainName = $domain->getName();
$this->logger->info(message: "createZoneFile($domainName)"); $this->logger->info(message: "createZoneFile($domainName)");
// check if we're a master zone // check if we're a master zone