X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=modulemanager;h=0d92f1f7d4979ca2ab6fdca14fbb027807e76e3b;hb=e94b673532f7833aaa4789f834e61d68e0b4fc56;hp=9f9c0334415c59e9fbaf68bd85611ff5cae55b83;hpb=5c88e3df25dde6aa6ff849263a79ffda6144cf4d;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/modulemanager b/modulemanager index 9f9c03344..0d92f1f7d 100755 --- a/modulemanager +++ b/modulemanager @@ -1,9 +1,10 @@ #!/usr/bin/env perl - # # InspIRCd -- Internet Relay Chat Daemon # -# Copyright (C) 2012-2017 Peter Powell +# Copyright (C) 2012-2014, 2017-2021 Sadie Powell +# Copyright (C) 2012 Robby +# Copyright (C) 2010 Daniel De Graaf # Copyright (C) 2008-2009 Robin Burchell # # This file is part of InspIRCd. InspIRCd is free software: you can @@ -20,11 +21,6 @@ # -use strict; -use warnings FATAL => qw(all); - -use make::common; - BEGIN { unless (eval "use LWP::Simple; 1") { die "Your system is missing the LWP::Simple Perl module!"; @@ -32,11 +28,18 @@ BEGIN { 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 File::Basename; -use LWP::Simple; +use v5.10.0; +use strict; +use warnings FATAL => qw(all); + +use File::Basename qw(basename); +use FindBin qw($RealDir); + +use lib $RealDir; +use make::common; +use make::console; my %installed; # $installed{name} = $version @@ -61,7 +64,7 @@ sub parse_url { return if $url_seen{$src}; $url_seen{$src}++; - my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 }); + my $ua = LWP::UserAgent->new; my $response = $ua->get($src); unless ($response->is_success) { @@ -70,7 +73,7 @@ sub parse_url { } my $mod; - for (split /\n+/, $response->decoded_content) { + for (split /\n+/, $response->content) { s/^\s+//; # ignore whitespace at start next if /^#/; if (/^module (\S+) (\S+) (\S+)/) { @@ -94,16 +97,14 @@ sub parse_url { $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 = read_config_file '.modulemanager'; +my %mod_versions = read_config_file "$RealDir/.modulemanager"; # useless helper stub sub getmodversion { @@ -112,7 +113,7 @@ sub getmodversion { } # read in external URL sources -open SRC, 'sources.list' or die "Could not open sources.list: $!"; +open SRC, "$RealDir/sources.list" or die "Could not open sources.list: $!"; while () { next if /^\s*#/; parse_url($_); @@ -120,8 +121,8 @@ while () { close SRC; # determine core version -`./src/version.sh` =~ /InspIRCd-([0-9.]+)/ or die "Cannot determine inspircd version"; -$installed{core} = $1; +my %version = get_version(); +$installed{core} = "$version{MAJOR}.$version{MINOR}.$version{PATCH}"; for my $mod (keys %modules) { MODVER: for my $mver (keys %{$modules{$mod}}) { for my $dep (@{$modules{$mod}{$mver}{depends}}) { @@ -134,7 +135,7 @@ for my $mod (keys %modules) { } delete $modules{$mod} unless %{$modules{$mod}}; } -$modules{core}{$1} = { +$modules{core}{$installed{core}} = { url => 'NONE', depends => [], conflicts => [], @@ -142,7 +143,7 @@ $modules{core}{$1} = { }; # set up core module list -for my $modname () { +for my $modname (<$RealDir/src/modules/m_*.cpp>) { my $mod = basename($modname, '.cpp'); my $ver = getmodversion($mod) || '0.0'; $ver =~ s/\$Rev: (.*) \$/$1/; # for storing revision in SVN @@ -250,10 +251,8 @@ sub resolve_deps { } } -my $action = $#ARGV >= 0 ? lc shift @ARGV : 'help'; - -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}) { @@ -267,7 +266,9 @@ if ($action eq 'install') { } $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_/; @@ -277,7 +278,9 @@ if ($action eq 'install') { %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}}; @@ -291,29 +294,20 @@ if ($action eq 'install') { my $vers = join ' ', map { $_ eq $instver ? "\e[1m$_\e[m" : $_ } @vers; print "$mod ($vers) - $desc\n"; } -} else { - print < -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"; - unlink "src/modules/$mod.cpp"; + unlink "$RealDir/src/modules/$mod.cpp"; } my $count = scalar keys %todo; @@ -337,8 +331,8 @@ for my $mod (sort keys %todo) { 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; + open(MF, '>', "$RealDir/src/modules/$mod.cpp") or die "\nFilesystem not writable: $!"; + print MF $response->content; close(MF); print " - done\n"; } else { @@ -347,6 +341,6 @@ for my $mod (sort keys %todo) { } # write database of installed versions -write_config_file '.modulemanager', %mod_versions; +write_config_file "$RealDir/.modulemanager", %mod_versions; print "Finished!\n";