diff --git a/install b/install index e7ad048..e9a00d3 100755 --- a/install +++ b/install @@ -1,53 +1,19 @@ #!/usr/bin/env perl - # Auto IRC Bot. An advanced, lightweight and powerful IRC bot. # Copyright (C) 2010-2011 Xelhua Development Team (doc/CREDITS) # This program is free software; rights to this code are stated in doc/LICENSE. +package Install; use strict; use warnings; use English qw(-no_match_vars); use FindBin qw($Bin); our $Bin = $Bin; +BEGIN { unshift(@INC, "$Bin/src"); } +use Lib::Install; # Installation script. our $VERSION = 1.00; - -sub println -{ - my ($out) = @_; - - if (!defined $out) { - return; - } - - print $out.$/; - - return 1; -} - -sub ver -{ - my @vs = split('\.', $]); - - my %ver = (); - $ver{ver} = $vs[0]; - $ver{sub} = substr($vs[1], 1, 2); - $ver{rev} = substr($vs[1], 3, 3); - - return %ver; -} - -sub modfind -{ - my ($mod) = @_; - - print "Checking for $mod..... "; - eval('require '.$mod.'; 1;') and println "OK" or println "Not Found" and exit; - - return 1; -} - # Iterate through the arguments passed to us. my $features = "base"; if (defined $ARGV[0]) { @@ -55,6 +21,7 @@ if (defined $ARGV[0]) { if ($_ eq "-h" or $_ eq "--help") { println "*** ./install help ***"; println " --enable-sasl - Enable support for SASL."; + println " --enable-ipv6 - Enable support for IPv6."; println "*** End of Help ***"; exit; } @@ -63,6 +30,9 @@ if (defined $ARGV[0]) { } elsif ($_ eq "--enable-ssl") { $features .= " ssl"; + } + elsif ($_ eq "--enable-ipv6") { + $features .= " ipv6"; } else { println "Warning: Unknown option '".$_."'"; @@ -101,9 +71,8 @@ else { } # Check Perl version. -my %VER = ver(); -print "Checking Perl version..... $VER{ver}.$VER{sub}.$VER{rev} - "; -if ($VER{ver} >= 5 and $VER{sub} >= 10) { +print "Checking Perl version..... $] - "; +if ($] >= 5.010000) { println "OK"; } else { @@ -116,6 +85,7 @@ println "\0"; println "--- CPAN Modules ---"; modfind("Mouse"); modfind("Class::Unload"); +modfind("IO::Socket::INET6") if $features =~ /ipv6/; modfind("IO::Socket::SSL") if $features =~ /ssl/; modfind("MIME::Base64") if $features =~ /sasl/; @@ -138,25 +108,7 @@ if (!-e "$Bin/build/ver") { system("touch $Bin/build/ver"); } -open(my $FTIME, q{>}, "$Bin/build/time") or println "Failed to install." and exit; -print $FTIME time."\n" or println "Failed to install." and exit; -close $FTIME or println "Failed to install." and exit; - -open(my $FOS, q{>}, "$Bin/build/os") or println "Failed to install." and exit; -print $FOS $OSNAME."\n" or println "Failed to install." and exit; -close $FOS or println "Failed to install." and exit; - -open(my $FFEAT, q{>}, "$Bin/build/feat") or println "Failed to install." and exit; -print $FFEAT $features."\n" or println "Failed to install." and exit; -close $FFEAT or println "Failed to install." and exit; - -open(my $FPERL, q{>}, "$Bin/build/perl") or println "Failed to install." and exit; -print $FPERL "$]\n" or println "Failed to install." and exit; -close $FPERL or println "Failed to install." and exit; - -open(my $FVER, q{>}, "$Bin/build/ver") or println "Failed to install." and exit; -print $FVER "3.0.0d\n" or println "Failed to install." and exit; -close $FVER or println "Failed to install." and exit; +build($features); # Success! println "Done. Auto successfully installed."; diff --git a/src/Lib/Install.pm b/src/Lib/Install.pm new file mode 100644 index 0000000..257c9f8 --- /dev/null +++ b/src/Lib/Install.pm @@ -0,0 +1,101 @@ +# Auto IRC Bot. An advanced, lightweight and powerful IRC bot. +# Copyright (C) 2010-2011 Xelhua Development Team (doc/CREDITS) +# This program is free software; rights to this code are stated in doc/LICENSE. +package Lib::Install; +use strict; +use warnings; +use Exporter; +use English qw(-no_match_vars); +use FindBin qw($Bin); +our $Bin = $Bin; + +our $VERSION = 1.00; +our @ISA = qw(Exporter); +our @EXPORT = qw(println modfind build checkver); + +sub println +{ + my ($out) = @_; + + if (defined $out) { + print $out.$/; + } + else { + print $/; + } + + return 1; +} + +sub modfind +{ + my ($mod) = @_; + + print "Checking for $mod..... "; + eval('require '.$mod.'; 1;') and println "OK" or println "Not Found" and exit; + + return 1; +} + +sub build +{ + my ($features) = @_; + + open(my $FTIME, q{>}, "$Bin/build/time") or println "Failed to install." and exit; + print $FTIME time."\n" or println "Failed to install." and exit; + close $FTIME or println "Failed to install." and exit; + + open(my $FOS, q{>}, "$Bin/build/os") or println "Failed to install." and exit; + print $FOS $OSNAME."\n" or println "Failed to install." and exit; + close $FOS or println "Failed to install." and exit; + + open(my $FFEAT, q{>}, "$Bin/build/feat") or println "Failed to install." and exit; + print $FFEAT $features."\n" or println "Failed to install." and exit; + close $FFEAT or println "Failed to install." and exit; + + open(my $FPERL, q{>}, "$Bin/build/perl") or println "Failed to install." and exit; + print $FPERL "$]\n" or println "Failed to install." and exit; + close $FPERL or println "Failed to install." and exit; + + open(my $FVER, q{>}, "$Bin/build/ver") or println "Failed to install." and exit; + print $FVER "3.0.0d\n" or println "Failed to install." and exit; + close $FVER or println "Failed to install." and exit; + + return 1; +} + +sub checkver +{ + my ($ver) = @_; + + println "* Connecting to update server..."; + my $uss = IO::Socket::INET->new( + 'Proto' => 'tcp', + 'PeerAddr' => 'dist.xelhua.org', + 'PeerPort' => 80, + 'Timeout' => 30 + ) or println "Cannot connect to update server! Aborting update check."; + send($uss, "GET http://dist.xelhua.org/auto/version.txt\n", 0); + my $dll = ''; + while (my $data = readline($uss)) { + $data =~ s/(\n|\r)//g; + my ($v, $c) = split('=', $data); + + if ($v eq "url") { + $dll = $c; + } + elsif ($v eq "version") { + if ($ver ne $c) { + println("!!! NOTICE !!! Your copy of Auto is outdated. Current version: ".$ver." - Latest version: ".$c); + println("!!! NOTICE !!! You can get the latest Auto by downloading ".$dll); + println("!!! NOTICE !!! Won't install without force."); + exit; + } + else { + println("* Auto is up-to-date."); + } + } + } + + return 1; +}