ConfigMerger/kernel_config_merger.pl

98 lines
3.2 KiB
Perl

# Copyright © Sergio Iglesias 2020
# License: GPLv2
# With love but without warranty.
use strict;
use warnings;
package Kernel::Config {
sub new {
my $class = shift;
my %params = @_;
my $self = bless {}, $class;
my $file = $params{file};
$self->_checkIsPlainFileAndReadable( file => $file );
$self->_readConfigFile( file => $file );
$self;
}
sub _checkIsPlainFileAndReadable {
my $self = shift;
my %params = @_;
my $file = $params{file};
die "No file param" unless defined $file;
die "No such file $file" unless -e $file;
die "No plain file $file" unless -f $file;
die "Cannot read $file" unless -r $file;
}
sub _readConfigFile {
my $self = shift;
my %params = @_;
my $file = $params{file};
open my $fh, '<', $file or die "Cannot open $file for read";
my $lines = [<$fh>];
$lines = [ grep { !( /#/ || /^\s*$/ ) } @$lines ];
my $hash_config = $self->_parseConfigLinesToHash( lines => $lines );
$self->{hash_config} = $hash_config;
}
sub _parseConfigLinesToHash {
my $self = shift;
my %params = @_;
my $lines = $params{lines};
my $hash_config = { map { chomp; split qr/=/ } @$lines };
return $hash_config;
}
sub hashConfig {
my $self = shift;
$self->{hash_config} = $_[1] if defined $_[1];
return $self->{hash_config};
}
sub merge {
my $self = shift;
my %params = @_;
my $remote_kernel_config = $params{kernel_config};
my $remote_hash_config = $remote_kernel_config->hashConfig;
my $hash_config = $self->hashConfig;
my $keys = [ keys %$hash_config, keys %$remote_hash_config ];
my $new_hash_config = {
map {
$self->_optionSelectorMergerConfigFirst(
key => $_,
hash_config => $hash_config,
remote_hash_config => $remote_hash_config
)
} @$keys
};
$self->hashConfig($new_hash_config);
$self;
}
sub _optionSelectorMergerConfigFirst {
my $self = shift;
my %params = @_;
my $key = $params{key};
my $hash_config = $params{hash_config};
my $remote_hash_config = $params{remote_hash_config};
if ( defined $hash_config->{$key} && $hash_config->{$key} !~ /^\s*$/ ) {
return ( $key => $hash_config->{$key} );
} else {
return ( $key => ( $remote_hash_config->{$key} // "" ) );
}
}
sub plainConfig {
my $self = shift;
my $hash_config = $self->hashConfig;
my $plain_config = join( "\n", ( map { "$_=$hash_config->{$_}" } keys %$hash_config ) );
$plain_config .= "\n";
return $plain_config;
}
}
print Kernel::Config->new( file => $ARGV[0] )->merge( kernel_config => Kernel::Config->new( file => $ARGV[1] ) )
->plainConfig;