#!/usr/bin/perl -wd
#
#use strict;
use Data::Dumper;
require 'nictoolclient.conf';

#jfdesir
use DBI;
use CGI();
$q=new CGI();

#my ($zoneid, $zone, $domain, $ns0id , $ns1idi, $ns2id, $ttl ,$ns0, $mail, $serial, $refresh, $retry, $expire, $mini, $ns0, $ns1, $ns2, $ns1id,$n2id);
$user = "nictool";
$pass = "nictool";
$host = "dbhost";
$port = "3306";
$db = "nictool";
$dbh = DBI->connect ("DBI:mysql:database=$db;host=$host:$port;user=$user;password=$pass") || die "Connect failed: $DBI::errstr\n";
$work_dir = '/appli/named/';
#fin jfdesir


&main();

sub main {
    my $q = new CGI();
	use CGI::Carp qw( fatalsToBrowser );
    my $nt_obj = new NicToolClient($q);
    
    return if( $nt_obj->check_setup ne 'OK' );
    
    my $user = $nt_obj->verify_session();
	bless ($user);

    if( $user ) {
        print $q->header;
        &display($nt_obj, $q, $user);
    }
}

sub display {

    my($nt_obj, $q, $user) = @_;
    
    $nt_obj->parse_template($NicToolClient::start_html_template);
    $nt_obj->parse_template($NicToolClient::body_frame_start_template, 
							username => $user->{'username'},
							groupname => $user->{'groupname'}, userid=>$user->{'nt_user_id'});

    my $level = $nt_obj->display_group_tree($user,$user->{'nt_group_id'}, $q->param('nt_group_id'), 0);
    
    $nt_obj->display_zone_list_options($user,$q->param('nt_group_id'), $level, 1);

    my $group  = $nt_obj->get_group( nt_group_id => $q->param('nt_group_id'), summary_data => 1 );
    my $summary = $nt_obj->get_group_zone_summary( nt_group_id => $q->param('nt_group_id') );

    $nt_obj->display_group_zones_summary($user, $group, $summary) if $NicToolClient::display_summary_data;

    my %vars = setup_http_vars($q, 1);
	$vars{'ns_tree'} = $nt_obj->get_usable_nameservers( nt_group_id => $q->param('nt_group_id'), include_for_user=>1);

    print_zone_request_form($nt_obj, $q, %vars);

	if ( $q->param('action') ) {

		# Process form inputs
        print "processing form inputs <br>\n" if $vars{'debug'};
	    print "form action:  $vars{'action'} <br>\n" if ($vars{'action'} && $vars{'debug'});
        %vars = verify_global_vars($q, %vars);
		if ( $vars{'message'} ) {
			print "$vars{'message'} <br>\n";
			return 0;
		};

		my $zones = $vars{'zones'};
		#print "zones: $zones<br>\n";

		if ( $q->param('action') eq "add" ) {
			foreach my $zone ( @$zones ) { zone_add($zone, $nt_obj, $q, %vars ) };
		} elsif ( $q->param('action') eq "mod" ) {
			foreach my $zone ( @$zones ) { print "modifying zone: $zone<br>"; };
		} elsif ( $q->param('action') eq "del" ) {
			foreach my $zone ( @$zones ) { print "deleting zone: $zone<br>"; };
		}
    };

    $nt_obj->parse_template($NicToolClient::end_html_template);
}

