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. serverError("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. serverError("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. serverError("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. serverError("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. serverError("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. serverError("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. userError("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. userError("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 => userError("Wrong value for action."),
  62. };
  63. }