#!/usr/bin/perl -w
#******************************************************************************
# FILE: install
#
# DESCRIPTION:
# Installation script for fBuilder...
#
# AUTHOR:
# Sonny Parlin <sparlin@innertek.com>
# Steven Chagnot <schagnot@innertek.com>
#
# CREATION DATE:
# 4/24/2000
# 
# LAST MODIFIED:
# 7/14/2003
#
# Copyright 2003, InnerTek Software, LLC.
#******************************************************************************
use strict;

my $INSTALL="/usr/bin/install";

MAIN:
{
    my $response;

    print "Checking for system account: fbuilder\n";

    $response = `grep fbuilder /etc/passwd`;

    if (!$response) {
		print "Couldn't find user account: fbuilder\n";
		print "Please add this account and run this installation again.\n";
		exit;
    }
    
    $response = `grep fbuilder /etc/group`;
    
    if (!$response) {
		print "Couldn't find group account: fbuilder\n";
		print "Please add this account and run this installation again.\n";
		exit;
    }   
    
    unless (-e "/sbin/iptables") {
    	print "fBuilder could not locate iptables in your /sbin directory.\n";
    	print "Please add a link to your iptables installation in this directory\n";
    	exit;
    }
    
    print "\nAdding fBuilder account\n";
    print "Choose a username and password to be used to initially\n";
    print "log into fBuilder.\n";

    &BuildPasswdFile;
    &BuildConfig;
    &KillBoa;
    
    system("./loadmods.pl");
    
    print "############################################################\n";
    print "# Installing fbuilder in /usr/local/fbuilder               #\n";
    print "############################################################\n\n";
    
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder boa.conf /usr/local/fbuilder/boa.conf`;
    `$INSTALL -b -D -m 755 -o fbuilder -g fbuilder boa /usr/local/fbuilder/boa`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/prod_logo_large.gif /usr/local/fbuilder/graphics/prod_logo_large.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/dot.gif /usr/local/fbuilder/graphics/dot.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/open.gif /usr/local/fbuilder/graphics/open.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/fold.gif /usr/local/fbuilder/graphics/fold.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/bullet.gif /usr/local/fbuilder/graphics/bullet.gif`;    
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/up.gif /usr/local/fbuilder/graphics/up.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/down.gif /usr/local/fbuilder/graphics/down.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/innertek_small.gif /usr/local/fbuilder/graphics/innertek_small.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder graphics/prod_logo_small.gif /usr/local/fbuilder/graphics/prod_logo_small.gif`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/basics.html /usr/local/fbuilder/docs/basics.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/edit.html /usr/local/fbuilder/docs/edit.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/install.html /usr/local/fbuilder/docs/install.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/misc.html /usr/local/fbuilder/docs/misc.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/uadmin.html /usr/local/fbuilder/docs/uadmin.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/faqs.html /usr/local/fbuilder/docs/faqs.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/intro.html /usr/local/fbuilder/docs/intro.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/tools.html /usr/local/fbuilder/docs/tools.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder docs/view.html /usr/local/fbuilder/docs/view.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder fbuilder.html /usr/local/fbuilder/fbuilder.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder fbuilderout.html /usr/local/fbuilder/fbuilderout.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder column.html /usr/local/fbuilder/column.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder language.conf /usr/local/fbuilder/language.conf`;
    `$INSTALL -b -D -m 755 -o fbuilder -g fbuilder fb-report /usr/local/fbuilder/fb-report`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder fb-report.conf /usr/local/fbuilder/fb-report.conf`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder fbuilder.conf /usr/local/fbuilder/fbuilder.conf`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder index.html /usr/local/fbuilder/index.html`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder popup.js /usr/local/fbuilder/popup.js`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder style.css /usr/local/fbuilder/style.css`;
    `$INSTALL -b -D -m 755 -o fbuilder -g fbuilder fBuilder.cgi /usr/local/fbuilder/fBuilder.cgi`;
    `$INSTALL -b -D -m 755 -o fbuilder -g fbuilder wizard.cgi /usr/local/fbuilder/wizard.cgi`;
    `$INSTALL -b -D -m 04755 -o root -g root executescript /usr/local/fbuilder/executescript`;
    `$INSTALL -b -D -m 04755 -o root -g root loadmods.pl /root/loadmods.pl`;
    `$INSTALL -b -D -m 0755 -o fbuilder -g fbuilder updateCache.pl /usr/local/fbuilder/updateCache.pl`;
    `$INSTALL -b -D -m 04755 -o root -g root fParse.cgi /usr/local/fbuilder/fParse.cgi`;
    `$INSTALL -b -D -m 04755 -o root -g root fPrint.cgi /usr/local/fbuilder/fPrint.cgi`;
    `$INSTALL -b -D -m 04755 -o root -g root fBuilder_chains /usr/local/fbuilder/fBuilder_chains`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder .hosts /usr/local/fbuilder/.hosts`;
    `$INSTALL -b -D -m 755 -o fbuilder -g fbuilder fw-init /usr/local/fbuilder/fw-init`;
    `$INSTALL -b -D -m 644 -o fbuilder -g fbuilder passwd /etc/fbuilder/passwd`;
    `chown fbuilder:fbuilder /usr/local/fbuilder`;

    print "Starting fbuilder web server on port 8000\n";
    system('/usr/local/fbuilder/boa');
    
    print "Installation complete, fbuilder started: " .
	  "listening on port 8000\n";
}

