mirror of https://github.com/sipwise/ngcpcfg.git
Move perl code which actually modifies yml file to separate helper as there is no sense to recreate it every call of 'ngcpcfg set'. Change-Id: I08b10186b1aa127d4a2b81ef36b234dfdd46fc8emr11.1
parent
14a6de3c8e
commit
a2a91ee09b
@ -0,0 +1,87 @@
|
||||
#!/usr/bin/perl -wCSD
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use Safe;
|
||||
use YAML::XS;
|
||||
use Scalar::Util qw(looks_like_number);
|
||||
|
||||
my ($file, $option, $value) = @ARGV;
|
||||
|
||||
unless (defined($file)) {
|
||||
print {*STDERR} ("1st parameter 'file' is not defined\n");
|
||||
exit (1);
|
||||
}
|
||||
unless (defined($option)) {
|
||||
print {*STDERR} ("2nd parameter 'option' is not defined\n");
|
||||
exit (1);
|
||||
}
|
||||
unless (defined($value)) {
|
||||
print {*STDERR} ("3rd parameter 'value' is not defined\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
my $yaml = YAML::XS::LoadFile($file);
|
||||
my $valref = \$yaml;
|
||||
|
||||
if ($value =~ /^['"]+.+['"]+$/) {
|
||||
log_debug ('$value is already quoted.');
|
||||
}
|
||||
elsif (looks_like_number($value)) {
|
||||
log_debug ('Not quoting $value for integers.');
|
||||
}
|
||||
elsif ($value =~ /^\[.+\]$/) {
|
||||
log_debug ('Not quoting $value for arrays.');
|
||||
}
|
||||
elsif ($value =~ /^\{.+\}$/) {
|
||||
log_debug ('Not quoting $value for hashes.');
|
||||
}
|
||||
else {
|
||||
$value = "\"$value\"";
|
||||
}
|
||||
|
||||
my $compartment = Safe->new();
|
||||
$value = $compartment->reval($value);
|
||||
|
||||
for my $component (split(/\./, $option)) {
|
||||
if (ref($valref) eq 'SCALAR' && defined(${$valref})) {
|
||||
print {*STDERR} ("Key resolved to a SCALAR at '$component'; cannot continue.\n");
|
||||
exit (1);
|
||||
}
|
||||
elsif (looks_like_number($component) && (! defined(${$valref}) || ref(${$valref}) eq 'ARRAY')) {
|
||||
$valref = \${$valref}->[$component];
|
||||
}
|
||||
elsif ($component eq 'APPEND' && ref($$valref) eq 'ARRAY') {
|
||||
$valref = \${$valref}->[$#{$$valref}+1];
|
||||
}
|
||||
elsif (! defined(${$valref}) || ref(${$valref}) eq 'HASH') {
|
||||
$valref = \${$valref}->{$component};
|
||||
}
|
||||
else {
|
||||
print {*STDERR} ("Key resolved to a " . ref(${$valref}) . " reference; refusing to overwrite.\n");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
if (! defined(${$valref}) || ref($valref) eq 'SCALAR') {
|
||||
${$valref} = $value;
|
||||
}
|
||||
elsif (ref(${$valref}) eq 'ARRAY' && ref($value) eq 'ARRAY') {
|
||||
${$valref} = $value;
|
||||
}
|
||||
elsif (ref(${$valref}) eq 'HASH' && ref($value) eq 'HASH') {
|
||||
${$valref} = $value;
|
||||
}
|
||||
else {
|
||||
print {*STDERR} ("Key resolved to a " . ref(${$valref}) . " reference; refusing to overwrite.\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
YAML::XS::DumpFile($file, $yaml);
|
||||
|
||||
sub log_debug {
|
||||
my $message = shift;
|
||||
if (defined($ENV{DEBUG})) {
|
||||
print "$message\n";
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue