Zone.pm 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. domain => $Trog::Vars::not_ref,
  44. nameservers => \&Ref::Util::is_arrayref,
  45. subdomains => \&Ref::Util::is_arrayref,
  46. cnames => \&Ref::Util::is_arrayref,
  47. gsv_string => $Trog::Vars::not_ref,
  48. dkim_pkey => $Trog::Vars::not_ref,
  49. acme_challenge => $Trog::Vars::not_ref,
  50. };
  51. sub addzone($query) {
  52. my $domain = $query->{title};
  53. return unless $domain;
  54. my ($latest) = zone($domain);
  55. $latest //= {};
  56. my $conf = Trog::Config::get();
  57. my $data = Trog::Data->new($conf);
  58. %$latest = (
  59. %$latest,
  60. Trog::Vars::filter($query, $spec),
  61. );
  62. $data->add($latest);
  63. #TODO render and import into pdns
  64. return $latest;
  65. }
  66. sub delzone($domain) {
  67. my $conf = Trog::Config::get();
  68. my $data = Trog::Data->new($conf);
  69. my ($latest) = zone($domain);
  70. return unless $latest;
  71. return $data->delete($latest);
  72. }
  73. 1;