Mehrere Fehler behoben und Texte leichter lesbar gemacht.
authorSven Schöling <s.schoeling@linet-services.de>
Thu, 26 Aug 2010 14:47:39 +0000 (16:47 +0200)
committerSven Schöling <s.schoeling@linet-services.de>
Thu, 2 Sep 2010 16:00:46 +0000 (18:00 +0200)
- require kann keine Versionierung, also muss das mit use gemacht werden.
- eval + defined Bugs durch idiomatischere Konstrukte ersetzt.
- gefühlte 500 Zeilen IO::File Code durch ein idiomatisches slurp ersetzt.
- Die Meldungen wenn ein Paket nicht gefunden wurden sind jetzt mit einem
  freundlichen Kasten umrahmt, und damit in der Textmasse einfacher
  auszumachen.
- Es können jetzt mehrere Sourcen an die module Definition angehängt werden.

SL/InstallationCheck.pm
scripts/installation_check.pl

index 52569a4..2997063 100644 (file)
@@ -7,9 +7,10 @@ use vars qw(@required_modules @optional_modules);
 
 use strict;
 
+BEGIN {
 @required_modules = (
   { name => "parent",                              url => "http://search.cpan.org/~corion/" },
-  { name => "Archive::Zip",                        url => "http://search.cpan.org/~adamk/" },
+  { name => "Archive::Zip",   version => 12,       url => "http://search.cpan.org/~adamk/" },
   { name => "Class::Accessor",                     url => "http://search.cpan.org/~kasei/" },
   { name => "CGI::Ajax",                           url => "http://search.cpan.org/~bct/" },
   { name => "DateTime",                            url => "http://search.cpan.org/~drolsky/" },
@@ -30,43 +31,27 @@ use strict;
 
 @optional_modules = ();
 
+$_->{fullname} = join ' ', grep $_, @$_{qw(name version)}
+  for @required_modules, @optional_modules;
+}
+
 sub module_available {
   my $module  = $_[0];
   my $version = $_[1] || '' ;
 
-  if (!defined(eval("require $module $version;"))) {
-    return 0;
-  } else {
-    return 1;
-  }
+  return eval "use $module $version; 1";
 }
 
 my %conditional_dependencies;
 
 sub check_for_conditional_dependencies {
-  if (!$conditional_dependencies{net_ldap}) {
-    $conditional_dependencies{net_ldap} = 1;
-
-    my $in = IO::File->new('config/authentication.pl', 'r');
-    if ($in) {
-      my $self = {};
-      my $code;
-
-      while (my $line = <$in>) {
-        $code .= $line;
-      }
-      $in->close();
-
-      eval $code;
+  return if $conditional_dependencies{net_ldap}++;
 
-      if (! $EVAL_ERROR) {
+  my $self = {};
+  eval do { local (@ARGV, $/) = 'config/authentication.pl'; <> } or return;
 
-        if ($self->{module} && ($self->{module} eq 'LDAP')) {
-          push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' };
-        }
-      }
-    }
-  }
+  push @required_modules, { 'name' => 'Net::LDAP', 'url' => 'http://search.cpan.org/~gbarr/' }
+    if $self->{module} && ($self->{module} eq 'LDAP');
 }
 
 sub test_all_modules {
index 6eca871..0e6a6c5 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/perl -w
 
+use strict;
+
 BEGIN {
   unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
   push    @INC, "modules/fallback"; # Only use our own versions of modules if there's no system version.
@@ -9,36 +11,55 @@ use SL::InstallationCheck;
 
 $| = 1;
 
-foreach my $module (@SL::InstallationCheck::required_modules) {
-  if ($module->{version}) {
-    print("Looking for $module->{name} $module->{version}...");
-  } else {
-    print("Looking for $module->{name}...");
-  }
-  if (!SL::InstallationCheck::module_available($module->{"name"})) {
-    print(" NOT found\n" .
-          "  The module '$module->{name}' is not available on your system.\n" .
-          "  Please install it with the CPAN shell, e.g.\n" .
-          "    perl -MCPAN -e \"install $module->{name}\"\n" .
-          "  or download it from this URL and install it manually:\n" .
-          "    $module->{url}\n\n");
-  } else {
-    print(" ok\n");
-  }
+check($_, 0) for @SL::InstallationCheck::required_modules;
+check($_, 1) for @SL::InstallationCheck::optional_modules;
+
+sub check {
+  my ($module, $optional) = @_;
+
+  print "Looking for $module->{fullname}...";
+  my $res = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
+  print $res ? '' : " NOT", " ok\n";
+
+  return if $res;
+
+  my $needed_text = $optional
+    ? 'It is OPTIONAL for Lx-Office but recommended for improved functionality.'
+    : 'It is NEEDED by Lx-Office and must be installed.';
+
+  my @source_texts = source_texts($module);
+  local $" = $/;
+  print <<EOL;
++-----------------------------------------------------------------------------+
+  $module->{fullname} could not be loaded.
+
+  This module is either too old or not available on your system.
+  $needed_text
+
+  Here are some ideas how to get it:
+
+@source_texts
++-----------------------------------------------------------------------------+
+EOL
 }
 
-foreach my $module (@SL::InstallationCheck::optional_modules) {
-  print("Looking for $module->{name} (optional)...");
-  if (!SL::InstallationCheck::module_available($module->{"name"})) {
-    print(" NOT found\n" .
-          "  The module '$module->{name}' is not available on your system.\n" .
-          "  While it is not strictly needed it provides extra functionality\n" .
-          "  and should be installed.\n" .
-          "  You can install it with the CPAN shell, e.g.\n" .
-          "    perl -MCPAN -e \"install $module->{name}\"\n" .
-          "  or download it from this URL and install it manually:\n" .
-          "    $module->{url}\n\n");
-  } else {
-    print(" ok\n");
-  }
+sub source_texts {
+  my ($module) = @_;
+  my @texts;
+  push @texts, <<EOL;
+  - You can get it from CPAN:
+      perl -MCPAN -e "install $module->{name}"
+EOL
+  push @texts, <<EOL if $module->{url};
+  - You can download it from this URL and install it manually:
+      $module->{url}
+EOL
+  push @texts, <<EOL if $module->{debian};
+  - On Debian, Ubuntu and other distros you can install it with apt-get:
+      sudo apt-get install $module->{debian}
+    Note these may be out of date as well if you system is old.
+EOL
+ # TODO: SuSE and Fedora packaging. Windows packaging.
+
+  return @texts;
 }