sub print_zone_request_form {

    my ($nt_obj, $q, %vars) = @_;

	my @templates = $nt_obj->zone_record_template_list();
    my @actions = ("add");
    #my @actions = ( "", "add", "mod", "del");

    print $q->start_form,
		$q->hidden(-name=>'nt_group_id', -default=>$q->param('nt_group_id') );

	print qq{ <table cellpadding="2" cellspacing="2" border="0" width="100%">
			  <tr class="dark_bg"> 
                <td colspan="4" align="center"><b>Batch Zone Creation</b></td>
              </tr> },

          qq{ <tr class="light_grey_bg">
                <td align="right"> Action: </td>
                <td> }, 
    $q->popup_menu(-name=>'action', -values=>[@actions], -default=>$q->param('action')), 
          qq{   </td>
                <td align="right">New IP:</td><td> },
					$q->textfield(-name=>'newip', -size=>15, -value=>$q->param('newip')),
          qq{   </td>
             </tr> };

    print qq{<tr class="light_grey_bg">
               <td><a href="javascript:void window.open('templates.cgi','templates_win','width=640,height=580,scrollbars,resizable=yes')"> Template:</a></td>
               <td> }, $q->popup_menu(-name=>'template', -values=>[@templates]), qq{ </td>
               <td align="right">Mail IP: </td>
               <td> }, $q->textfield(-name=>'mailip', -size=>15, -value=>$q->param('mailip')), qq{<br>(if different than new) </td>
             </tr>

             <tr class="light_grey_bg">
               	<td> Nameservers </td>
                <td colspan="3">}, print_ns_tree($q, %vars), qq{ </td>
             </tr>

             <tr class="light_grey_bg">
                <td></td>
                <td colspan="3" align="center"><br>
    Zones must be a zone or list of zones, entered one per line. Zones have only two parts.<br>
              </tr>
              <tr class="light_grey_bg">
                <td>Zones:</td>
                <td colspan="2">
					<textarea name="zone_list" rows="10" cols="40"> }, $q->param('zone_list'), qq{ </textarea></td>
				 <td>A zone is also known as a domain name.<br>The same rules apply.<br>
					<br>This is a zone: example.com<br><br>This is NOT: www.example.com</td>
              </tr>
              <tr class="light_grey_bg"> 
				 <td>Options:</td>
                 <td colspan="3"> },
					$q->checkbox(-name=>'debug', -label=>' Debug'), ' <br> ',
           qq{   </td>
              </tr>
               },
#$q->checkbox(-name=>'reverse', -label=>' Reverse') (Create Matching PTR)</font></td>', 
				$q->td({-colspan=>'4', -align=>'center'}, $q->submit, ),
           qq{ </tr></table> },
        $q->end_form;
};


sub find_one_zone_id {
    my ($zone, $nt, %vars) = @_;

	my $debug = 0;
    print "searching for $zone..." if $debug;

    my $r = $nt->get_group_zones(    # search for an exact match
        nt_group_id       => $nt->{nt_group_id},
        include_subgroups => 1,
        Search            => 1,
        '1_field'         => "zone",
        '1_option'        => "equals",
        '1_value'         => $zone
    );

    if ( $r->{'zones'}->[0]->{'nt_zone_id'} ) {
        print "found: $r->{'zones'}->[0]->{'nt_zone_id'}\n" if $debug;
        return $r->{'zones'}->[0];
    } else {
        print "FAILED.\n" if $debug;
        return 0;
    };
};


## completed subs
sub zone_add {
	my ($zone, $nt, $q, %vars) = @_;

	print "zone_add: $zone ...";

	# see if zone exists
	my $id = find_one_zone_id($zone, $nt, %vars);

	if ($id) { print "exists, skipping.<br>"; return 0; };

	my %zone_vars = (
		#mailaddr    => , "dnsmaster.$zone.",
		mailaddr    => , "dnsmaster.MAGIC.",
		description => , "batch created",
		refresh     => , $vars{'refresh'},
		retry       => , $vars{'retry'},
		expire      => , $vars{'expire'},
		minimum     => , $vars{'minimum'},
		ttl         => , $vars{'ttl'},
		serial      => , $vars{'serial'},
		nt_group_id => , $vars{'nt_group_id'},
		zone        => , $zone,
		nameservers => , join(',', $q->param('nameservers')),
	);

	print Data::Dumper::Dumper(%zone_vars) if $vars{'debug'};

	# create zone
	my $r = $nt->new_zone( %zone_vars );
	if( $r->{'error_code'} != 200 ) { 
		print "$r->{'error_code'}: $r->{'error_msg'} : $r->{'error_desc'} <br>"; 
		print Data::Dumper::Dumper($r);
		return 0;
	};

	# add zone records based on template
	add_zone_records($nt, $q, $nt->zone_record_template( { zone=>$zone, nt_zone_id=>$r->{'nt_zone_id'}, template=>$q->param('template'), newip=>$q->param('newip'), mailip=>$q->param('mailip'), debug=>$q->param('debug')} ) );

	print "success.<br>";
	#jfdesir
	maj_mx1();
	$domain = $zone;
	#print "$domain JFDJFDJFDJ<br>\n";
	create_zone();
	#fin jfdesir
	# return success
}

