X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=scripts%2Finstallation_check.pl;h=33fd7ca73da5c510f2cdda1800515c166cb018cd;hb=30b4a78c4100ebdcd6e6917fbcbf1d12f4f7b4d6;hp=6a558ab2a96a81fcbcd2772c2e691d1daccbc9c9;hpb=a79735891c828f6eb91645067b2568407f4659de;p=kivitendo-erp.git diff --git a/scripts/installation_check.pl b/scripts/installation_check.pl index 6a558ab2a..33fd7ca73 100755 --- a/scripts/installation_check.pl +++ b/scripts/installation_check.pl @@ -1,60 +1,273 @@ #!/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. + + # 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 List::MoreUtils qw(uniq); use Pod::Usage; use Term::ANSIColor; +use Text::Wrap; -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. +unless (eval { require Config::Std; 1 }){ + print STDERR < \ my $v, - "all" => \ my $a, - "optional!" => \ my $o, - "devel!" => \ my $d, - "required!" => \ ( my $r = 1 ), - "help" => sub { pod2usage(-verbose => 2) }, - "color" => \ ( my $c = 1 ), + "v|verbose" => \ my $v, + "a|all" => \ $check{a}, + "o|optional!" => \ $check{o}, + "d|devel!" => \ $check{d}, + "l|latex!" => \ $check{l}, + "r|required!" => \ $check{r}, + "h|help" => sub { pod2usage(-verbose => 2) }, + "c|color!" => \ ( my $c = 1 ), + "i|install-command!" => \ my $apt, + "s|silent" => \ $check{s}, ); -$d = $r = $o = 1 if $a; +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" +my $default_run; +if (!defined $check{a} + && !defined $check{l} + && !defined $check{o} + && !defined $check{d}) { + $check{r} = 1; + $default_run ='1'; # no parameter, therefore print a note after default run +} + +if ($check{a}) { + $check{$_} //= 1 for qw(o d l r); +} + $| = 1; -if ($r) { - check($_, required => 1) for @SL::InstallationCheck::required_modules; +if (!SL::LxOfficeConf->read(undef, 'may fail')) { + print_header('Could not load the config file. If you have dependencies from any features enabled in the configuration these will still show up as optional because of this. Please rerun this script after installing the dependencies needed to load the configuration.') +} else { + SL::InstallationCheck::check_for_conditional_dependencies(); +} + +if ($check{r}) { + print_header('Checking Required Modules'); + check_module($_, required => 1) for @SL::InstallationCheck::required_modules; + check_pdfinfo(); } -if ($o) { - check($_, optional => 1) for @SL::InstallationCheck::optional_modules; +if ($check{o}) { + print_header('Checking Optional Modules'); + check_module($_, optional => 1) for @SL::InstallationCheck::optional_modules; } -if ($d) { - check($_, devel => 1) for @SL::InstallationCheck::developer_modules; +if ($check{d}) { + print_header('Checking Developer Modules'); + check_module($_, devel => 1) for @SL::InstallationCheck::developer_modules; } +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 dependencies, 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 { +sub check_latex { + my ($res) = check_kpsewhich(); + print_result("Looking for LaTeX kpsewhich", $res); + + # no pdfx -> no zugferd possible + my $ret = kpsewhich('template/print/', 'sty', 'pdfx'); + die "Cannot use pdfx. Please install this package first (debian: apt install texlive-latex-extra)" if $ret; + # check version 2018 + my $latex = $::lx_office_conf{applications}->{latex} || 'pdflatex'; + my $pdfx = (system ${latex} . ' --interaction=batchmode "\documentclass{minimal} \RequirePackage{pdfx} \csname @ifpackagelater\endcsname{pdfx}{2018/12/22}{}{\show\relax} \begin{document} \end{document}"'); + + print_result ("Looking for pdfx version 2018 or higher", !$pdfx); + push @missing_modules, \(name => 'pdfx') if $pdfx; + + if ($res) { + check_template_dir($_) for SL::InstallationCheck::template_dirs($master_templates); + } + print STDERR < /dev/null|); + my $res = $exit > 0 ? 0 : 1; + + print_result("Looking for LaTeX $type_desc $package", $res); + if (!$res) { + print STDERR <&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_module { my ($module, %role) = @_; my $line = "Looking for $module->{fullname}"; - print $line; - my $res = SL::InstallationCheck::module_available($module->{"name"}, $module->{version}); - print dot_pad(length $line, $res ? 2 : 6, $res ? mycolor("ok", 'green') : mycolor("NOT ok", 'red')), $/; + $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'; + print_line($line, $ver_string, 'green'); + } else { + print_result($line, $res); + } + 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.' - : 'It is not listed as a dependancy yet. Please tell this the 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 dependency yet. Please tell this the developers.'; - my @source_texts = source_texts($module); + my @source_texts = module_source_texts($module); local $" = $/; - print STDERR <{fullname} could not be loaded. @@ -68,23 +281,20 @@ sub check { EOL } -sub source_texts { +sub module_source_texts { my ($module) = @_; my @texts; - push @texts, <{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, <{url}; - You can download it from this URL and install it manually: $module->{url} EOL - push @texts, <{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; } @@ -94,12 +304,25 @@ sub mycolor { return colored(@_); } -sub dot_pad { - my ($s, $l, $text) = @_; - print " "; - print '.' x (80 - $s - 2 - $l); - print " "; - return $text; +sub print_result { + my ($test, $exit) = @_; + if ($exit) { + print_line($test, 'ok', 'green'); + } else { + print_line($test, 'NOT ok', 'red'); + } +} + +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]:", $/; } 1; @@ -110,7 +333,7 @@ __END__ =head1 NAME -scripts/installation_check.pl - check Lx-Office dependancies +scripts/installation_check.pl - check kivitendo dependencies =head1 SYNOPSIS @@ -118,21 +341,35 @@ scripts/installation_check.pl - check Lx-Office dependancies =head1 DESCRIPTION -List all modules needed by Lx-Office, probes for them, and warns if one is not available. +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 kivitendo master templates, probes for them, and warns if +one is not available. + + +=head1 OPTIONS =over 4 =item C<-a, --all> -Probe for all modules. +Probe for all perl modules and all LaTeX master templates. =item C<-c, --color> Color output. Default on. +=item C<--no-color> + +No color output. Helpful to avoid terminal escape problems. + =item C<-d, --devel> -Probe for developer dependancies. (Used for console and tags file) +Probe for perl developer dependencies. (Used for console and tags file) + +=item C<--no-devel> + +Don't probe for perl developer dependencies. (Useful in combination with --all) =item C<-h, --help> @@ -142,13 +379,35 @@ Display this help. Probe for optional modules. +=item C<--no-optional> + +Don't probe for optional perl modules. (Useful in combination with --all) + =item C<-r, --required> -Probe for required modules (default). +Probe for required perl modules (default). + +=item C<--no-required> + +Don't probe for required perl modules. (Useful in combination with --all) + +=item C<-l. --latex> + +Probe for LaTeX documentclasses and packages in master templates. + +=item C<--no-latex> + +Don't probe for LaTeX document classes and packages in master templates. (Useful in combination with --all) =item C<-v. --verbose> -Print additional info for modules that are missing +Print additional info for missing dependencies + +=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 @@ -178,5 +437,6 @@ Version requirements not fully tested yet. Moritz Bunkus Em.bunkus@linet-services.deE Sven Schöling Es.schoeling@linet-services.deE + Wulf Coulmann Ewulf@coulmann.deE =cut