rendered paste body#!/usr/bin/perl
###############################
# Apache HTTPd Install Script #
# By Jorge Schrauwen 2007 #
###############################
# todo
# - svn checkout -> fetch_svn
# - don't download source tarball if allready present (do make clean)
# - module manager
# - db with modules and location
# - apxs version detect if version manager on
# require
use Cwd;
use File::Path;
use Term::ANSIColor;
use Term::Menu;
use WWW::Mechanize;
use HTML::TreeBuilder;
# configuration
my $srcDir = getcwd() . '/'; # set default source path
my $instDir = '/server/httpd'; # set default install location
my $bVersionManage = 0; # disable/enable source version mangement (not for trunk);
# variables
my $srcType = 1;
my $cfgStartOptions = 0;
my $cfgOptions = './configure';
# functions
sub header(){
system('clear');
print "#" x 35 . "\n";
print "# Apache HTTPd Installer #\n";
print "# By Jorge Schrauwen 2007 #\n";
print "#" x 35 . "\n\n";
}
sub main_menu(){
header();
my $prompt = new Term::Menu(
beforetext => 'Please select the kind of source you want to use:',
aftertext => 'Prompt: ',
);
my $answer = $prompt->menu(
release => ['Release', '1'],
tag_role => ['Tag & Role', '2'],
svntrunk => ['SVN Trunk', '3'],
doexit => ['Exit', '0']
);
if(defined($answer)){
if( $answer eq 'release' ) { $srcType = 1; fetch_source(); };
if( $answer eq 'tag_role' ) { $srcType = 2; fetch_source(); };
if( $answer eq 'svntrunk' ) { $srcType = 3; print "SVN Not Implemented!\n"; };
if( $answer eq 'doexit' ) { exit; }
}
}
sub fetch_source(){
header();
# get latest version
@url = ( 'http://apache.belnet.be/httpd/', 'http://httpd.apache.org/dev/dist/' );
my $oMech = WWW::Mechanize->new( 'agent' => 'HTTPD Installer/1.1', 'autocheck' => '1' );
$oMech->get(@url[$srcType-1]);
my $pageIndex = HTML::TreeBuilder->new_from_content($oMech->content());
my @links = $pageIndex->find_by_tag_name('a');
my $sLatestVersion = '';
my $i = 1;
while( length( $sLatestVersion ) == 0 ) {
my $node = @links[length(@links)-$i]->as_text();
# check if its the good node
if( substr ( $node, 0, 5) eq "httpd" ) {
if( substr ( $node, -6) eq "tar.gz" ) {
$sLatestVersion = substr( $node, 0, -7 );
}
}
$i++;
}
print "Do you wish to compile $sLatestVersion? (Y/n): ";
my $answer = <>;
chomp( $answer );
if( $answer eq 'n' ) { exit; }
# get aditional info
pre_req_info();
# download the source tarball
header();
print "Downloading $sLatestVersion.tar.gz...\n";
system( "wget -c @url[$srcType-1]$sLatestVersion.tar.gz" );
# extract source and remove tarball
header();
print "Extracting source...\n";
if( $bVersionManage ) { mkpath( substr( $sLatestVersion, 6 ) ); }
system( "tar xvf $sLatestVersion.tar.gz" );
system( "rm $sLatestVersion.tar.gz" );
if( $bVersionManage ) {
system( "mv $sLatestVersion " . substr( $sLatestVersion, 6 ) . "/httpd" );
chdir(substr( $sLatestVersion, 6 ) . "/httpd");
} else {
chdir($sLatestVersion);
}
configure();
}
sub pre_req_info(){
print "Where do you want to save the source? ($srcDir): ";
my $newSrcDir = <>;
chomp( $newSrcDir );
if( length( $newSrcDir ) > 0 ) { $srcDir = $newSrcDir; }
if ( !-d $srcDir ) {
mkpath( $srcDir );
}
chdir( $srcDir );
print "Where do you want to install httpd? ($instDir): ";
my $newInstDir = <>;
chomp( $newInstDir );
if( length( $newInstDir ) > 0 ) { $instDir = $newInstDir; }
$cfgOptions = $cfgOptions . " --prefix=$instDir";
}
sub configure(){
header();
my $prompt = new Term::Menu(
beforetext => 'Configuration Options:',
aftertext => 'Prompt: ',
);
my $answer = $prompt->menu(
auto => ['Configure All Modules', '1'],
manual => ['Manual Module Selection', '2'],
);
if(defined($answer)){
if( $answer eq 'auto' ) { auto_config(); };
if( $answer eq 'manual' ) { manual_config(); };
}
}
sub auto_config(){
header();
# select MPM
my $prompt = new Term::Menu(
beforetext => 'Select your MPM:',
aftertext => 'Prompt: ',
);
my $mpm = $prompt->menu(
worker => ['Worker', '1'],
prefork => ['Prefork', '2'],
event => ['Event', '3'],
);
$cfgOptions = $cfgOptions . " --with-mpm=$mpm";
$cfgStartOptions = length( $cfgOptions );
# enable almost all modules
$cfgOptions = $cfgOptions . " --enable-mods-shared=\"all cache proxy authn_alias mem_cache file_cache charset_lite dav_lock disk_cache";
# enable mod_ssl
print "Enable mod_ssl? (Y/n): ";
my $answer = <>;
chomp( $answer );
if( ( $answer eq 'y' ) or ( $answer eq '' ) ) { $cfgOptions = $cfgOptions . " ssl"; }
# enable ldap support
print "Enable LDAP support? (y/N): ";
my $answer = <>;
chomp( $answer );
if( $answer eq 'y' ) {
$cfgOptions = $cfgOptions . " ldap\" --with-ldap";
} else {
$cfgOptions = $cfgOptions . "\"";
}
build();
}
sub manual_config(){
header();
# enable mod_ssl
print "Please enter your own ./configure options (do not include the ./configure):\n";
my $answer = <>;
chomp( $answer );
$cfgOptions = $cfgOptions . " $answer";
build();
}
sub build(){
header();
# confirm compile
print "Version: $sLatestVersion\n";
print "Install Directory: $instDir\n";
print "Configuration Options:\n";
print substr( $cfgOptions, $cfgStartOptions ) . "\n\n";
print "Do you want to compile? (Y/n): ";
my $answer = <>;
chomp( $answer );
if( $answer eq 'n' ) { exit; }
# configuring
header();
print "Configuring...\n";
system( $cfgOptions );
# running make
header();
print "Running make...\n";
system( 'make' );
# running make install
header();
print "Running make install...\n";
print "Enter your sudo password to continue or crtl+c to terminate!\n";
system( 'sudo make install' );
# done
header();
print "File locations:\n";
print " apxs ==> $instDir/bin/apxs\n";
print " apachectl ==> $instDir/bin/apachectl\n";
print " httpd.conf ==> $instDir/conf/httpd.cong\n";
print "\n";
print "Installation Complete!\n";
}
# init code
main_menu();