#!/usr/local/bin/perl5.16.3
#### ASpath-tree v.4.2 - Released on Thu APR 17 2003, h.16:58:12
#### File: update-rtree Last modified on Tue MAR 18 2003, h.22:59:48


# Configuration File
my $CONFIGFILE = "/usr/local/etc/ASpath-tree.config";

# Global variables
use vars qw ($HOMEDIR $RSHDIR $ROUTER $LOCAL $ROUTERADDR $ROUTERUSER $ROUTERUSERPASS $CONTACTNAME $CONTACTMAIL $SITENAME $SITEPICTURE $HTMLDIR
             $WHOISLINK $QUIET $DEBUG $FILTEROUT $RIPEWHOISCLIENT $MORETREES);
use vars qw ($DATADIR $ROOTPICTURE $LIB $ICONS $WARNINGTIME $HISTORYPERIOD $FLAG_COLLECT $LONGDATE $CURRENTTIME $LASTRUN);
use vars qw ($SIXBONEDB $IPV6PREFIXTABLE $PTLA_FILE $HISTORYFILE $LASTRUNFILE $OLDASPATHSFILE $OLDDATEFILE $OLDBBASPATHSFILE
             $OLDBBDATEFILE $PTLASHISTORYDIR $OTHERHISTORYDIR $PREFIXESGLOBALHISTORY $GLOBALHISTORYDIR
             $PREFIXESGLOBALHIST24H $GLOBALPTLAHISTDIR $GLOBALOTHERHISTDIR $TODOBGPCOLLECT $HTMLDIR_LOCAL $OUTPUTCOMPLETE
             $OUTPUTBB $OUTPUTIANA $OUTPUTCOMPLETECHANGES $OUTPUTIANACHANGES $DETAILDIR $DETAILDIRCO $DETAILDIRBB $DETAILDIRIANA
             $HISTORYHTMLDIR $CHANGESDIR $ICONSDIR $LINKDIR $LINKDIRBB $LINKDIRIANA $INDEXPAGE $PEERLASTALIVEFILE $VER
             $CHANGESFLAG $LOGDIR $STATUSCODES $BGPTABLEFILE $SUMMINFOGLOBALHIST24H $SUMMINFOGLOBALHISTORY
             $RIRSDB $ASTABLE $ASFORCETABLE $STLA_FILE $RIPEWHOISLINK $ROUTERTABLE);
$QUIET = 0;
$DEBUG = 0;

my $usage = <<EndOfHelpinline;
Usage:
update-rtree [-u|r] [-d] [-h] [-f <filename>]

      no input parameters: basic ASpath-tree behaviour
   -u update local information bases with whois queries over the Internet
   -r recover previously used local information bases
   -d enable printing and logging for debugging
   -f <filename> Configuration file (default is /etc/ASpath-tree.config)
   -h help in line
EndOfHelpinline

my $input = '';
my $message = '';

use Getopt::Long;

my $res = GetOptions(\%opt,
	"d",
	"u",
	"r",
	"h",
	"help",
	"f=s",
);

if (@ARGV) {$message = "ERROR: unexpected input parameter(s)!\n"; $input = 3}
elsif ($res) {
	if (keys(%opt)) {
		if (exists $opt{help} || exists $opt{h}) {$input = 3}
		if (exists $opt{f}) {
			if (-e $opt{f}) {$CONFIGFILE = $opt{f}}
			else {$message = "ERROR: file \"$opt{f}\" does not exist!\n"; $input = 3}

		}
		if (exists $opt{d}) {$QUIET = 1; $DEBUG = 1}
		if (exists $opt{u} && exists ($opt{r}))  {$input = 3}
		elsif (exists $opt{u})  {$input = 1}
		elsif (exists $opt{r})  {$input = 2}
	}
} else {$message = "ERROR: unexpected input parameter(s)!\n"; $input = 3}

die("\nASpath-tree\n$message\n$usage") if ($input == 3);

my $conf_log = &set_env($CONFIGFILE);

my $text = 'Requested actions: ';
if (!$input) {$text .= "default\n"}
elsif ($input == 1) {$text .= "update dbs from the Internet\n"}
elsif ($input == 2) {$text .= "recover db info\n"}

require ("$LIB/ASmain.pl");
&set_runtime;

&log_it("ASpath-tree $VER - $LONGDATE\n",1);
&log_it("$text\nENVIRONMENT\n$conf_log"."end ENVIRONMENT\n");

if (!$input) {&asmain}
elsif ($input == 1 || $input == 2) {&update_localdbs_tables($input)}

my $etime = time - $^T;
&log_it("ASpath-tree $VER - elapsed time: $etime seconds\n",1);

exit(0);

# Routine to read the configuration file and configure ASpath-tree environment
sub set_env {
	my ($file) = @_;
	open (FILECONF, "< $file") || die "Cannot open $file: $!\n";
	my @file_cont = <FILECONF>;
	close (FILECONF);

	my $logtext = '';

## Reading configuration file...
	foreach $line (@file_cont) {
		chomp($line);
		while ((length($line)>0) && grep(/\s+/,substr($line,(length($line)-1),1))) {
			$line = substr($line,0,length($line)-1);
		}
		if ($line =~ /^\s*HOMEDIR\s*=\s*(.*)/)       {$HOMEDIR = $1}
		if ($line =~ /^\s*RSHDIR\s*=\s*(.*)/)        {$RSHDIR = $1}
		if ($line =~ /^\s*ROUTER\s*=\s*(.*)/)        {$ROUTER = uc($1)}
		if ($line =~ /^\s*LOCAL\s*=\s*(.*)/)         {$LOCAL = $1}
		if ($line =~ /^\s*ROUTERADDR\s*=\s*(.*)/)    {$ROUTERADDR = $1}
		if ($line =~ /^\s*ROUTERUSER\s*=\s*(.*)/)    {$ROUTERUSER = $1}
		if ($line =~ /^\s*ROUTERUSERPASS\s*=\s*(.*)/)    {$ROUTERUSERPASS = $1}
		if ($line =~ /^\s*CONTACTNAME\s*=\s*(.*)/)   {$CONTACTNAME = $1}
		if ($line =~ /^\s*CONTACTMAIL\s*=\s*(.*)/)   {$CONTACTMAIL = $1}
		if ($line =~ /^\s*SITENAME\s*=\s*(.*)/)      {$SITENAME = $1}
		if ($line =~ /^\s*SITEPICTURE\s*=\s*(.*)/)   {$SITEPICTURE = $1}
		if ($line =~ /^\s*HTMLDIR\s*=\s*(.*)/)       {$HTMLDIR = $1}
		if ($line =~ /^\s*WHOISLINK\s*=\s*(.*)/)     {$WHOISLINK = $1}
		if ($line =~ /^\s*CHANGESFLAG\s*=\s*(.*)/)   {$CHANGESFLAG = $1}
		if ($line =~ /^\s*FILTEROUT\s*=\s*(.*)/)     {$FILTEROUT = $1}
		if ($line =~ /^\s*RIPEWHOISCLIENT\s*=\s*(.*)/) {$RIPEWHOISCLIENT = $1}
		if ($line =~ /^\s*MORETREES\s*=\s*(.*)/)     {$MORETREES = $1}
	}

# DEFAULT values setting...(if not explicitely declared) and ERROR checking ...
	die "ERROR in configuration file: parameter HOMEDIR not set!\n"    unless ($HOMEDIR);
	die "ERROR in configuration file: parameter HOMEDIR not correct!\n"    unless (-d "$HOMEDIR");

	$LOGDIR = "$HOMEDIR/log"; unless (-e "$LOGDIR") {mkdir("$LOGDIR", 0775)};
	if ($DEBUG) {open(LOGFILE, "> $LOGDIR/runlog.txt"); close(LOGFILE)}
	&log_it_and_die("ERROR in configuration file: parameter SITENAME not set!")   unless ($SITENAME);
	&log_it_and_die("ERROR in configuration file: parameter ROUTER = \"$ROUTER\" not acceptable!") if ($ROUTER && !grep(/^$ROUTER$/, ("CISCO", "JUNIPER" , "ZEBRA", "ZEBRA93")));
	&log_it_and_die("ERROR in configuration file: LOCAL cannot be set for ROUTER = $ROUTER!") if ($LOCAL && $ROUTER !~ /^ZEBRA.*/i);
	unless ($LOCAL) {
		&log_it_and_die("ERROR in configuration file: parameter RSHDIR not set!")     unless ($RSHDIR);
		&log_it_and_die("ERROR in configuration file: parameter ROUTERADDR not set!") unless ($ROUTERADDR);
		&log_it_and_die("ERROR in configuration file: parameter ROUTERUSER not set!") unless ($ROUTERUSER);
	}
	unless ($WHOISLINK)     {$WHOISLINK = "http://whois.6bone.net/cgi-bin/whois"}
	unless ($DATADIR)       {$DATADIR = "$HOMEDIR/data"}
	unless ($LIB)           {$LIB = "/usr/local/libexec/aspathtree"}
	unless ($FILTEROUT)     {$FILTEROUT = 0}
	$ICONS = "./icons";
	$WARNINGTIME = 5;
	$HISTORYPERIOD = 24;
	$RIPEWHOISLINK         = "http://www.ripe.net/perl/whois?form_type=simple&full_query_string=&searchtext=-s+ARIN%2CAPNIC%2CRIPE";
	$VER = "v.4.2 modif 6NET";
	$logtext .= "  Configuration file: $file.\n";
	$logtext .= "  HOMEDIR = $HOMEDIR\n";
	$logtext .= "  Parser = ";
	if ($ROUTER) {$logtext .= "\"$ROUTER\"\n"}
	else {$logtext .= "default (CISCO)\n"}
	$logtext .= "  FILTER = ";
	if ($FILTEROUT == 0) {$logtext .= "default "}
	elsif ($FILTEROUT == 1) {$logtext .= "All suppressed routes "}
	elsif ($FILTEROUT == 2) {$logtext .= "Suppressed routes learned through iBGP "}
	$logtext .= "(FILTEROUT = $FILTEROUT)\n";
	$logtext .= "  CHANGES pages = ";
	if ($CHANGESFLAG) {$logtext .= "yes\n"}
	else {$logtext .= "no\n"}
	$logtext .= "  pTLAs & 2001 trees = ";
	if ($MORETREES) {$logtext .= "yes\n"}
	else {$logtext .= "no\n"}
	$logtext .= "\n  WARNINGTIME = \"$WARNINGTIME\"\n";
	$logtext .= "  HISTORYPERIOD = \"$HISTORYPERIOD\"\n";
	$logtext .= "  WHOISLINK = \"$WHOISLINK\"\n";
	$logtext .= "\n  LIBDIR = \"$LIB\"\n";

# Setting derived parameters and creating directories if required...
	$SIXBONEDB	       = "$DATADIR/6bone.db";
	$RIRSDB		       = "$DATADIR/rirs.db";
	$IPV6PREFIXTABLE       = "$DATADIR/ipv6-prefix.table";
	$PTLA_FILE             = "$DATADIR/ptla-prefix.table";
	$STLA_FILE             = "$DATADIR/stla-prefix.table";
	$ASTABLE	       = "$DATADIR/as.table";
	$ASFORCETABLE          = "$DATADIR/force.as.name";
	$logtext .= "\n  DATADIR = \"$DATADIR\"\n";
	$logtext .= "  SIXBONEDB = \"$SIXBONEDB\" ";
	if (-e $SIXBONEDB) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}
	$logtext .= "  RIRSDB = \"$RIRSDB\" ";
	if (-e $RIRSDB) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}
	$logtext .= "  ASFORCETABLE = \"$ASFORCETABLE\" ";
	if (-e $ASFORCETABLE) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}
	$logtext .= "  IPV6PREFIXTABLE = \"$IPV6PREFIXTABLE\" ";
	if (-e $IPV6PREFIXTABLE) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}
	$logtext .= "  PTLA_FILE = \"$PTLA_FILE\" ";
	if (-e $PTLA_FILE) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}
	$logtext .= "  STLA_FILE = \"$STLA_FILE\" ";
	if (-e $STLA_FILE) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}
	$logtext .= "  ASTABLE = \"$ASTABLE\" ";
	if (-e $ASTABLE) {$logtext .= "(ok)\n"} else {$logtext .= "(no)\n"}

	$HISTORYFILE           = "$HOMEDIR/history/allprefixes.txt";
	$PEERLASTALIVEFILE     = "$HOMEDIR/history/last_alive_peers.txt";
	$LASTRUNFILE           = "$HOMEDIR/history/lastrun.txt";
	$PTLASHISTORYDIR       = "$HOMEDIR/history/ptlas";
	$OTHERHISTORYDIR       = "$HOMEDIR/history/other";
	$OLDASPATHSFILE        = "$HOMEDIR/history/completetree/aspaths.txt";
	$OLDDATEFILE           = "$HOMEDIR/history/completetree/lastchangedate.txt";
	$logtext .= "  HISTORY dir = \"$HOMEDIR/history\"\n";
	$logtext .= "  HISTORYFILE = \"$HISTORYFILE\"\n";
	$logtext .= "  PEERLASTALIVEFILE = \"$PEERLASTALIVEFILE\"\n";
	$logtext .= "  LASTRUNFILE = \"$LASTRUNFILE\"\n";
	$logtext .= "  PTLASHISTORYDIR = \"$PTLASHISTORYDIR\" ";
	if (-e "$PTLASHISTORYDIR") {$logtext .= "(ok)\n"}
	else {mkdir("$PTLASHISTORYDIR", 0775); $logtext .= "(created)\n"}
	$logtext .= "  OTHERHISTORYDIR = \"$OTHERHISTORYDIR\" ";
	if (-e "$OTHERHISTORYDIR") {$logtext .= "(ok)\n"}
	else {mkdir("$OTHERHISTORYDIR", 0775); $logtext .= "(created)\n"}
	$logtext .= "  Complete tree dir = \"$HOMEDIR/history/completetree\" ";
	if (-e "$HOMEDIR/history/completetree") {$logtext .= "(ok)\n"}
	else {mkdir("$HOMEDIR/history/completetree", 0775); $logtext .= "(created)\n"}
	$logtext .= "  OLDASPATHSFILE = \"$OLDASPATHSFILE\"\n";
	$logtext .= "  OLDDATEFILE = \"$OLDDATEFILE\"\n";
	if ($NOMORETREES) {
		$OLDOTHASPATHSFILE     = "$HOMEDIR/history/othertree/aspaths.txt";
		$OLDOTHDATEFILE        = "$HOMEDIR/history/othertree/lastchangedate.txt";
		$OLDBBASPATHSFILE      = "$HOMEDIR/history/bbtree/bbaspaths.txt";
		$OLDBBDATEFILE         = "$HOMEDIR/history/bbtree/lastchangedate.txt";
		$logtext .= "  BB tree dir = \"$HOMEDIR/history/bbtree\" ";
		if (-e "$HOMEDIR/history/bbtree") {$logtext .= "(ok)\n"}
		else {mkdir("$HOMEDIR/history/bbtree", 0775); $logtext .= "(created)\n"}
		$logtext .= "  OLDBBASPATHSFILE = \"$OLDBBASPATHSFILE\"\n";
		$logtext .= "  OLDBBDATEFILE = \"$OLDBBDATEFILE\"\n";
		$logtext .= "  2001 tree dir = \"$HOMEDIR/history/othertree\" ";
		if (-e "$HOMEDIR/history/othertree") {$logtext .= "(ok)\n"}
		else {mkdir("$HOMEDIR/history/othertree", 0775); $logtext .= "(created)\n"}
		$logtext .= "  OLDOTHASPATHSFILE = \"$OLDOTHASPATHSFILE\"\n";
		$logtext .= "  OLDOTHDATEFILE = \"$OLDOTHDATEFILE\"\n";
	} else {
		if (-e "$HOMEDIR/history/bbtree") {system "rm -rf $HOMEDIR/history/bbtree"}
		if (-e "$HOMEDIR/history/othertree") {system "rm -rf $HOMEDIR/history/othertree"}
	}

	$HTMLDIR_LOCAL         = "$HOMEDIR/htdocs";
	unless ($HTMLDIR)       {$HTMLDIR = $HTMLDIR_LOCAL}
	$logtext .= "\n  HTMLDIR_LOCAL = \"$HTMLDIR_LOCAL\"\n";

	$OUTPUTCOMPLETE        = "$HTMLDIR_LOCAL/bgp-page-complete.html";
	$logtext .= "  OUTPUTCOMPLETE = \"$OUTPUTCOMPLETE\"\n";
	$OUTPUTBB      = "$HTMLDIR_LOCAL/bgp-page-backbone.html";
	$OUTPUTIANA    = "$HTMLDIR_LOCAL/bgp-page-otherIANA.html";
	if ($NOMORETREES) {
		$logtext .= "  OUTPUTBB = \"$OUTPUTBB\"\n";
		$logtext .= "  OUTPUTIANA = \"$OUTPUTIANA\"\n";
	}
	$BGPTABLEFILE          = "$HTMLDIR_LOCAL/bgp-table-snapshot.txt";
	$logtext .= "  BGPTABLEFILE = \"$BGPTABLEFILE\"\n";
	if ($CHANGESFLAG) {
		$CHANGESDIR            = "$HTMLDIR_LOCAL/changes";
		$logtext .= "  CHANGESDIR = \"$CHANGESDIR\" ";
		if (-e "$CHANGESDIR") {$logtext .= "(ok)\n"}
		else {mkdir("$CHANGESDIR", 0775); $logtext .= "(created)\n"}
		$OUTPUTCOMPLETECHANGES     = "$CHANGESDIR/bgp-page-complete-changes.html";
		$logtext .= "  OUTPUTCOMPLETECHANGES = \"$OUTPUTCOMPLETECHANGES\"\n";
		$OUTPUTBBCHANGES   = "$CHANGESDIR/bgp-page-backbone-changes.html";
		$OUTPUTIANACHANGES = "$CHANGESDIR/bgp-page-otherIANAchanges.html";
		if ($NOMORETREES) {
			$logtext .= "  OUTPUTBBCHANGES = \"$OUTPUTBBCHANGES\"\n";
			$logtext .= "  OUTPUTIANACHANGES = \"$OUTPUTIANACHANGES\"\n";
		}
	} elsif (-e "$CHANGESDIR") {system "rm -rf $CHANGESDIR"}
	$DETAILDIR             = "$HTMLDIR_LOCAL/details";
	$DETAILDIRCO           = "$DETAILDIR/complete";
	$logtext .= "  DETAILDIR = \"$DETAILDIR\" ";
	if (-e "$DETAILDIR") {$logtext .= "(ok)\n"}
	else {mkdir("$DETAILDIR", 0775); $logtext .= "(created)\n"}
	$logtext .= "  DETAILDIRCO = \"$DETAILDIRCO\" ";
	if (-e "$DETAILDIRCO") {$logtext .= "(ok)\n"}
	else {mkdir("$DETAILDIRCO", 0775); $logtext .= "(created)\n"}
	if ($NOMORETREES) {
		$DETAILDIRBB   = "$DETAILDIR/backbone";
		$DETAILDIRIANA = "$DETAILDIR/otherIANA";
		$logtext .= "  DETAILDIRBB = \"$DETAILDIRBB\" ";
		if (-e "$DETAILDIRBB") {$logtext .= "(ok)\n"}
		else {mkdir("$DETAILDIRBB", 0775); $logtext .= "(created)\n"}
		$logtext .= "  DETAILDIRIANA = \"$DETAILDIRIANA\" ";
		if (-e "$DETAILDIRIANA") {$logtext .= "(ok)\n"}
		else {mkdir("$DETAILDIRIANA", 0775); $logtext .= "(created)\n"}
	} else {
		if (-e "$DETAILDIRBB") {system "rm -rf $DETAILDIRBB"}
		if (-e "$DETAILDIRIANA") {system "rm -rf $DETAILDIRIANA"}
	}
	$HISTORYHTMLDIR        = "$HTMLDIR_LOCAL/24h_history";
	$logtext .= "  HISTORYHTMLDIR = \"$HISTORYHTMLDIR\" ";
	if (-e "$HISTORYHTMLDIR") {$logtext .= "(ok)\n"}
	else {mkdir("$HISTORYHTMLDIR", 0775); $logtext .= "(created)\n"}
	$ICONSDIR              = "$HTMLDIR_LOCAL/icons";
	$logtext .= "  ICONSDIR = \"$ICONSDIR\"\n";
	$logtext .= "  Trash dir = \"$HTMLDIR_LOCAL/trash\" ";
	if (-e "$HTMLDIR_LOCAL/trash") {system "rm -rf $HTMLDIR_LOCAL/trash/*"; $logtext .= "(ok, empty)\n"}
	else {mkdir("$HTMLDIR_LOCAL/trash", 0775); $logtext .= "(created)\n"}

	$logtext .= "\n  HTMLDIR = \"$HTMLDIR\"\n";
	if (-d $HTMLDIR) {
		unless (-e "$HTMLDIR/details") {mkdir("$HTMLDIR/details", 0775); $logtext .= "  $HTMLDIR/details created.\n"}
		unless (-e "$HTMLDIR/details/complete") {mkdir("$HTMLDIR/details/complete", 0775); $logtext .= "  $HTMLDIR/details/complete created.\n"}
		if ($NOMORETREES) {
			unless (-e "$HTMLDIR/details/backbone") {mkdir("$HTMLDIR/details/backbone", 0775); $logtext .= "  $HTMLDIR/details/backbone created.\n"}
			unless (-e "$HTMLDIR/details/otherIANA") {mkdir("$HTMLDIR/details/otherIANA", 0775); $logtext .= "  $HTMLDIR/details/otherIANA created.\n"}
		} else {
			if (-e "$HTMLDIR/details/backbone") {system "rm -rf $HTMLDIR/details/backbone"}
			if (-e "$HTMLDIR/details/otherIANA") {system "rm -rf $HTMLDIR/details/otherIANA"}
		}
		unless (-e "$HTMLDIR/24h_history") {mkdir("$HTMLDIR/24h_history", 0775); $logtext .= "  $HTMLDIR/24h_history created.\n"}
		if ($CHANGESFLAG) {
			unless (-e "$HTMLDIR/changes") {mkdir("$HTMLDIR/changes", 0775); $logtext .= "  $HTMLDIR/changes created.\n"}
		}
		unless (-e "$HTMLDIR/icons") {
			mkdir("$HTMLDIR/icons", 0775);
			system("cp $ICONSDIR/* $HTMLDIR/icons");
			$logtext .= "  $HTMLDIR/icons created and template icons copied.\n";
		}
	}
	else {&log_it_and_die("ERROR in configuration file: HTMLDIR does not exist!!!\n")}

	$INDEXPAGE = "bgp.html";
	$LINKDIR               = "details/complete";
	if ($NOMORETREES) {
		$LINKDIRBB     = "details/backbone";
		$LINKDIRIANA   = "details/otherIANA";
	}

	return($logtext);
}

# Routine to log debug info/send to STDOUT runtime messages
sub log_it {
	my ($text, $flag) = @_;

	if ($DEBUG) {
		open(LOGFILE,">> $LOGDIR/runlog.txt");
		print LOGFILE "$text\n";
		close(LOGFILE);
	}
	if ($QUIET && $flag) {print STDOUT "$text\n"}
}

# Routine to log configuration ERRORs and stop ASpath-tree execution
sub log_it_and_die {
	my ($text) = @_;

	if ($DEBUG) {
		open(LOGFILE,">> $LOGDIR/runlog.txt");
		print LOGFILE "$text\n PROGRAM TERMINATED DUE TO UNEXPECTED CONDITIONS.\n";
		close(LOGFILE);
	}
	die "$text\n";
}
#### ASpath-tree v.4.2 - Released on Thu APR 17 2003, h.16:58:12
#### File: update-rtree Last modified on Tue MAR 18 2003, h.22:59:48
