Erste Version migrate_menu
[kivitendo-erp.git] / scripts / installation_check.pl
index 2bec003..43b290a 100755 (executable)
@@ -4,6 +4,7 @@ use strict;
 use Getopt::Long;
 use Pod::Usage;
 use Term::ANSIColor;
+use Text::Wrap;
 our $master_templates;
 BEGIN {
   unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
@@ -21,9 +22,10 @@ unless (eval { require Config::Std; 1 }){
   Debian: you may install the needed *.deb package with:
     apt-get install libconfig-std-perl
 
-  RPM: There is a rpm package "perl-Config-Std"
+  Red Hat/Fedora/CentOS: you may install the needed *.rpm package with:
+    yum install perl-Config-Std
 
-  Suse: you may install the needed *.rpm package with:
+  SUSE: you may install the needed *.rpm package with:
     zypper install perl-Config-Std
 
 +------------------------------------------------------------------------------+
@@ -35,7 +37,7 @@ EOL
 use SL::InstallationCheck;
 use SL::LxOfficeConf;
 
-
+my @missing_modules;
 my %check;
 Getopt::Long::Configure ("bundling");
 GetOptions(
@@ -47,6 +49,15 @@ GetOptions(
   "r|required!" => \ $check{r},
   "h|help"      => sub { pod2usage(-verbose => 2) },
   "c|color!"    => \ ( my $c = 1 ),
+  "i|install-command!"  => \ my $apt,
+  "s|silent"    => \ $check{s},
+);
+
+my %install_methods = (
+  apt    => { key => 'debian', install => 'sudo apt-get install', system => "Debian, Ubuntu" },
+  yum    => { key => 'fedora', install => 'sudo yum install',     system => "RHEL, Fedora, CentOS" },
+  zypper => { key => 'suse',   install => 'sudo zypper install',  system => "SLES, openSUSE" },
+  cpan   => { key => 'name',   install => "sudo cpan",            system => "CPAN" },
 );
 
 # if nothing is requested check "required"
@@ -60,9 +71,7 @@ if (!defined $check{a}
 }
 
 if ($check{a}) {
-  foreach my $check (keys %check) {
-    $check{$check} = 1 unless defined $check{$check};
-  }
+  $check{$_} //= 1 for qw(o d l r);
 }
 
 
@@ -77,7 +86,6 @@ if (!SL::LxOfficeConf->read(undef, 'may fail')) {
 if ($check{r}) {
   print_header('Checking Required Modules');
   check_module($_, required => 1) for @SL::InstallationCheck::required_modules;
-  print_header('Standard check for required modules done. See additional parameters for more checks (--help)') if $default_run;
 }
 if ($check{o}) {
   print_header('Checking Optional Modules');
@@ -91,6 +99,44 @@ if ($check{l}) {
   check_latex();
 }
 
+my $fail = @missing_modules;
+print_header('Result');
+print_line('All', $fail ? 'NOT ok' : 'OK', $fail ? 'red' : 'green');
+
+if ($default_run && !$check{s}) {
+  if (@missing_modules) {
+    $apt = 1;
+  print <<"EOL";
+
+HEY! It seems there are modules MISSING! Look for the red lines with "NOT ok"
+above. You'll want to fix those, I've enabled --install-command for you...
+EOL
+  } else {
+  print <<"EOL";
+
+Standard check done, everything is OK and up to date. Have a look at the --help
+section of this script to see some more advanced checks for developer and
+optional dependancies, as well as LaTeX packages you might need.
+EOL
+  }
+}
+
+if (@missing_modules && $apt && !$check{s}) {
+  print "\nHere are some sample installation lines, choose one appropriate for your system:\n\n";
+  local $Text::Wrap::separator = " \\\n";
+
+  for (keys %install_methods) {
+    my $method = $install_methods{$_};
+    if (my @install_candidates = grep $_, map { $_->{$method->{key}} } @missing_modules) {
+      print "$method->{system}:\n";
+      print wrap("  ", "    ",  $method->{install}, @install_candidates);
+      print $/;
+    }
+  }
+}
+
+exit !!@missing_modules;
+
 sub check_latex {
   my ($res) = check_kpsewhich();
   print_result("Looking for LaTeX kpsewhich", $res);
@@ -113,7 +159,7 @@ our $mastertemplate_path = './templates/print/';
 sub check_kpsewhich {
   return 1 if SL::InstallationCheck::check_kpsewhich();
 
-  print STDERR <<EOL if $v;
+  print STDERR <<EOL if $v && !$check{s};
 +------------------------------------------------------------------------------+
   Can't find kpsewhich, is there a proper installed LaTeX?
   On Debian you may run "aptitude install texlive-base-bin"
@@ -137,7 +183,7 @@ sub kpsewhich {
 
   print_result("Looking for LaTeX $type_desc $package", $res);
   if (!$res) {
-    print STDERR <<EOL if $v;
+    print STDERR <<EOL if $v && !$check{s};
 +------------------------------------------------------------------------------+
   LaTeX $type_desc $package could not be loaded.
 
@@ -155,6 +201,7 @@ sub check_module {
   my ($module, %role) = @_;
 
   my $line = "Looking for $module->{fullname}";
+  $line   .= " (from $module->{dist_name})" if $module->{dist_name};
   my ($res, $ver) = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
   if ($res) {
     my $ver_string = ref $ver && $ver->can('numify') ? $ver->numify : $ver ? $ver : 'no version';
@@ -166,15 +213,17 @@ sub check_module {
 
   return if $res;
 
+  push @missing_modules, $module;
+
   my $needed_text =
-      $role{optional} ? 'It is OPTIONAL for Lx-Office but RECOMMENDED for improved functionality.'
-    : $role{required} ? 'It is NEEDED by Lx-Office and must be installed.'
-    : $role{devel}    ? 'It is OPTIONAL for Lx-Office and only useful for developers.'
+      $role{optional} ? 'It is OPTIONAL for kivitendo but RECOMMENDED for improved functionality.'
+    : $role{required} ? 'It is NEEDED by kivitendo and must be installed.'
+    : $role{devel}    ? 'It is OPTIONAL for kivitendo and only useful for developers.'
     :                   'It is not listed as a dependancy yet. Please tell this the developers.';
 
   my @source_texts = module_source_texts($module);
   local $" = $/;
-  print STDERR <<EOL if $v;
+  print STDERR <<EOL if $v && !$check{s};
 +------------------------------------------------------------------------------+
   $module->{fullname} could not be loaded.
 
@@ -191,20 +240,17 @@ EOL
 sub module_source_texts {
   my ($module) = @_;
   my @texts;
-  push @texts, <<EOL;
-  - You can get it from CPAN:
-      perl -MCPAN -e "install $module->{name}"
+  for my $key (keys %install_methods) {
+    my $method = $install_methods{$key};
+    push @texts, <<"EOL" if $module->{$method->{key}};
+  - Using $method->{system} you can install it with $key:
+      $method->{install} $module->{$method->{key}}
 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 your system is old.
-EOL
- # TODO: SuSE and Fedora packaging. Windows packaging.
 
   return @texts;
 }
@@ -225,10 +271,12 @@ sub print_result {
 
 sub print_line {
   my ($text, $res, $color) = @_;
+  return if $check{s};
   print $text, " ", ('.' x (78 - length($text) - length($res))), " ", mycolor($res, $color), $/;
 }
 
 sub print_header {
+  return if $check{s};
   print $/;
   print "$_[0]:", $/;
 }
@@ -241,7 +289,7 @@ __END__
 
 =head1 NAME
 
-scripts/installation_check.pl - check Lx-Office dependancies
+scripts/installation_check.pl - check kivitendo dependancies
 
 =head1 SYNOPSIS
 
@@ -249,9 +297,9 @@ scripts/installation_check.pl - check Lx-Office dependancies
 
 =head1 DESCRIPTION
 
-Check dependencys. List all perl modules needed by Lx-Office, probes for them,
+Check dependencys. List all perl modules needed by kivitendo, probes for them,
 and warns if one is not available.  List all LaTeX document classes and
-packages needed by Lx-Office master templates, probes for them, and warns if
+packages needed by kivitendo master templates, probes for them, and warns if
 one is not available.
 
 
@@ -311,6 +359,12 @@ Don't probe for LaTeX document classes and packages in master templates. (Useful
 
 Print additional info for missing dependancies
 
+=item C<-i, --install-command>
+
+Tries to generate installation commands for the most common package managers.
+Note that these lists can be slightly off, but it should still save you a lot
+of typing.
+
 =back
 
 =head1 BUGS, CAVEATS and TODO