use Getopt::Long;
use Pod::Usage;
use Term::ANSIColor;
+use Text::Wrap;
our $master_templates;
BEGIN {
unshift @INC, "modules/override"; # Use our own versions of various modules (e.g. YAML).
Debian: you may install the needed *.deb package with:
apt-get install libconfig-std-perl
- RPM: There is a rpm package "perl-Config-Std"
+ 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:
+ SUSE: you may install the needed *.rpm package with:
zypper install perl-Config-Std
+------------------------------------------------------------------------------+
use SL::InstallationCheck;
use SL::LxOfficeConf;
-
+my @missing_modules;
my %check;
Getopt::Long::Configure ("bundling");
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-get 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"
}
if ($check{a}) {
- foreach my $check (keys %check) {
- $check{$check} = 1 unless defined $check{$check};
- }
+ $check{$_} //= 1 for qw(o d l r);
}
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;
}
if ($check{o}) {
print_header('Checking Optional Modules');
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);
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"
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.
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';
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.
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;
}
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]:", $/;
}
=head1 NAME
-scripts/installation_check.pl - check Lx-Office dependancies
+scripts/installation_check.pl - check kivitendo dependancies
=head1 SYNOPSIS
=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.
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