X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FLxOfficeConf.pm;h=f6ae49ef07d8bfa3b76fe3d6a3dc9ee9a94a24fd;hb=991369b17d679e2855f4d5086d0b9769dc2ae1aa;hp=b0d801024c0056df8e9fd07ff0dffcd6cb2e19c1;hpb=a99b261f6a4a4b1988ce2e0ad4c27ed579378cb9;p=kivitendo-erp.git diff --git a/SL/LxOfficeConf.pm b/SL/LxOfficeConf.pm index b0d801024..f6ae49ef0 100644 --- a/SL/LxOfficeConf.pm +++ b/SL/LxOfficeConf.pm @@ -2,13 +2,55 @@ package SL::LxOfficeConf; use strict; -use Config::Std; use Encode; +my $environment_initialized; + +sub safe_require { + my ($class, $may_fail) = @_; + + eval { + require Config::Std; + require SL::System::Process; + 1; + } or do { + if ($may_fail) { + warn $@; + return 0; + } else { + die $@; + } + }; + + Config::Std->import; + + return 1; +} + sub read { - my $file = -f 'config/lx_office.conf' ? 'config/lx_office.conf' : 'config/lx_office.conf.default'; - read_config $file => %::lx_office_conf; + my ($class, $file_name, $may_fail) = @_; + + return unless $class->safe_require($may_fail); + + # Backwards compatibility: read lx_office.conf.default if + # kivitendo.conf.default does't exist. + my $dir = SL::System::Process->exe_dir; + my $default_config = -f "${dir}/config/kivitendo.conf.default" ? 'kivitendo' : 'lx_office'; + read_config("${dir}/config/${default_config}.conf.default" => \%::lx_office_conf); _decode_recursively(\%::lx_office_conf); + + $file_name ||= -f "${dir}/config/kivitendo.conf" ? "${dir}/config/kivitendo.conf" : "${dir}/config/lx_office.conf"; + + if (-f $file_name) { + read_config($file_name => \ my %local_conf); + _decode_recursively(\%local_conf); + _flat_merge(\%::lx_office_conf, \%local_conf); + } + + _init_environment(); + _determine_application_paths(); + + return 1; } sub _decode_recursively { @@ -23,4 +65,57 @@ sub _decode_recursively { } } +sub _flat_merge { + my ($dst, $src) = @_; + + while (my ($key, $value) = each %{ $src }) { + if (!exists $dst->{$key}) { + $dst->{$key} = $value; + + } else { + map { $dst->{$key}->{$_} = $value->{$_} } keys %{ $value }; + } + } +} + +sub _init_environment { + return if $environment_initialized; + + my %key_map = ( lib => { name => 'PERL5LIB', append_path => 1 }, + path => { name => 'PATH', append_path => 1 }, + ); + my $cfg = $::lx_office_conf{environment} || {}; + + while (my ($key, $value) = each %{ $cfg }) { + next unless $value; + + my $info = $key_map{$key} || {}; + $key = $info->{name} || $key; + + if ($info->{append_path}) { + $value = ':' . $value unless $value =~ m/^:/ || !$ENV{$key}; + $value = $ENV{$key} . $value if $ENV{$key}; + } + + $ENV{$key} = $value; + } + + $environment_initialized = 1; +} + +sub _determine_application_paths { + my @paths = grep { $_ } split m/:/, $ENV{PATH}; + + foreach my $key (keys %{ $::lx_office_conf{applications} }) { + my ($program) = split m/\s+/, $::lx_office_conf{applications}->{$key}; + next if $program =~ m|/|; + + foreach my $path (@paths) { + next unless -f "${path}/${program}"; + $::lx_office_conf{applications}->{$key} = "${path}/" . $::lx_office_conf{applications}->{$key}; + last; + } + } +} + 1;