sub add_zone_records {
	my ($nt, $q, $recs) = @_;

	if (scalar(@{$recs}) > 0 ) {
		for ( my $i = 0; $i < scalar(@{$recs}); $i++ ) {
			my %zone_record = (
				nt_zone_id      =>  $recs->[$i]->{'nt_zone_id'},
                name            =>  $recs->[$i]->{'name'},
                ttl             => "86400",
                description     => "batch added",
                type            =>  $recs->[$i]->{'type'},
                address         =>  $recs->[$i]->{'address'},
                weight          =>  $recs->[$i]->{'weight'}
            );
            if ($q->param('debug')) {
                print "add_zone_records: $recs->[$i]->{'nt_zone_id'}, $recs->[$i]->{'name'}, ";
                print "$recs->[$i]->{'type'}, $recs->[$i]->{'address'}, $recs->[$i]->{'weight'}\n";
				#print Data::Dumper::Dumper(%zone_record);
            };
            my $r = $nt->new_zone_record(%zone_record);
            if ( $r->{'error_code'} ne "200" ) {
                print "ZONE RECORD FAILED: $r->{'error_msg'}, $r->{'error_code'}\n";
				print Data::Dumper::Dumper($r);
            };
        };
    };
}

sub verify_global_vars {
	my ($q, %vars) = @_;

#    if ( $q->param('newip') eq "" && $q->param('template') ne "blank" ) {
#        $vars{'message'} = "The field New IP must not be blank!";
#    };
	return %vars;
};

sub setup_http_vars {
	my ($q, $debug) = @_;

	my %data;
	my @fields = qw(nt_group_id action newip nameservers mailip template do_reverse debug);
	foreach (@fields) { $data{$_} = $q->param($_) };
	$data{'nameservers'} = join(',', $q->param('nameservers'));

	$data{'ttl'}      = $NicToolClient::default_zone_ttl       || 86400;
	$data{'refresh'}  = $NicToolClient::default_zone_refresh   || 16384;
	$data{'retry'}    = $NicToolClient::default_zone_retry     || 1800;
	$data{'expire'}   = $NicToolClient::default_zone_expire    || 1048576;
	$data{'minimum'}  = $NicToolClient::default_zone_minimum   || 2560;
	$data{'mailaddr'} = $NicToolClient::default_zone_mailaddr  || 'dnsmaster.MAGIC.';

    my $zones = $q->param('zone_list'); chomp $zones;
    my @zones = split("\n", $zones);

	# lower case the names, strip off any trailing invalid characters
    foreach (@zones) { ($_) = lc($_) =~ /([a-z0-9\.\-]*)/; };
	$data{'zones'} = \@zones;

	return %data;
};

sub print_ns_tree {
	my ($q, %vars) = @_;

	unless ( defined $vars{'ns_tree'} ) {
		return "No available nameservers.";
	};

    if(@{$vars{'ns_tree'}->{'nameservers'}} == 0){
		return "No available nameservers.";
    }

	my $string;
    foreach(1 .. scalar(@{ $vars{'ns_tree'}->{'nameservers'} }) ) {
       	last if ($_ > 10);

       	my $ns = $vars{'ns_tree'}->{'nameservers'}->[$_ - 1];

		$string .= $q->checkbox(-name => "nameservers", -checked => ( $_ < 4 ? 1 : 0 ), -value=> $ns->{'nt_nameserver_id'}, -label=> "$ns->{'description'} ($ns->{'name'})") . "<BR>";
	};
	return $string;
};

1;

###################################
#jfdesir 
use File::Copy;

sub create_zone 
{
 my $uth = $dbh->prepare("SELECT * FROM `nt_zone` WHERE `zone` = '$domain'");
 $uth->execute;
 while(my @row = $uth->fetchrow_array()) {
	$zoneid=$row[0];
	$domain=$row[2];
	$mail=$row[3];
	$serial=$row[5];
	$refresh=$row[6];
	$retry=$row[7];
	$expire=$row[8];
	$mini=$row[9];
	$ttl=$row[10];
#	$ns0id=$row[11];
#	$ns1id=$row[12];
#	$ns2id=$row[13];
#	$ns3id=$row[14];
}
$uth->finish();
#
#
## NS0
#my $uth_ns0 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns0id'");
#$uth_ns0->execute;
#while(my @row0 = $uth_ns0->fetchrow_array()) {
#	#my $ns0=$row0[0];
#	$ns0=$row0[0];
#}
#$uth_ns0->finish();
#
###NS1
#my $uth_ns1 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns1id'");
#$uth_ns1->execute;
#while(my @row1 = $uth_ns1->fetchrow_array()) {
#	#my $ns1=$row1[0];
#	$ns1=$row1[0];
#}
#$uth_ns1->finish();
#
#
###NS2
#my $uth_ns2 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns2id'");
#$uth_ns2->execute;
#while(my @row2 = $uth_ns2->fetchrow_array()) {
#	#my $ns2=$row2[0];
#	$ns2=$row2[0];
#}
#$uth_ns2->finish();
#
#
###NS3
#my $uth_ns3 = $dbh->prepare("SELECT name FROM nt_nameserver WHERE `nt_nameserver_id` = '$ns3id'");
#$uth_ns3->execute;
#while(my @row3 = $uth_ns3->fetchrow_array()) {
#	#my $ns3=$row3[0];
#	$ns3=$row3[0];
#}
#$uth_ns3->finish();
#
#################################################################
		$chemin = "PATH";
		$server="PRIMARYIPSERVER";
        	$ns0="PRIMARYFQDNSERVER.";
        	$ns1="SECONDARYFQDNSEREVER.";
        	$ns2="THIRDFQDNSERVER.";
        	$soa = $ns0;
		dom_stamp();
		open (FILE, ">$work_dir/$chemin/zones/masters/$domain");

print FILE <<EOF;
\$TTL	$ttl
\@	IN	SOA	$ns0	$mail(
		$serial
		$refresh
		$retry
		$expire
		$mini)
	IN	NS	$ns0
	IN	NS	$ns1
	IN	NS	$ns2
EOF
		close (FILE);
		maj_record();
		newzone();
		newzone_slave();
		}


