7   unshift(@INC, $FindBin::Bin . '/../modules/override'); # Use our own versions of various modules (e.g. YAML).
 
   8   push   (@INC, $FindBin::Bin . '/..');                  # '.' will be removed from @INC soon.
 
   9   push   (@INC, $FindBin::Bin . '/../modules/fallback'); # Only use our own versions of modules if there's no system version.
 
  11   # this is a default dir. may be wrong in your installation, change it then
 
  12   $master_templates = $FindBin::Bin . '/../templates/print/';
 
  21 unless (eval { require Config::Std; 1 }){
 
  23 +------------------------------------------------------------------------------+
 
  24   Perl Modul Config::Std could not be loaded.
 
  26   Debian: you may install the needed *.deb package with:
 
  27     apt-get install libconfig-std-perl
 
  29   Red Hat/Fedora/CentOS: you may install the needed *.rpm package with:
 
  30     yum install perl-Config-Std
 
  32   SUSE: you may install the needed *.rpm package with:
 
  33     zypper install perl-Config-Std
 
  35 +------------------------------------------------------------------------------+
 
  41 use SL::InstallationCheck;
 
  46 Getopt::Long::Configure ("bundling");
 
  48   "v|verbose"   => \ my $v,
 
  49   "a|all"       => \ $check{a},
 
  50   "o|optional!" => \ $check{o},
 
  51   "d|devel!"    => \ $check{d},
 
  52   "l|latex!"    => \ $check{l},
 
  53   "r|required!" => \ $check{r},
 
  54   "h|help"      => sub { pod2usage(-verbose => 2) },
 
  55   "c|color!"    => \ ( my $c = 1 ),
 
  56   "i|install-command!"  => \ my $apt,
 
  57   "s|silent"    => \ $check{s},
 
  60 my %install_methods = (
 
  61   apt    => { key => 'debian', install => 'sudo apt-get install', system => "Debian, Ubuntu" },
 
  62   yum    => { key => 'fedora', install => 'sudo yum install',     system => "RHEL, Fedora, CentOS" },
 
  63   zypper => { key => 'suse',   install => 'sudo zypper install',  system => "SLES, openSUSE" },
 
  64   cpan   => { key => 'name',   install => "sudo cpan",            system => "CPAN" },
 
  67 # if nothing is requested check "required"
 
  69 if (!defined $check{a}
 
  72  && !defined $check{d}) {
 
  74   $default_run ='1';  # no parameter, therefore print a note after default run
 
  78   $check{$_} //= 1 for qw(o d l r);
 
  84 if (!SL::LxOfficeConf->read(undef, 'may fail')) {
 
  85   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.')
 
  87   SL::InstallationCheck::check_for_conditional_dependencies();
 
  91   print_header('Checking Required Modules');
 
  92   check_module($_, required => 1) for @SL::InstallationCheck::required_modules;
 
  96   print_header('Checking Optional Modules');
 
  97   check_module($_, optional => 1) for @SL::InstallationCheck::optional_modules;
 
 101   print_header('Checking Developer Modules');
 
 102   check_module($_, devel => 1) for @SL::InstallationCheck::developer_modules;
 
 108 my $fail = @missing_modules;
 
 109 print_header('Result');
 
 110 print_line('All', $fail ? 'NOT ok' : 'OK', $fail ? 'red' : 'green');
 
 112 if ($default_run && !$check{s}) {
 
 113   if (@missing_modules) {
 
 117 HEY! It seems there are modules MISSING! Look for the red lines with "NOT ok"
 
 118 above. You'll want to fix those, I've enabled --install-command for you...
 
 123 Standard check done, everything is OK and up to date. Have a look at the --help
 
 124 section of this script to see some more advanced checks for developer and
 
 125 optional dependancies, as well as LaTeX packages you might need.
 
 130 if (@missing_modules && $apt && !$check{s}) {
 
 131   print "\nHere are some sample installation lines, choose one appropriate for your system:\n\n";
 
 132   local $Text::Wrap::separator = " \\\n";
 
 134   for (keys %install_methods) {
 
 135     my $method = $install_methods{$_};
 
 136     if (my @install_candidates = grep $_, map { $_->{$method->{key}} } @missing_modules) {
 
 137       print "$method->{system}:\n";
 
 138       print wrap("  ", "    ",  $method->{install}, @install_candidates);
 
 144 exit !!@missing_modules;
 
 147   my ($res) = check_kpsewhich();
 
 148   print_result("Looking for LaTeX kpsewhich", $res);
 
 150     check_template_dir($_) for SL::InstallationCheck::template_dirs($master_templates);
 
 154 sub check_template_dir {
 
 156   my $path  = $master_templates . $dir;
 
 158   print_header("Checking LaTeX Dependencies for Master Templates '$dir'");
 
 159   kpsewhich($path, 'cls', $_) for SL::InstallationCheck::classes_from_latex($path, '\documentclass');
 
 160   kpsewhich($path, 'sty', $_) for SL::InstallationCheck::classes_from_latex($path, '\usepackage');
 
 163 our $mastertemplate_path = './templates/print/';
 
 165 sub check_kpsewhich {
 
 166   return 1 if SL::InstallationCheck::check_kpsewhich();
 
 168   print STDERR <<EOL if $v && !$check{s};
 
 169 +------------------------------------------------------------------------------+
 
 170   Can't find kpsewhich, is there a proper installed LaTeX?
 
 171   On Debian you may run "aptitude install texlive-base-bin"
 
 172 +------------------------------------------------------------------------------+
 
 178   my ($dw, $type, $package) = @_;
 
 179   $package =~ s/[^-_0-9A-Za-z]//g;
 
 180   my $type_desc = $type eq 'cls' ? 'document class' : 'package';
 
 182   eval { use String::ShellQuote; 1 } or warn "can't load String::ShellQuote" && return;
 
 183      $dw         = shell_quote $dw;
 
 184   my $e_package  = shell_quote $package;
 
 185   my $e_type     = shell_quote $type;
 
 187   my $exit = system(qq|TEXINPUTS=".:$dw:" kpsewhich $e_package.$e_type > /dev/null|);
 
 188   my $res  = $exit > 0 ? 0 : 1;
 
 190   print_result("Looking for LaTeX $type_desc $package", $res);
 
 192     print STDERR <<EOL if $v && !$check{s};
 
 193 +------------------------------------------------------------------------------+
 
 194   LaTeX $type_desc $package could not be loaded.
 
 196   On Debian you may find the needed *.deb package with:
 
 197     apt-file search $package.$type
 
 199   Maybe you need to install apt-file first by:
 
 200     aptitude install apt-file && apt-file update
 
 201 +------------------------------------------------------------------------------+
 
 206   my $line = "Looking for pdfinfo executable";
 
 207   my $shell_out = `pdfinfo -v 2>&1 | grep version 2> /dev/null`;
 
 208   my ($label,$vers,$ver_string)  = split / /,$shell_out;
 
 209   if ( $label && $label eq 'pdfinfo' ) {
 
 210     print_line($line, $ver_string, 'green');
 
 212     print_line($line, 'not installed','red');
 
 213     my %modinfo = ( name => 'pdfinfo' );
 
 214     push @missing_modules, \%modinfo;
 
 220   my $line = "Looking for pdfinfo executable";
 
 221   my $shell_out = `pdfinfo -v 2>&1 | grep version 2> /dev/null`;
 
 222   my ($label,$vers,$ver_string)  = split / /,$shell_out;
 
 223   if ( $label && $label eq 'pdfinfo' ) {
 
 224     print_line($line, $ver_string, 'green');
 
 226     print_line($line, 'not installed','red');
 
 227     my %modinfo = ( name => 'pdfinfo' );
 
 228     push @missing_modules, \%modinfo;
 
 233 sub check_aqbanking {
 
 234   my $aqbin = $::lx_office_conf{applications}->{aqbanking};
 
 236     print_line('Looking for aqbanking executable', 'not configured','red');
 
 239     my $line = "Looking for aqbanking executable '".$aqbin."'";
 
 240     my $shell_out = `$aqbin versions 2>&1 | grep AqBanking-CLI 2> /dev/null`;
 
 241     my ($label,$version)  = split /:/,$shell_out;
 
 242     if ( $label && $label eq ' AqBanking-CLI' ) {
 
 244       print_line($line, $version, 'green');
 
 246       print_line($line, 'not installed','red');
 
 247       my %modinfo = ( name => 'aqbanking' );
 
 248       push @missing_modules, \%modinfo;
 
 254   my ($module, %role) = @_;
 
 256   my $line = "Looking for $module->{fullname}";
 
 257   $line   .= " (from $module->{dist_name})" if $module->{dist_name};
 
 258   my ($res, $ver) = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
 
 260     my $ver_string = ref $ver && $ver->can('numify') ? $ver->numify : $ver ? $ver : 'no version';
 
 261     print_line($line, $ver_string, 'green');
 
 263     print_result($line, $res);
 
 269   push @missing_modules, $module;
 
 272       $role{optional} ? 'It is OPTIONAL for kivitendo but RECOMMENDED for improved functionality.'
 
 273     : $role{required} ? 'It is NEEDED by kivitendo and must be installed.'
 
 274     : $role{devel}    ? 'It is OPTIONAL for kivitendo and only useful for developers.'
 
 275     :                   'It is not listed as a dependancy yet. Please tell this the developers.';
 
 277   my @source_texts = module_source_texts($module);
 
 279   print STDERR <<EOL if $v && !$check{s};
 
 280 +------------------------------------------------------------------------------+
 
 281   $module->{fullname} could not be loaded.
 
 283   This module is either too old or not available on your system.
 
 286   Here are some ideas how to get it:
 
 289 +------------------------------------------------------------------------------+
 
 293 sub module_source_texts {
 
 296   for my $key (keys %install_methods) {
 
 297     my $method = $install_methods{$key};
 
 298     push @texts, <<"EOL" if $module->{$method->{key}};
 
 299   - Using $method->{system} you can install it with $key:
 
 300       $method->{install} $module->{$method->{key}}
 
 303   push @texts, <<EOL if $module->{url};
 
 304   - You can download it from this URL and install it manually:
 
 312   return $_[0] unless $c;
 
 317   my ($test, $exit) = @_;
 
 319     print_line($test, 'ok', 'green');
 
 321     print_line($test, 'NOT ok', 'red');
 
 326   my ($text, $res, $color) = @_;
 
 328   print $text, " ", ('.' x (78 - length($text) - length($res))), " ", mycolor($res, $color), $/;
 
 345 scripts/installation_check.pl - check kivitendo dependancies
 
 349   scripts/installation_check.pl [OPTION]
 
 353 Check dependencys. List all perl modules needed by kivitendo, probes for them,
 
 354 and warns if one is not available.  List all LaTeX document classes and
 
 355 packages needed by kivitendo master templates, probes for them, and warns if
 
 356 one is not available.
 
 365 Probe for all perl modules and all LaTeX master templates.
 
 369 Color output. Default on.
 
 373 No color output. Helpful to avoid terminal escape problems.
 
 377 Probe for perl developer dependancies. (Used for console  and tags file)
 
 381 Don't probe for perl developer dependancies. (Useful in combination with --all)
 
 387 =item C<-o, --optional>
 
 389 Probe for optional modules.
 
 391 =item C<--no-optional>
 
 393 Don't probe for optional perl modules. (Useful in combination with --all)
 
 395 =item C<-r, --required>
 
 397 Probe for required perl modules (default).
 
 399 =item C<--no-required>
 
 401 Don't probe for required perl modules. (Useful in combination with --all)
 
 405 Probe for LaTeX documentclasses and packages in master templates.
 
 409 Don't probe for LaTeX document classes and packages in master templates. (Useful in combination with --all)
 
 411 =item C<-v. --verbose>
 
 413 Print additional info for missing dependancies
 
 415 =item C<-i, --install-command>
 
 417 Tries to generate installation commands for the most common package managers.
 
 418 Note that these lists can be slightly off, but it should still save you a lot
 
 423 =head1 BUGS, CAVEATS and TODO
 
 429 Fedora packages not listed yet.
 
 433 Not possible yet to generate a combined cpan/apt-get string to install all needed.
 
 437 Not able to handle devel cpan modules yet.
 
 441 Version requirements not fully tested yet.
 
 447   Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
 
 448   Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
 
 449   Wulf Coulmann E<lt>wulf@coulmann.deE<gt>