#!/usr/bin/env perl # install - Installation wizard. # Copyright (C) 2010-2011 Xelhua Development Group, et al. # This program is free software; rights to this code are stated in doc/LICENSE. package Install; use strict; use warnings; use Getopt::Long; use English qw(-no_match_vars); use FindBin qw($Bin); use File::Copy; use File::Path qw(make_path remove_tree); our $Bin = $Bin; BEGIN { unshift(@INC, "$Bin/lib") } use Lib::Install; # Installation script. our $VERSION = 1.00; our $ERROR = 0; # Store the arguments passed to us. my ($opt_help, $opt_syswide, $PREFIX, $feature_nossl, $feature_sasl, $feature_ipv6, $feature_mysql, $feature_pgsql); GetOptions( '--disable-ssl' => \$feature_nossl, '--enable-sasl' => \$feature_sasl, '--enable-ipv6' => \$feature_ipv6, '--with-mysql' => \$feature_mysql, '--with-pgsql' => \$feature_pgsql, '--prefix=s' => \$PREFIX, '--syswide' => \$opt_syswide, '--help' => \$opt_help, ); # If --help was passed. if ($opt_help) { print <<"HELP"; Auto IRC Bot Installation Wizard (v1.00). Usage: perl install [options] Options: --disable-ssl Disables SSL support. --enable-sasl Enables SASL support. --enable-ipv6 Enables IPv6 support. --with-mysql Uses MySQL instead of SQLite. --with-pgsql Uses PostgreSQL instead of SQLite. --syswide Prefixes bin/ files with auto- (excluding `auto` itself), as well as installs build/ to lib/ instead. Always use this when installing to /usr. --prefix=PREFIX Installs files to PREFIX [$Bin] HELP exit 1; } # Set features. my $features = 'base'; $features .= ' ssl' unless $feature_nossl; $features .= ' sasl' if $feature_sasl; $features .= ' ipv6' if $feature_ipv6; if ($feature_mysql) { $features .= ' mysql' } elsif ($feature_pgsql) { $features .= ' pgsql' } else { $features .= ' sqlite' } # Where to install. my $upref; if (!$PREFIX) { $PREFIX = $Bin; $upref = 0; } else { $upref = 1 } # Adjust installation to be more appropriate for system-wide installs. my $libbuild = 0; if ($opt_syswide) { $libbuild = 1 } # Check Perl version. println "Checking Perl version..... $^V"; eval { require 5.010_000; } or println "This version of Perl is too old. Upgrade to Perl 5.10.0 or later and try again." and exit; # Check operating system. print "Checking operating system..... $OSNAME - "; if ($OSNAME =~ /dos/i) { print "DOS is not supported.\r\n"; exit; } elsif ($OSNAME eq "MSWin32") { print "OK\r\n"; } elsif ($OSNAME eq "NetWare") { print "NetWare is not supported.\r\n"; exit; } elsif ($OSNAME eq "linux") { print "OK\n"; } elsif ($OSNAME eq "os2") { print "IBM OS/2 is not supported.\r\n"; exit; } elsif ($OSNAME =~ /mac/i or $OSNAME =~ /darwin/i) { print "OK\r"; } elsif ($OSNAME eq "freebsd") { print "OK\n"; } elsif ($OSNAME eq "openbsd") { print "OK\n"; } elsif ($OSNAME eq "solaris") { print "OK\n"; } else { print "Unknown operating system. Contact support.\r\n"; exit; } # Check for Perl core modules. println "Checking for core Perl modules....."; checkcore(); println "\0"; if ($ERROR) { println "This Perl install is missing some core modules. Consider reinstalling Perl."; exit; } else { println "All good."; } # Check for required CPAN modules. println "\0"; println 'Checking for required CPAN modules......'; println "\0"; #modfind("Mouse"); modfind('DBI'); modfind('DBD::SQLite') if $features =~ /sqlite/; modfind('DBD::mysql') if $features =~ /mysql/; modfind('DBD::Pg') if $features =~ /pgsql/; modfind('Class::Unload'); modfind('IO::Socket::INET6') if $features =~ /ipv6/; modfind('IO::Socket::SSL') if $features =~ /ssl/; modfind('MIME::Base64') if $features =~ /sasl/; println "\0"; if ($ERROR) { println "Failed to install. Please install the missing CPAN modules and try again."; exit; } else { println "All good."; } # Create build. println "\0"; println "Building....."; if (!-d $PREFIX) { make_path($PREFIX) } my $libdir; if ($libbuild) { $libdir = "$PREFIX/lib/autobot/3.0.0" } else { $libdir = "$PREFIX/lib" } my $builddir; if ($libbuild) { $builddir = "$libdir/build" } else { $builddir = "$PREFIX/build" } if (!-d $builddir) { make_path($builddir) } build($features, $builddir, $opt_syswide); # Install. if ($upref) { require File::Copy::Recursive; File::Copy::Recursive->import('rcopy'); my $langdir; if ($libbuild) { $langdir = "$libdir/lang" } else { $langdir = "$PREFIX/lang" } my $moddir; if ($libbuild) { $moddir = "$libdir/modules" } else { $moddir = "$PREFIX/modules" } my $distdir; if ($libbuild) { $distdir = "$libdir/dist" } else { $distdir = "$PREFIX/dist" } println "Installing....."; if (!-d "$PREFIX/bin") { make_path("$PREFIX/bin") } if (!-d $libdir) { make_path($libdir) } if (!-d $langdir) { make_path($langdir) } if (!-d $moddir) { make_path($moddir) } if (!-d $distdir) { make_path($distdir) } my $bgenssl = 'genssl'; my $bbuildmod = 'buildmod'; my $bwizard = 'wizard'; if ($libbuild) { $bgenssl = "auto-$bgenssl"; $bbuildmod = "auto-$bbuildmod"; $bwizard = "auto-$bwizard"; } copy("$Bin/bin/auto", "$PREFIX/bin/auto"); copy("$Bin/bin/buildmod", "$PREFIX/bin/$bbuildmod"); copy("$Bin/bin/genssl", "$PREFIX/bin/$bgenssl"); copy("$Bin/bin/wizard", "$PREFIX/bin/$bwizard"); chmod 0755, "$PREFIX/bin/auto", "$PREFIX/bin/$bgenssl", "$PREFIX/bin/$bbuildmod", "$PREFIX/bin/$bwizard"; rcopy("$Bin/lib/*", "$libdir/"); rcopy("$Bin/lang/*", "$langdir/"); rcopy("$Bin/modules/*", "$moddir/"); copy("$Bin/etc/example.conf", "$distdir/"); remove_tree("$libdir/File"); } println 'Done.'; println q{}; if ($libbuild) { println 'To install modules, run the auto-buildmod utility on a module.'; } else { installmods($PREFIX) } println q{}; # Success! println "Done. Auto successfully installed."; # vim: set ai et sw=4 ts=4: