WebshopApi: File upload Übersetzungen
[kivitendo-erp.git] / scripts / installation_check.pl
index a50d184..48d78ea 100755 (executable)
@@ -1,21 +1,47 @@
 #!/usr/bin/perl -w
 
+our $master_templates;
+BEGIN {
+  use FindBin;
+
+  unshift(@INC, $FindBin::Bin . '/../modules/override'); # Use our own versions of various modules (e.g. YAML).
+  push   (@INC, $FindBin::Bin . '/..');                  # '.' will be removed from @INC soon.
+  push   (@INC, $FindBin::Bin . '/../modules/fallback'); # Only use our own versions of modules if there's no system version.
+
+  # this is a default dir. may be wrong in your installation, change it then
+  $master_templates = $FindBin::Bin . '/../templates/print/';
+}
+
 use strict;
 use Getopt::Long;
 use Pod::Usage;
 use Term::ANSIColor;
-our $master_templates;
-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.
+use Text::Wrap;
 
-  # this is a default dir. may be wrong in your installation, change it then
-  $master_templates = './templates/print/';
+unless (eval { require Config::Std; 1 }){
+  print STDERR <<EOL ;
++------------------------------------------------------------------------------+
+  Perl Modul Config::Std could not be loaded.
+
+  Debian: you may install the needed *.deb package with:
+    apt-get install libconfig-std-perl
+
+  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:
+    zypper install perl-Config-Std
+
++------------------------------------------------------------------------------+
+EOL
+
+  exit 72;
 }
 
 use SL::InstallationCheck;
 use SL::LxOfficeConf;
 
+my @missing_modules;
 my %check;
 Getopt::Long::Configure ("bundling");
 GetOptions(
@@ -27,6 +53,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 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"
@@ -40,16 +75,14 @@ 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);
 }
 
 
 $| = 1;
 
 if (!SL::LxOfficeConf->read(undef, 'may fail')) {
-  print_header('Could not load the config file. If you have dependancies from any features enabled in the configuration these will still show up as optional because of this. Please rerun this script after installing the dependancies needed to load the cofiguration.')
+  print_header('Could not load the config file. If you have dependancies from any features enabled in the configuration these will still show up as optional because of this. Please rerun this script after installing the dependancies needed to load the configuration.')
 } else {
   SL::InstallationCheck::check_for_conditional_dependencies();
 }
@@ -57,11 +90,12 @@ 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;
+  check_pdfinfo();
 }
 if ($check{o}) {
   print_header('Checking Optional Modules');
   check_module($_, optional => 1) for @SL::InstallationCheck::optional_modules;
+  check_aqbanking();
 }
 if ($check{d}) {
   print_header('Checking Developer Modules');
@@ -71,6 +105,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);
@@ -93,7 +165,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"
@@ -117,7 +189,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.
 
@@ -131,10 +203,46 @@ EOL
   }
 }
 
+sub check_pdfinfo {
+  my $line = "Looking for pdfinfo executable";
+  my $shell_out = `pdfinfo -v 2>&1 | grep version 2> /dev/null`;
+  my ($label,$vers,$ver_string)  = split / /,$shell_out;
+  if ( $label && $label eq 'pdfinfo' ) {
+    chop $ver_string;
+    print_line($line, $ver_string, 'green');
+  } else {
+    print_line($line, 'not installed','red');
+    my %modinfo = ( debian => 'poppler-utils' );
+    push @missing_modules, \%modinfo;
+
+  }
+}
+
+sub check_aqbanking {
+  my $aqbin = $::lx_office_conf{applications}->{aqbanking};
+  if ( !$aqbin ) {
+    print_line('Looking for aqbanking executable', 'not configured','red');
+  }
+  else {
+    my $line = "Looking for aqbanking executable '".$aqbin."'";
+    my $shell_out = `$aqbin versions 2>&1 | grep AqBanking-CLI 2> /dev/null`;
+    my ($label,$version)  = split /:/,$shell_out;
+    if ( $label && $label eq ' AqBanking-CLI' ) {
+      chop $version;
+      print_line($line, $version, 'green');
+    } else {
+      print_line($line, 'not installed','red');
+      my %modinfo = ( name => 'aqbanking' );
+      push @missing_modules, \%modinfo;
+    }
+  }
+}
+
 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';
@@ -146,15 +254,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.
 
@@ -171,20 +281,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;
 }
@@ -205,10 +312,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]:", $/;
 }
@@ -221,7 +330,7 @@ __END__
 
 =head1 NAME
 
-scripts/installation_check.pl - check Lx-Office dependancies
+scripts/installation_check.pl - check kivitendo dependancies
 
 =head1 SYNOPSIS
 
@@ -229,9 +338,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.
 
 
@@ -291,6 +400,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