#!/usr/bin/perl -w # # Author: Holger Parplies, 09.01.09, GPL, uncommented, -*-quick-hack-*- use strict; use Data::Dumper; use Getopt::Std; $Data::Dumper::Terse = 1; my %opts = ( f => undef, # file name of config file to manipulate ); if (not getopts ('f:', \%opts) or @ARGV == 0 or not defined $opts {f}) { die "Usage: $0 -f host.pl VAR=VALUE ...\n"; } our %Conf = (); do $opts {f} or die "Can't do $opts{f}: $!\n"; foreach (@ARGV) { my ($var, $val) = m/^\s*(.*?)\s*(?:=\s*(.*?)\s*)?$/; my $confvar; if ($var =~ /^(.*)\{(.*)\}\[(.*)\]$/) { defined $val ? $Conf {$1} {$2} [$3] = $val : splice @{$Conf {$1} {$2}}, $3, 1; } elsif ($var =~ /^(.*)\[(.*)\]$/) { defined $val ? $Conf {$1} [$2] = $val : splice @{$Conf {$1}}, $2, 1; } elsif ($var =~ /^(.*)\{(.*)\}$/) { defined $val ? $Conf {$1} {$2} = $val : delete $Conf {$1} {$2}; } else { defined $val ? $Conf {$var} = $val : delete $Conf {$var}; } } open CONF, ">$opts{f}.new" or die "Can't create new configuration file $opts{f}.new: $!\n"; foreach (sort keys %Conf) { my $val = Data::Dumper::Dumper ($Conf {$_}); chomp ($val); print CONF "\$Conf {$_} = $val;\n"; } close CONF; rename $opts {f}, "$opts{f}.old"; rename "$opts{f}.new", $opts {f};