#!/usr/bin/perl -w

use File::Basename;
use strict;

# bitte die Dateinamen anpassen

my %VARS_ = (
	"SVN_archive" 	=> "subversion-1.1.1.tar.bz2",
	"DB_archive"	=> "db-4.2.52.NC.tar.gz",
	"DB_patches"	=> ["db_patch.4.2.52.1","db_patch.4.2.52.2"],
	"APACHE_archive"=> "httpd-2.0.52.tar.bz2",
	"LOG_FILE"	=> "svn_install.log"
);
# wo befindet sich denn überhaupt das BASE_DIR ?
$VARS_{BASE_DIR} = $ENV{PWD};
# vars überprüfen
print "\n Checking paths ...\n";
foreach my $key ( sort keys %VARS_ ){
	#print $key,"\t",$VARS_{$key},"\n";
	if (-e $VARS_{$key}){
		print $key,"\t",$VARS_{$key},"\t ok \n";
	}
	# liste der patches
	elsif ($VARS_{$key} =~ /^ARRAY/){
		foreach my $patch ( @{$VARS_{$key}}){
			if(-e $patch){
				print $key,"\t",$patch,"\t ok \n";
			}
			else {	die $key,"\t",$patch,"\t fail\n";}
		}
	}
	else{
		die $key,"\t",$VARS_{$key},"\t fail\n";
	}
}
print "\n";
# alles mitloggen
$VARS_{LOG} = $VARS_{BASE_DIR}."/".$VARS_{LOG_FILE};
open(LOG,">>".$VARS_{LOG})
	|| eval { print "Fehler: ",$^E; exit;}; #logfile öffnen
&logg("starting ...");


# *********************
# SUBVERSION entpacken
	&logg("SVN entpacke ".$VARS_{SVN_archive});
	($VARS_{SVN_DIR} = $VARS_{SVN_archive}) =~ s/\.tar\.(bz2|gz)$//i;
	unless(-e $VARS_{SVN_DIR}){
		# bz2 oder gz
		if 	( $VARS_{SVN_archive} =~ /\.tar\.bz2$/i)	{ `tar -xjf $VARS_{SVN_archive}`;}
		elsif	( $VARS_{SVN_archive} =~ /\.tar\.gz$/i)		{ `tar -xzf $VARS_{SVN_archive}`;}
		else	{ die "\n Filetyp unknown $VARS_{SVN_archive}\n";}
		print " fertig\n";
	}
#sub t{

# *********************
# ./autogen.sh im Subversion-dir ausführen
	chdir( $VARS_{SVN_DIR} );
	`rm -r apr-util/xml/expat/autom4te.cache`;
	&logg("SVN ./autogen.sh im svn-dir");
	`./autogen.sh`;
	chdir("..");

# *********************
# DB entpacken
	&logg("DB entpacke ".$VARS_{DB_archive});
	($VARS_{DB_DIR} = $VARS_{DB_archive}) =~ s/\.tar\.(bz2|gz)$//i;
	unless(-e $VARS_{DB_DIR}){
		# bz2 oder gz
		if 	( $VARS_{DB_archive} =~ /\.tar\.bz2$/i)	{ `tar -xjf $VARS_{DB_archive}`;}
		elsif	( $VARS_{DB_archive} =~ /\.tar\.gz$/i)		{ `tar -xzf $VARS_{DB_archive}`;}
		else	{ die "\n Filetyp unknown $VARS_{DB_archive}\n";}
		print " fertig\n";
	}

# *********************
# DB patchen
	&logg("DB patching DB ...");
	chdir($VARS_{DB_DIR});
	foreach my $patch_ ( @{$VARS_{DB_patches}}){
		`patch -p0 < ../$patch_ >> $VARS_{LOG}`;
	}
	chdir("..");

