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 +------------------------------------------------------------------------------+
207 my $line = "Looking for pdfinfo executable";
208 my $shell_out = `pdfinfo -v 2>&1 | grep version 2> /dev/null`;
209 my ($label,$vers,$ver_string) = split / /,$shell_out;
210 if ( $label && $label eq 'pdfinfo' ) {
211 print_line($line, $ver_string, 'green');
213 print_line($line, 'not installed','red');
214 my %modinfo = ( name => 'pdfinfo' );
215 push @missing_modules, \%modinfo;
220 sub check_aqbanking {
221 my $aqbin = $::lx_office_conf{applications}->{aqbanking};
223 print_line('Looking for aqbanking executable', 'not configured','red');
226 my $line = "Looking for aqbanking executable '".$aqbin."'";
227 my $shell_out = `$aqbin versions 2>&1 | grep AqBanking-CLI 2> /dev/null`;
228 my ($label,$version) = split /:/,$shell_out;
229 if ( $label && $label eq ' AqBanking-CLI' ) {
231 print_line($line, $version, 'green');
233 print_line($line, 'not installed','red');
234 my %modinfo = ( name => 'aqbanking' );
235 push @missing_modules, \%modinfo;
241 my ($module, %role) = @_;
243 my $line = "Looking for $module->{fullname}";
244 $line .= " (from $module->{dist_name})" if $module->{dist_name};
245 my ($res, $ver) = SL::InstallationCheck::module_available($module->{"name"}, $module->{version});
247 my $ver_string = ref $ver && $ver->can('numify') ? $ver->numify : $ver ? $ver : 'no version';
248 print_line($line, $ver_string, 'green');
250 print_result($line, $res);
256 push @missing_modules, $module;
259 $role{optional} ? 'It is OPTIONAL for kivitendo but RECOMMENDED for improved functionality.'
260 : $role{required} ? 'It is NEEDED by kivitendo and must be installed.'
261 : $role{devel} ? 'It is OPTIONAL for kivitendo and only useful for developers.'
262 : 'It is not listed as a dependancy yet. Please tell this the developers.';
264 my @source_texts = module_source_texts($module);
266 print STDERR <<EOL if $v && !$check{s};
267 +------------------------------------------------------------------------------+
268 $module->{fullname} could not be loaded.
270 This module is either too old or not available on your system.
273 Here are some ideas how to get it:
276 +------------------------------------------------------------------------------+
280 sub module_source_texts {
283 for my $key (keys %install_methods) {
284 my $method = $install_methods{$key};
285 push @texts, <<"EOL" if $module->{$method->{key}};
286 - Using $method->{system} you can install it with $key:
287 $method->{install} $module->{$method->{key}}
290 push @texts, <<EOL if $module->{url};
291 - You can download it from this URL and install it manually:
299 return $_[0] unless $c;
304 my ($test, $exit) = @_;
306 print_line($test, 'ok', 'green');
308 print_line($test, 'NOT ok', 'red');
313 my ($text, $res, $color) = @_;
315 print $text, " ", ('.' x (78 - length($text) - length($res))), " ", mycolor($res, $color), $/;
332 scripts/installation_check.pl - check kivitendo dependancies
336 scripts/installation_check.pl [OPTION]
340 Check dependencys. List all perl modules needed by kivitendo, probes for them,
341 and warns if one is not available. List all LaTeX document classes and
342 packages needed by kivitendo master templates, probes for them, and warns if
343 one is not available.
352 Probe for all perl modules and all LaTeX master templates.
356 Color output. Default on.
360 No color output. Helpful to avoid terminal escape problems.
364 Probe for perl developer dependancies. (Used for console and tags file)
368 Don't probe for perl developer dependancies. (Useful in combination with --all)
374 =item C<-o, --optional>
376 Probe for optional modules.
378 =item C<--no-optional>
380 Don't probe for optional perl modules. (Useful in combination with --all)
382 =item C<-r, --required>
384 Probe for required perl modules (default).
386 =item C<--no-required>
388 Don't probe for required perl modules. (Useful in combination with --all)
392 Probe for LaTeX documentclasses and packages in master templates.
396 Don't probe for LaTeX document classes and packages in master templates. (Useful in combination with --all)
398 =item C<-v. --verbose>
400 Print additional info for missing dependancies
402 =item C<-i, --install-command>
404 Tries to generate installation commands for the most common package managers.
405 Note that these lists can be slightly off, but it should still save you a lot
410 =head1 BUGS, CAVEATS and TODO
416 Fedora packages not listed yet.
420 Not possible yet to generate a combined cpan/apt-get string to install all needed.
424 Not able to handle devel cpan modules yet.
428 Version requirements not fully tested yet.
434 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
435 Sven Schöling E<lt>s.schoeling@linet-services.deE<gt>
436 Wulf Coulmann E<lt>wulf@coulmann.deE<gt>