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.
10 # this is a default dir. may be wrong in your installation, change it then
11 $master_templates = $FindBin::Bin . '/../templates/print/';
16 use List::MoreUtils qw(uniq);
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 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 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.')
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;
100 print_header('Checking Developer Modules');
101 check_module($_, devel => 1) for @SL::InstallationCheck::developer_modules;
107 my $fail = @missing_modules;
108 print_header('Result');
109 print_line('All', $fail ? 'NOT ok' : 'OK', $fail ? 'red' : 'green');
111 if ($default_run && !$check{s}) {
112 if (@missing_modules) {
116 HEY! It seems there are modules MISSING! Look for the red lines with "NOT ok"
117 above. You'll want to fix those, I've enabled --install-command for you...
122 Standard check done, everything is OK and up to date. Have a look at the --help
123 section of this script to see some more advanced checks for developer and
124 optional dependencies, as well as LaTeX packages you might need.
129 if (@missing_modules && $apt && !$check{s}) {
130 print "\nHere are some sample installation lines, choose one appropriate for your system:\n\n";
131 local $Text::Wrap::separator = " \\\n";
133 for (keys %install_methods) {
134 my $method = $install_methods{$_};
135 if (my @install_candidates = grep $_, map { $_->{$method->{key}} } @missing_modules) {
136 print "$method->{system}:\n";
137 print wrap(" ", " ", $method->{install}, @install_candidates);
143 exit !!@missing_modules;
146 my ($res) = check_kpsewhich();
147 print_result("Looking for LaTeX kpsewhich", $res);
149 # no pdfx -> no zugferd possible
150 my $ret = kpsewhich('template/print/', 'sty', 'pdfx');
151 die "Cannot use pdfx. Please install this package first (debian: apt install texlive-latex-extra)" if $ret;
153 my $latex = $::lx_office_conf{applications}->{latex} || 'pdflatex';
154 my $pdfx = (system ${latex} . ' --interaction=batchmode "\documentclass{minimal} \RequirePackage{pdfx} \csname @ifpackagelater\endcsname{pdfx}{2018/12/22}{}{\show\relax} \begin{document} \end{document}"');
156 print_result ("Looking for pdfx version 2018 or higher", !$pdfx);
157 push @missing_modules, \(name => 'pdfx') if $pdfx;
160 check_template_dir($_) for SL::InstallationCheck::template_dirs($master_templates);
162 print STDERR <<EOL if $pdfx;
163 +------------------------------------------------------------------------------+
164 Your pdfx version is too old. You cannot use ZuGFeRD or modern (2018+)
165 templates. Please consider using a more recent LaTeX environment.
167 pdflatex --interaction=batchmode "\RequirePackage{pdfx}[2018/12/22]"
168 +------------------------------------------------------------------------------+
172 sub check_template_dir {
174 my $path = $master_templates . $dir;
176 print_header("Checking LaTeX Dependencies for Master Templates '$dir'");
177 kpsewhich($path, 'cls', $_) for SL::InstallationCheck::classes_from_latex($path, '\documentclass');
179 my @sty = sort { $a cmp $b } uniq (
180 SL::InstallationCheck::classes_from_latex($path, '\usepackage'),
181 qw(textcomp ulem embedfile)
183 kpsewhich($path, 'sty', $_) for @sty;
186 our $mastertemplate_path = './templates/print/';
188 sub check_kpsewhich {
189 return 1 if SL::InstallationCheck::check_kpsewhich();
191 print STDERR <<EOL if $v && !$check{s};
192 +------------------------------------------------------------------------------+
193 Can't find kpsewhich, is there a proper installed LaTeX?
194 On Debian you may run "aptitude install texlive-base-bin"
195 +------------------------------------------------------------------------------+
201 my ($dw, $type, $package) = @_;
202 $package =~ s/[^-_0-9A-Za-z]//g;
203 my $type_desc = $type eq 'cls' ? 'document class' : 'package';
205 eval { require String::ShellQuote; 1 } or warn "can't load String::ShellQuote" && return;
206 $dw = String::ShellQuote::shell_quote $dw;
207 my $e_package = String::ShellQuote::shell_quote $package;
208 my $e_type = String::ShellQuote::shell_quote $type;
210 my $exit = system(qq|TEXINPUTS=".:$dw:" kpsewhich $e_package.$e_type > /dev/null|);
211 my $res = $exit > 0 ? 0 : 1;
213 print_result("Looking for LaTeX $type_desc $package", $res);
215 print STDERR <<EOL if $v && !$check{s};
216 +------------------------------------------------------------------------------+
217 LaTeX $type_desc $package could not be loaded.
219 On Debian you may find the needed *.deb package with:
220 apt-file search $package.$type
222 Maybe you need to install apt-file first by:
223 aptitude install apt-file && apt-file update
224 +------------------------------------------------------------------------------+
230 my $line = "Looking for pdfinfo executable";
231 my $shell_out = `pdfinfo -v 2>&1 | grep version 2> /dev/null`;
232 my ($label,$vers,$ver_string) = split / /,$shell_out;
233 if ( $label && $label eq 'pdfinfo' ) {
235 print_line($line, $ver_string, 'green');
237 print_line($line, 'not installed','red');
238 my %modinfo = ( debian => 'poppler-utils' );
239 push @missing_modules, \%modinfo;
245 my ($module, %role) = @_;
247 my $line = "Looking for $module->{fullname}";
248 $line .= " (from $module->{dist_name})" if $module->{dist_name};
249 my ($res, $ver) = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
251 my $ver_string = ref $ver && $ver->can('numify') ? $ver->numify : $ver ? $ver : 'no version';
252 print_line($line, $ver_string, 'green');
254 print_result($line, $res);
260 push @missing_modules, $module;
263 $role{optional} ? 'It is OPTIONAL for kivitendo but RECOMMENDED for improved functionality.'
264 : $role{required} ? 'It is NEEDED by kivitendo and must be installed.'
265 : $role{devel} ? 'It is OPTIONAL for kivitendo and only useful for developers.'
266 : 'It is not listed as a dependency yet. Please tell this the developers.';
268 my @source_texts = module_source_texts($module);
270 print STDERR <<EOL if $v && !$check{s};
271 +------------------------------------------------------------------------------+
272 $module->{fullname} could not be loaded.
274 This module is either too old or not available on your system.
277 Here are some ideas how to get it:
280 +------------------------------------------------------------------------------+
284 sub module_source_texts {
287 for my $key (keys %install_methods) {
288 my $method = $install_methods{$key};
289 push @texts, <<"EOL" if $module->{$method->{key}};
290 - Using $method->{system} you can install it with $key:
291 $method->{install} $module->{$method->{key}}
294 push @texts, <<EOL if $module->{url};
295 - You can download it from this URL and install it manually:
303 return $_[0] unless $c;
308 my ($test, $exit) = @_;
310 print_line($test, 'ok', 'green');
312 print_line($test, 'NOT ok', 'red');
317 my ($text, $res, $color) = @_;
319 print $text, " ", ('.' x (78 - length($text) - length($res))), " ", mycolor($res, $color), $/;
336 scripts/installation_check.pl - check kivitendo dependencies
340 scripts/installation_check.pl [OPTION]
344 Check dependencys. List all perl modules needed by kivitendo, probes for them,
345 and warns if one is not available. List all LaTeX document classes and
346 packages needed by kivitendo master templates, probes for them, and warns if
347 one is not available.
356 Probe for all perl modules and all LaTeX master templates.
360 Color output. Default on.
364 No color output. Helpful to avoid terminal escape problems.
368 Probe for perl developer dependencies. (Used for console and tags file)
372 Don't probe for perl developer dependencies. (Useful in combination with --all)
378 =item C<-o, --optional>
380 Probe for optional modules.
382 =item C<--no-optional>
384 Don't probe for optional perl modules. (Useful in combination with --all)
386 =item C<-r, --required>
388 Probe for required perl modules (default).
390 =item C<--no-required>
392 Don't probe for required perl modules. (Useful in combination with --all)
396 Probe for LaTeX documentclasses and packages in master templates.
400 Don't probe for LaTeX document classes and packages in master templates. (Useful in combination with --all)
402 =item C<-v. --verbose>
404 Print additional info for missing dependencies
406 =item C<-i, --install-command>
408 Tries to generate installation commands for the most common package managers.
409 Note that these lists can be slightly off, but it should still save you a lot
414 =head1 BUGS, CAVEATS and TODO
420 Fedora packages not listed yet.
424 Not possible yet to generate a combined cpan/apt-get string to install all needed.
428 Not able to handle devel cpan modules yet.
432 Version requirements not fully tested yet.
438 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
439 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
440 Wulf Coulmann E<lt>wulf@coulmann.deE<gt>