# *********************
# DB konfigurieren, make , make install, bekannt machen
	&logg("DB ./build_unix ... ");
	chdir($VARS_{DB_DIR}."/build_unix");
	`../dist/configure >> $VARS_{LOG}`;
	&logg("DB make ... ");
	`make >> $VARS_{LOG}`;
	&logg("DB make install ... ");
	`make install >> $VARS_{LOG}`;
	&logg("DB make clean ... ");
	`make clean >> $VARS_{LOG}`;
	$VARS_{DB_libs} = "/usr/local/BerkeleyDB.4.2/lib";
		my $_cmd_fgrep = `fgrep $VARS_{DB_libs} /etc/ld.so.conf`;
		chomp($_cmd_fgrep);
		unless( $_cmd_fgrep eq $VARS_{DB_libs}){
			exec("echo $VARS_{DB_libs} >> /etc/ld.so.conf");
			exec("ldconfig");
		}
	chdir("../..");

## *********************
## APACHE entpacken, konfigurieren, make, make install, make clean
	&logg("APACHE entpacke ".$VARS_{APACHE_archive});
	($VARS_{APACHE_DIR} = $VARS_{APACHE_archive}) =~ s/\.tar\.(bz2|gz)$//i;
	unless(-e $VARS_{APACHE_DIR}){
		# bz2 oder gz
		if 	( $VARS_{APACHE_archive} =~ /\.tar\.bz2$/i)		{ `tar -xjf $VARS_{APACHE_archive}`;}
		elsif	( $VARS_{APACHE_archive} =~ /\.tar\.gz$/i)		{ `tar -xzf $VARS_{APACHE_archive}`;}
		else	{ die "\n Filetyp unknown $VARS_{APACHE_archive}\n";}
		print " fertig\n";
	}
	chdir($VARS_{APACHE_DIR});
	&logg("APACHE ./buildconf ... ");
	`./buildconf >> $VARS_{LOG}`;	# produziert Fehler, muss deswegen ohne Fehlerabfang ausgeführt werden
	&logg("APACHE ./configure ... ");
	`./configure --enable-dav=shared --with-gdbm=no --enable-deflate=shared --enable-so --with-berkeley-db=/usr/local/BerkeleyDB.4.2 --with-dbm=db4>> $VARS_{LOG}`;
	&logg("APACHE make ... ");
	`make >> $VARS_{LOG}`;
	&logg("APACHE make install ... ");
	`make install >> $VARS_{LOG}`;
	&logg("APACHE make clean ... ");
	`make clean >> $VARS_{LOG}`;
	chdir("..");
#}
## *********************
## SUBVERSION konfigurieren, make, make install, make clean
	chdir($VARS_{SVN_DIR});
	&logg("SVN ./configure");
	`./configure --with-berkeley-db=/usr/local/BerkeleyDB.4.2 --with-apxs=/usr/local/apache2/bin/apxs --with-apr=/usr/local/apache2 --with-apr-util=/usr/local/apache2`;
	&logg("SVN loesche /usr/local/lib/libsvn*");
	`rm -f /usr/local/lib/libsvn*`;
	&logg("SVN loesche /usr/local/lib/libneon*");
	`rm -f /usr/local/lib/libneon*`;
	&logg("SVN make");
	`make >> $VARS_{LOG}`;
	&logg("SVN make install");
	`make install >> $VARS_{LOG}`;
	&logg("SVN make clean");
	`make clean >> $VARS_{LOG}`;
	&logg("SVN cp tools/xslt/* /usr/local/apache2/htdocs");
	`cp tools/xslt/* /usr/local/apache2/htdocs`;
	&logg("SVN Gruppe svn anlegen");
	`groupadd -r svn`;
	&logg("SVN Nutzer anlegen");
	`useradd -r -g svn svn`;
	&logg("SVN Benutzerpasswort setzen");
	`passwd svn`;

foreach my $dir ("SVN_DIR","APACHE_DIR","DB_DIR"){
	&logg("loesche ".$VARS_{$dir});
	`rm -r $VARS_{$dir} >> $VARS_{LOG}`;
}

print "\n"x2,"so nun bitte ab Punkt 40 selber weitermachen","\n"x2;

&logg("... ending.");
close(LOG);	# Logfile schließen
sub ex{
	`$_[0] >> $VARS_{LOG}` || die "Fehler: $_[0] $^E\n";
}

# mitloggen
sub logg{
	my $date = `date`;		# datum
	chomp($date);			# ohne zusätzlichen Absatz
	print LOG "\n",$date,"\t",$_[0],"\n";# schreiben
	print $_[0],"\n";
}
