use utf8;
use warnings; no warnings "redefine";
use strict;

use Cf qw($NSZ $UPDATE_ZONEN_COMMAND);
use Dbase::Globals qw(explain_child_error find_descr flag_names name_kunde);
use Dbase::Help qw(Do DoFn DoTransExit);
use Loader qw(log_update set_domain_nserver);
use Fehler qw(problem warnung);

# Flagbits:
# 1: führe add_zone auch aus, wenn das dnszone-Flag schon an ist
# 2: meckere nicht, wenn das Flag schon an ist
# 4: überspringe die Aktion wenn das Flags *aus* ist
#    (wird von set_domain_nserver verwendet)
# 8: keine Datenübernahme von bestehenden DNS-Servern

sub add_zone($;$$) {
	my ( $dom, $flg, $template ) = @_;
	$flg ||= 0;
	my($name,$ip,$kunde,$flags) = DoFn("select domain,nserver,kunde,flags from domainkunde where id = $dom");
	defined( my $flag_dnszone = find_descr domainflags=>'dnszone' )
	  or return problem 'Flag "dnszone" nicht gefunden.';

	if($flags & (1<<$flag_dnszone)) {
		warnung "Das dnszone-Flag ist bereits gesetzt."
			unless $flg&2;
		return unless $flg&1;
	} else {
		return if $flg&4;
		log_update 'domainkunde', 'id', $dom, undef, 'flags', undef,
	        	scalar flag_names($flag_dnszone,"domainflags",0);

		Do "update domainkunde set flags = flags | (1<<$flag_dnszone) where id = $dom";
	}

	unless ($ip) {
		DoTransExit(1);    # beendet die laufende Transaktion
		if (
			system qw(ssh -a),
			$NSZ, $flg & 8 ? 'add_default' : 'add',
			$name, name_kunde($kunde), defined $template ? $template : ()
		  )
		{
			warnung(
				explain_child_error(
					'Externes Programm zur Generierung der Zone')
			);
		}
		elsif ( system $UPDATE_ZONEN_COMMAND ) {
			warnung(
				explain_child_error(
					    'Externes Programm zum Triggern'
					  . ' von Updates auf den Slave-Servern'
				)
			);
		}
	}
	$dom;
}

1;
