#!/usr/bin/env perl
+
+#
+# InspIRCd -- Internet Relay Chat Daemon
+#
+# Copyright (C) 2012-2017 Peter Powell <petpow@saberuk.com>
+# 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/>.
+#
+
+
+BEGIN {
+ require 5.10.0;
+ unless (eval "use LWP::Simple; 1") {
+ die "Your system is missing the LWP::Simple Perl module!";
+ }
+ unless (eval "use Crypt::SSLeay; 1" || eval "use IO::Socket::SSL; 1") {
+ die "Your system is missing the Crypt::SSLeay or IO::Socket::SSL Perl modules!";
+ }
+}
+
+use feature ':5.10';
use strict;
use warnings FATAL => qw(all);
-use LWP::Simple;
-use make::configure;
+use File::Basename qw(basename);
+use FindBin qw($RealDir);
-our @modlist;
+use lib $RealDir;
+use make::common;
+use make::console;
my %installed;
# $installed{name} = $version
# 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->content) {
s/^\s+//; # ignore whitespace at start
next if /^#/;
if (/^module (\S+) (\S+) (\S+)/) {
$mod->{description} = $1;
} elsif (/^mask (.*)/) {
$mod->{mask} = $1;
- } elsif (m#^source (http://\S+)#) {
+ } elsif (/^source (\S+)/) {
parse_url $1;
} else {
print "Unknown line in $src: $_\n";
}
# hash of installed module versions from our mini-database, key (m_foobar) to version (00abacca..).
-my %mod_versions;
+my %mod_versions = read_config_file '.modulemanager';
# useless helper stub
sub getmodversion {
return $mod_versions{$file};
}
-# read in installed versions
-if (-e '.modulemanager')
-{
- open SRC, '.modulemanager' or die ".modulemanager exists but i can't read it: $!";
- while (<SRC>)
- {
- s/\n//;
- (my $mod, my $ver) = split(/ /, $_);
- $mod_versions{$mod} = $ver;
- }
- close SRC;
-}
-
# read in external URL sources
open SRC, 'sources.list' or die "Could not open sources.list: $!";
while (<SRC>) {
}
close SRC;
-getmodules(1);
-
# determine core version
`./src/version.sh` =~ /InspIRCd-([0-9.]+)/ or die "Cannot determine inspircd version";
$installed{core} = $1;
};
# set up core module list
-for my $modname (@modlist) {
- my $mod = "m_$modname";
- my $modfile = "src/modules/$mod.cpp";
+for my $modname (<src/modules/m_*.cpp>) {
+ my $mod = basename($modname, '.cpp');
my $ver = getmodversion($mod) || '0.0';
$ver =~ s/\$Rev: (.*) \$/$1/; # for storing revision in SVN
$installed{$mod} = $ver;
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;
}
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;
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 {
}
}
-my $action = lc shift @ARGV;
-
-if ($action eq 'install') {
- for my $mod (@ARGV) {
+command 'install', 'Install a third-party module', sub {
+ for my $mod (@_) {
my $vers = $mod =~ s/=([-0-9.]+)// ? $1 : undef;
$mod = lc $mod;
unless ($modules{$mod}) {
}
$todo{$mod} = $ver;
}
-} elsif ($action eq 'upgrade') {
+};
+
+command 'upgrade', 'Upgrade a third-party module', sub {
my @installed = sort keys %installed;
for my $mod (@installed) {
next unless $mod =~ /^m_/;
%todo = %saved;
}
}
-} elsif ($action eq 'list') {
+};
+
+command 'list', 'List available third-party modules', sub {
my @all = sort keys %modules;
for my $mod (@all) {
my @vers = sort { ver_cmp() } keys %{$modules{$mod}};
my $vers = join ' ', map { $_ eq $instver ? "\e[1m$_\e[m" : $_ } @vers;
print "$mod ($vers) - $desc\n";
}
-} else {
- print <<ENDUSAGE
-Use: $0 <action> <args>
-Action is one of the following
- install install new modules
- upgrade upgrade installed modules
- list lists available modules
-
-For installing a package, specify its name or name=version to force the
-installation of a specific version.
-ENDUSAGE
-;exit 1;
-}
+ exit 0;
+};
+
+execute_command @ARGV;
resolve_deps(0);
$| = 1; # immediate print of lines without \n
-print "Processing changes for $action...\n";
+print "Processing changes...\n";
for my $mod (keys %installed) {
next if $todo{$mod};
print "Uninstalling $mod $installed{$mod}\n";
}
$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->content;
+ close(MF);
print " - done\n";
} else {
- print " - HTTP $stat\n";
+ printf "\nHTTP %s: %s\n", $response->code, $response->message;
}
}
# write database of installed versions
-open SRC, '>.modulemanager' or die "can't write installed versions to .modulemanager, won't be able to track upgrades properly: $!";
-foreach my $key (keys %mod_versions)
-{
- print SRC "$key $mod_versions{$key}\n";
-}
-close SRC;
+write_config_file '.modulemanager', %mod_versions;
print "Finished!\n";