Zone.pm 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package Trog::Zone;
  2. =head1 Trog::Zone
  3. =head2 DESCRIPTION
  4. Zonefile CRUD
  5. =cut
  6. use strict;
  7. use warnings;
  8. use feature qw{signatures};
  9. no warnings qw{experimental};
  10. use Trog::Config;
  11. use Trog::Data;
  12. use Trog::Vars;
  13. use Net::IP;
  14. use Ref::Util;
  15. =head2 zone($domain) = @zonedata
  16. Returns the zone data for the requested zone.
  17. Like any other post in TCMS it's versioned.
  18. =cut
  19. sub zone($domain, $version=undef) {
  20. my $conf = Trog::Config::get();
  21. my $data = Trog::Data->new($conf);
  22. my @zonedata = $data->get( tags => ['zone'], acls => [qw{admin}], title => $domain );
  23. @zonedata = grep { $_->{version} == $version } @zonedata if defined $version;
  24. return @zonedata;
  25. }
  26. =head2 addzone($domain, %options)
  27. Add a post of 'zone' type.
  28. =cut
  29. my $valid_ip = sub {
  30. return Net::IP->new(shift);
  31. };
  32. my $valid_rev_ip = sub {
  33. return shift =~ m/\.in-addr\.arpa\.$/;
  34. };
  35. my $valid_rev_ip6 = sub {
  36. return shift =~ m/\.ip6\.arpa\.$/;
  37. };
  38. my $spec = {
  39. ip => $valid_ip,
  40. ip6 => $valid_ip,
  41. ip_reversed => $valid_rev_ip,
  42. ip6_reversed => $valid_rev_ip6,
  43. nameservers => \&Ref::Util::is_arrayref,
  44. subdomains => \&Ref::Util::is_arrayref,
  45. cnames => \&Ref::Util::is_arrayref,
  46. gsv_string => $Trog::Vars::not_ref,
  47. dkim_pkey => $Trog::Vars::not_ref,
  48. acme_challenge => $Trog::Vars::not_ref,
  49. };
  50. sub addzone($query) {
  51. my $domain = $query->{title};
  52. return unless $domain;
  53. my ($latest) = zone($domain);
  54. $latest //= {};
  55. my $conf = Trog::Config::get();
  56. my $data = Trog::Data->new($conf);
  57. %$latest = (
  58. %$latest,
  59. Trog::Vars::filter($query, $spec),
  60. );
  61. $data->add($latest);
  62. #TODO render and import into pdns
  63. return $latest;
  64. }
  65. sub delzone($domain) {
  66. my $conf = Trog::Config::get();
  67. my $data = Trog::Data->new($conf);
  68. my ($latest) = zone($domain);
  69. return unless $latest;
  70. return $data->delete($latest);
  71. }
  72. 1;