dns.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <?php
  2. function knotcConfExec($cmds) {
  3. exec(CONF['dns']['knotc_path'] . ' conf-begin', $output['begin'], $code['begin']);
  4. if ($code['begin'] !== 0)
  5. output(500, 'knotcConfExec: <code>knotc</code> failed with exit code <samp>' . $code['begin'] . '</samp>: <samp>' . $output['begin'][0] . '</samp>.');
  6. foreach ($cmds as $cmd) {
  7. exec(CONF['dns']['knotc_path'] . ' conf-' . $cmd, $output['op'], $code['op']);
  8. if ($code['op'] !== 0) {
  9. exec(CONF['dns']['knotc_path'] . ' conf-abort');
  10. output(500, 'knotcConfExec: <code>knotc</code> failed with exit code <samp>' . $code['op'] . '</samp>: <samp>' . $output['op'][0] . '</samp>.');
  11. }
  12. }
  13. exec(CONF['dns']['knotc_path'] . ' conf-commit', $output['commit'], $code['commit']);
  14. if ($code['commit'] !== 0) {
  15. exec(CONF['dns']['knotc_path'] . ' conf-abort');
  16. output(500, 'knotcConfExec: <code>knotc</code> failed with exit code <samp>' . $code['commit'] . '</samp>: <samp>' . $output['commit'][0] . '</samp>.');
  17. }
  18. }
  19. function knotcZoneExec($zone, $cmd) {
  20. $action = checkAction($_POST['action']);
  21. exec(CONF['dns']['knotc_path'] . ' zone-begin ' . $zone, $output['begin'], $code['begin']);
  22. if ($code['begin'] !== 0)
  23. output(500, 'knotcZoneExec: <code>knotc</code> failed with exit code <samp>' . $code['begin'] . '</samp>: <samp>' . $output['begin'][0] . '</samp>.');
  24. exec(CONF['dns']['knotc_path'] . ' zone-' . $action . 'set ' . $zone . ' ' . implode(' ', $cmd), $output['op'], $code['op']);
  25. if ($code['op'] !== 0) {
  26. exec(CONF['dns']['knotc_path'] . ' zone-abort ' . $zone);
  27. output(500, 'knotcZoneExec: <code>knotc</code> failed with exit code <samp>' . $code['op'] . '</samp>: <samp>' . $output['op'][0] . '</samp>.');
  28. }
  29. exec(CONF['dns']['knotc_path'] . ' zone-commit ' . $zone, $output['commit'], $code['commit']);
  30. if ($code['commit'] !== 0) {
  31. exec(CONF['dns']['knotc_path'] . ' zone-abort ' . $zone);
  32. output(500, 'knotcZoneExec: <code>knotc</code> failed with exit code <samp>' . $code['commit'] . '</samp>: <samp>' . $output['commit'][0] . '</samp>.');
  33. }
  34. }
  35. function checkIpFormat($ip) {
  36. if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
  37. return 'A';
  38. if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
  39. return 'AAAA';
  40. output(403, 'IP address malformed.');
  41. }
  42. function checkAbsoluteDomainFormat($domain) {
  43. // If the domain must end with a dot
  44. if (!filter_var($domain, FILTER_VALIDATE_DOMAIN) OR !preg_match('/^([a-z0-9_-]{1,63}\.){2,127}$/', $domain))
  45. output(403, 'Domain malformed.');
  46. }
  47. function formatEndWithDot($str) {
  48. if (!str_ends_with($str, '.'))
  49. $str .= '.';
  50. return $str;
  51. }
  52. function formatAbsoluteDomain($domain) {
  53. $domain = formatEndWithDot(strtolower($domain));
  54. checkAbsoluteDomainFormat($domain);
  55. return $domain;
  56. }
  57. function checkAction($action) {
  58. return match ($action) {
  59. 'add' => '',
  60. 'delete' => 'un',
  61. default => output(403, 'Wrong value for action.'),
  62. };
  63. }