sub BuildPasswdFile {
    my $user;
    my $word;
    my $vword;
    my $pwd;

    # Get username from user...
    print "Username: ";
    chomp($user = <STDIN>);
    
    # Stop echoing input while ask for password...
    system "stty -echo";

    while(1) {
	# Get password from user
	print "Password: ";
	chomp($word = <STDIN>);

	print "\n";

	# Get password from user
	print "Verify password: ";
	chomp($vword = <STDIN>);

	if ($word eq $vword) {
	    last;
	} else {
	    print "\nPasswords do not match, try again...\n";
	}
    }

    # Create encrypted passwd using a very strong salt...
    # rand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`) should do the trick.
    $pwd = crypt($word, rand (time ^ $$ ^ unpack "%L*", `ps axww | gzip`));

    # Start echoing input again
    system "stty echo";
    
    open(FD, ">>passwd") || die "Couldn't open passwd file: $!";
    print FD "$user:$pwd\n";
    close(FD);
    
    print "\nfBuilder account created!\n";    
}

sub BuildConfig
{
    my $word;
    my $loop = 0;
	
	while ($loop == 0) {
		print "What is the server name of this machine " .
		  "i.e.: (firewall.company.com):\n";
    	print "Server name: ";
    	chomp($word = <STDIN>);
	
		my $result = CheckHost($word);
		if ($result eq "good") {
			$loop = 1;
		} else {
			print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
			print "The name of your machine MUST follow the fully qualified domain name\n";
			print "format (firewall.domain.com).\n";
			print "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n";
		}
	}

    open(FD, "> .hosts") || die "Couldn't open config file: $!";
    print FD "$word\n";
    close(FD);
}

sub CheckHost
{
	my $host = shift;
	if ($host =~ /^[A-Z0-9][\-\.A-Z0-9]*\.\[?[\-\.A-Z0-9]+\.([A-Z]{2,3}|[0-9]{1,3})\]?$/i){
		return ("good");
	} else {
		return ("bad");
	} 
}

sub KillBoa {
	my $ps = `ps -awux | grep boa | grep fbuilder | grep -v grep`;
	my @process = split(/\s+/, $ps);
	my $pid = $process[1];
	if ($pid) {
		print "############################################################\n";
	    print "# Killing Boa Process                                      #\n";
	    print "############################################################\n\n";
		my $result = `kill $pid`;
		if ($result) {
			print "$result\n\n";
		} else {
			print "\n";
		}
	}
}
		