1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#!/usr/bin/perl -w
# Author Philippe Hétroy, phetroy@mandrakesoft.com
# $Id: Varspaceval.pm,v 1.1 2003-08-22 19:59:47 warly Exp $
# Module for loding and committing informations in a VAR = value file type
package Varspaceval;
use lib('./');
use strict;
use Data::Dumper;
# Get all useful content of the config file
# Return a hash containg the key and the value
# ATTENTION : in the conf file, an empty value is returnes as a spaced value (mandatory because of XML compatibility)
sub get {
my $self = shift;
my $file = shift;
my %l;
local *F; open F, $file or return;
local $_;
while (<F>) {
my ($v, $val, $val2) =
/^\s* # leading space
(\w+)\s* # variable
(
"(.*)" # double-quoted text
| '(.*)' # single-quoted text
| [^'"\s]* # normal text
)
\s*$ # end of line
/x;
no warnings;
$l{$v} = defined $val2 ? $val2 : $val;
}
%l;
}
# Commits changes in conf files and ifconfig
sub commit {
my $self = shift;
my ($file, $hash) = @_;
local *F;
my $output = "";
if (open(F, $file)) {
local $_;
while (<F>) {
my ($pre, $key, $eq, $val, $rest) = /(^\s*)(\w+)(\s*"*'*)([^'"\s]*)(.*)/x;
if (!defined $key) {
$output .= $_;
next;
};
next if (!exists $hash->{$key}); #Elt has been removed
no warnings;
$val = $hash->{$key};
delete $hash->{$key};
$output .= defined $val ? $pre . $key . $eq . $val . $rest . "\n" : $pre . $key . $eq . $val . $rest;
# $output .= $pre . $key . $eq . $val . $rest . "\n";
}
#appending added parameters
foreach (keys %$hash) {
$output .= $_ . " " . $hash->{$_} . "\n";
}
} else { #the file does not exist
print STDERR "File $file will be created\n";
foreach (keys %$hash) {
$output .= defined $hash->{$_} ? $_ . "=" . $hash->{$_} . "\n" : $_ . "=\n";
}
}
#print $output;
#print "\n------------------\n";
# outputing the new conf
open(F, "> $file") or return;
print F $output;
close(F);
}
1;
|