#!/usr/bin/perl -w

# =-=-=-=-=
# $Id: nic2cache,v 1.3 2006/04/06 20:34:43 monachus Exp $
#
# Script to export domains and local servers
# from NicTool to dnscache
#
# Written by Adrian Goins <agoins@arces.net>
# Copyright 2006 by Arces Network, LLC
# All Rights Reserved.
# =-=-=-=-=

use strict;

use DBI;
use Getopt::Std;
use Term::ReadKey;

use vars qw( $dbhost $dbuser $dbpass $dbname $opts $outdir );
use vars qw( $dbh $sth $query %zones );

getopts( "hd:u:p:n:l:", \%$opts );

$| = 1;
my $count = 0;

# Alternative to command line or interactive
# Uncomment and set if desired
# $dbhost = "";
# $dbuser = "";
# $dbpass = "";
# $dbname = "";
# $outdir = "";

&usage if( $opts->{h} );
&usage unless( $opts->{l} or $outdir );
$dbhost = $opts->{d} if( $opts->{d} );
$dbuser = $opts->{u} if( $opts->{u} );
$dbpass = $opts->{p} if( $opts->{p} );
$dbname = $opts->{n} if( $opts->{n} );
$outdir = $opts->{l} if( $opts->{l} );

&getHost unless( $dbhost );
&getDb unless( $dbname );
&getUser unless( $dbuser );
&getPass unless( $dbpass );

die( "Cannot write to directory:" . $outdir . " - $@\n" ) unless( -d $outdir and -r $outdir );

$dbh = DBI->connect( "DBI:mysql:database=$dbname;host=$dbhost", $dbuser, $dbpass, { RaiseError => 1 } );
$query = "SELECT nt_zone.zone,nt_nameserver.address ";
$query .= "FROM nt_zone,nt_nameserver ";
$query .= "WHERE ( ";
$query .= "nt_zone.ns0=nt_nameserver.nt_nameserver_id OR ";
$query .= "nt_zone.ns1=nt_nameserver.nt_nameserver_id OR ";
$query .= "nt_zone.ns2=nt_nameserver.nt_nameserver_id ) AND ";
$query .= "nt_zone.deleted=1";

$sth = $dbh->prepare( $query );
$sth->execute();

while( my $ref = $sth->fetchrow_arrayref ) {
    my $zone;

    if( $zones{ $ref->[0] } ) {
        $zone = $zones{ $ref->[0] };
    } else {
        $zone = {
            NAME    => $ref->[0],
            NS      => [],
        };
    }

    push( @{ $zone->{NS} }, $ref->[1] );
    $zones{ $zone->{NAME} } = $zone;
}

foreach my $zone ( values %zones ) {
    my $file = $outdir . "/" . $zone->{NAME};
    open( O, ">$file" );
        print( O join( "\n", @{ $zone->{NS}} ) . "\n" );
    close( O );
    $count++;
}

print( "$count zones exported.\n\n" );

exit;


sub usage {
    print( "Usage: nic2cache [-h] [-d host] [-u user] [-p pass] [-n name] -l dir\n" );
    print( "\t-d : host to connect to\n" );
    print( "\t-n : db to connect to\n" );
    print( "\t-u : user to connnect as\n" );
    print( "\t-p : pass to connect with\n" );
    print( "\t-l : directory to write to\n" );
    print( "\t-h : display this help\n\n" );
    print( "The script will ask for optional values if values are not present.\n\n" );
    exit 1;
}

sub getDb {
    print( "Database: " );
    my $db = ReadLine(0);
    chomp $db;
    if( $db eq "" ) {
        print( "Exiting.\n" );
        exit 1;
    } else {
        $dbname = $db;
    }
}

sub getHost {
    print( "Hostname: " );
    my $host = ReadLine(0);
    chomp $host;
    if( $host eq "" ) {
        print( "Exiting.\n" );
        exit 1;
    } else {
        $dbhost = $host;
    }
}

sub getUser {
    print( "Username: " );
    my $user = ReadLine(0);
    chomp $user;
    if( $user eq "" ) {
        print( "Exiting.\n" );
        exit 1;
    } else {
        $dbuser = $user;
    }
}

sub getPass {
    print( "Password: " );
    ReadMode( 'noecho' );
    my $pass = ReadLine(0);
    chomp( $pass );
    ReadMode( 'normal' );
    print( "\n" );
    $dbpass = $pass;
}