#############################################################
sub maj_record 
{
 my $uth_rec = $dbh->prepare("SELECT name,ttl,type,address,weight FROM nt_zone_record WHERE `nt_zone_id` = '$zoneid' AND `deleted` = '0'");
 $uth_rec->execute;
 while(my @row_rec = $uth_rec->fetchrow_array()) {
 	open (FILE, ">>$work_dir/$chemin/zones/masters/$domain");
	if ( "$row_rec[2]" eq "MX"){ 
		print FILE "$row_rec[0]\t$row_rec[1]\tIN\t$row_rec[2]\t$row_rec[4]  $row_rec[3]\n";
	}else{
		$row_rec[3]=~ s/\\072/:/g;
		print FILE "$row_rec[0]\t$row_rec[1]\tIN\t$row_rec[2]\t$row_rec[3]\n";
	}
 }
 close (FILE);
$uth_rec->finish();
}



############################################################

sub newzone 
{
my $conf="$work_dir/$chemin/etc/masters.inc";
my @TABCONF = ();
#my $newdom = "zone \"$domain\" \{ type master\; allow-query \{ can_query\; \}\; allow-transfer \{ can_axfr\; \}\; file \"masters\/$domain\"\; notify explicit\; \}\;\n";
my $newdom = "zone \"$domain\" \{ type master\; allow-query \{ can_query\; \}\; allow-transfer \{ can_axfr\; \}\; file \"masters\/$domain\"\; \}\;\n";

# recheche de la présence de ce domaine dans le fichier de conf
open (CONF, "$conf") or die "Can't open this file";
foreach (<CONF>){
	push (@TABCONF,$_);
	}
close (CONF);

#if (grep (/$newdom/, @TABCONF)){
if (grep (/\"$domain\"/, @TABCONF)){
	print "Fichier de configuration (named.conf)  OK\n";
	}
	else {
		open (CONF, ">$conf");
		push (@TABCONF,$newdom);
		print CONF @TABCONF;	
		close (CONF);
	}
}

############################################################

sub newzone_slave
{
copy("$work_dir/$chemin/etc/slaves.inc","$work_dir/$chemin/etc/archives/slaves.inc.$date");
my $slaveconf="$work_dir/$chemin/etc/slaves.inc";
my @TABSLAVE = ();
my $newslave = "zone \"$domain\" \{ type slave\; allow-query \{ can_query\; \}\; allow-transfer \{ can_axfr\; \}\; file \"slaves\/$domain\"\; masters \{ $server\;\}\; \}\;\n";

# recheche de la présence de ce domaine dans le fichier de conf
open (SLAVE, "$slaveconf") or die "Can't open this file";
foreach (<SLAVE>){
        push (@TABSLAVE,$_);
        }
	close (SLAVE);
	#if (grep (/$newslave/, @TABSLAVE)){
	if (grep (/\"$domain\"/, @TABSLAVE)){
	        print "Fichier de configuration (named.conf)  OK\n";
        }else {
		open (SLAVE, ">$slaveconf");
		push (@TABSLAVE,$newslave);
		print SLAVE @TABSLAVE;
		close (SLAVE);
        }
}

############################################################

# fichier stamp pour l'export crontab est zones
sub dom_stamp
{
$stamp="$work_dir/$chemin/zones/stamp/$domain\.stamp";
if (! -e $stamp){
	open (STAMP, ">$stamp") or die "Can't open $stamp";
	#print STAMP $domain;
	close (STAMP);
	sleep (1);
	}
}
#############################################################


##find jfdesir
1;

