=head1 edit_zone

Zum Editieren einer DNS-Zone.

=head2 Argumente

=over 4

=item $dom

Domain-ID laut Datenbank.

=item $kn

Standard-Prompt.

=back

=head2 Ergebnis

Nix.

=cut

use utf8;
use warnings; no warnings "redefine";
use strict;
use Cf qw($NSZ);
use Dbase::Help qw(DoFn);
use Dbase::Globals qw(bignum explain_child_error find_descr);
use Fehler qw(problem);

sub edit_zone($;$) {
	my($dom,$kn) = @_;
	my($name,$ist_beendet,$ip,$flags,$tsig) = DoFn <<_;
	SELECT domain, ende < UNIX_TIMESTAMP(NOW()), nserver, flags, tsig
	FROM   domainkunde
	WHERE  id = $dom
_
	return problem "Das ist eine Slave-Zone; da gibt's nix zu editieren." if $ip;

	return problem "Das ist eine Auto-Update-Zone (vgl. TSIG-Eintrag); da gibt's nix zu editieren."
		if defined $tsig;

	return problem('Diese Domain ist bereits beendet.') if $ist_beendet;

	if ( defined( my $flag_noris_update = find_descr( domainflags => 'noris_update' ) ) ) {
		return problem <<_ if $flags & bignum(1) << $flag_noris_update;
Das ist eine Auto-Update-Zone (vgl. noris_update-Flag).
=> Die darf nur indirekt angefasst werden, also via kunde oder nsset.
_
	}

	defined( my $flag_dnszone = find_descr domainflags=>'dnszone' )
		or return problem 'Es gibt kein dnszone-Flag in dieser Datenbank!?';

	unless ( $flags & bignum(1)<<$flag_dnszone ) {
		require noris::DNS::Resolver;
		my $resolver = noris::DNS::Resolver->new;

		my $ns = '';
		if ( my $packet = $resolver->send($name, 'SOA') ) {
			if ( my ($soa) = grep $_->type eq 'SOA', $packet->answer ) {
				( my $rname = $soa->rname ) =~ s/\./@/;
				$ns = ", sondern mutmaßlich auf\n"
				      . $soa->mname . "; zuständig wäre dann <$rname>";
			}
		}
		return problem(<<_);
Für diese Domain existiert keine DNS-Zone bei uns$ns.
_
	}

	system ssh => qw(-a -t), $NSZ, edit => $name
		and return problem( explain_child_error() );
}

1;
