]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - modulemanager
Merge pull request #1071 from SaberUK/insp20+fix-lusers
[user/henk/code/inspircd.git] / modulemanager
index 8b71081236407e5f8e3e734de5ff3caadce51df4..af5bf113caa6f75b1d16b43bfbb5c8b74d193bb0 100755 (executable)
@@ -1,10 +1,40 @@
 #!/usr/bin/env perl
+
+#
+# InspIRCd -- Internet Relay Chat Daemon
+#
+#   Copyright (C) 2008-2009 Robin Burchell <robin+git@viroteck.net>
+#
+# This file is part of InspIRCd.  InspIRCd is free software: you can
+# redistribute it and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation, version 2.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+
 use strict;
 use warnings FATAL => qw(all);
-use LWP::Simple;
 
 use make::configure;
 
+BEGIN {
+       unless (module_installed("LWP::Simple")) {
+               die "Your system is missing the LWP::Simple Perl module!";
+       }
+       unless (module_installed("Crypt::SSLeay") || module_installed("IO::Socket::SSL")) {
+               die "Your system is missing the Crypt::SSLeay or IO::Socket::SSL Perl modules!";
+       }
+}
+
+use LWP::Simple;
+
 our @modlist;
 
 my %installed;
@@ -26,15 +56,20 @@ sub parse_url;
 
 # retrieve and parse entries from sources.list
 sub parse_url {
-       my $src = shift;
+       chomp(my $src = shift);
        return if $url_seen{$src};
        $url_seen{$src}++;
 
-       my $doc = get($src);
-       die "Could not retrieve $_" unless defined $doc;
+       my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
+       my $response = $ua->get($src);
+
+       unless ($response->is_success) {
+               my $err = $response->message;
+               die "Could not retrieve $src: $err";
+       }
 
        my $mod;
-       for (split /\n+/, $doc) {
+       for (split /\n+/, $response->decoded_content) {
                s/^\s+//; # ignore whitespace at start
                next if /^#/;
                if (/^module (\S+) (\S+) (\S+)/) {
@@ -101,6 +136,18 @@ getmodules(1);
 # determine core version
 `./src/version.sh` =~ /InspIRCd-([0-9.]+)/ or die "Cannot determine inspircd version";
 $installed{core} = $1;
+for my $mod (keys %modules) {
+       MODVER: for my $mver (keys %{$modules{$mod}}) {
+               for my $dep (@{$modules{$mod}{$mver}{depends}}) {
+                       next unless $dep =~ /^core (.*)/;
+                       if (!ver_in_range($installed{core}, $1)) {
+                               delete $modules{$mod}{$mver};
+                               next MODVER;
+                       }
+               }
+       }
+       delete $modules{$mod} unless %{$modules{$mod}};
+}
 $modules{core}{$1} = {
        url => 'NONE',
        depends => [],
@@ -129,10 +176,9 @@ my %todo = %installed;
 sub ver_cmp {
        ($a,$b) = @_ if @_;
 
-       # string versions first, git IDs
-       if ($a =~ /[a-z0-9]{40}/ or $b =~ /[a-z0-9]{40}/)
+       if ($a !~ /^[0-9.]+$/ or $b !~ /^[0-9.]+$/)
        {
-               # it's a string version. compare them as such.
+               # not a valid version number, don't try to sort
                return $a ne $b;
        }
 
@@ -140,7 +186,7 @@ sub ver_cmp {
        my @a = split /\./, $a;
        my @b = split /\./, $b;
        push @a, 0 while $#a < $#b;
-       push @b, 0 while $#b < $#a;
+       push @b, ($_[2] || 0) while $#b < $#a;
        for my $i (0..$#a) {
                my $d = $a[$i] <=> $b[$i];
                return $d if $d;
@@ -151,13 +197,13 @@ sub ver_cmp {
 sub ver_in_range {
        my($ver, $range) = @_;
        return 1 unless defined $range;
+       my($l,$h) = ($range, $range);
        if ($range =~ /(.*)-(.*)/) {
-               my($l,$h) = ($1,$2);
-               return 0 if $l && ver_cmp($ver, $l) < 0;
-               return 0 if $h && ver_cmp($ver, $h) > 0;
-               return 1;
+               ($l,$h) = ($1,$2);
        }
-       return !ver_cmp($ver, $range);
+       return 0 if $l && ver_cmp($ver, $l) < 0;
+       return 0 if $h && ver_cmp($ver, $h, 9999) > 0;
+       return 1;
 }
 
 sub find_mod_in_range {
@@ -219,7 +265,7 @@ sub resolve_deps {
        }
 }
 
-my $action = lc shift @ARGV;
+my $action = $#ARGV >= 0 ? lc shift @ARGV : 'help';
 
 if ($action eq 'install') {
        for my $mod (@ARGV) {
@@ -302,11 +348,16 @@ for my $mod (sort keys %todo) {
        }
        $mod_versions{$mod} = $ver;
 
-       my $stat = getstore($url, "src/modules/$mod.cpp");
-       if ($stat == 200) {
+       my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });
+       my $response = $ua->get($url);
+
+       if ($response->is_success) {
+               open(MF, ">src/modules/$mod.cpp") or die "\nFilesystem not writable: $!";
+               print MF $response->decoded_content;
+               close(MF);
                print " - done\n";
        } else {
-               print " - HTTP $stat\n";
+               printf "\nHTTP %s: %s\n", $response->code, $response->message;
        }
 }