Zitat von makki
Beitrag anzeigen
Geändert haben sich nur zwei Zeilen (my $key=''; statt my $key=undef; und if(defined $key) statt if($key) ).
Ich poste dennoch nochmal den gesamten Patch.
Grüße, Fry
Code:
--- wiregated.pl.mod-2012-04-24 2012-04-28 11:04:31.000000000 +0200 +++ wiregated.pl 2012-04-30 23:52:41.000000000 +0200 @@ -31,7 +31,8 @@ use IO::Socket; use IO::Select; use FileHandle; -use Config::Std { def_sep => '=', read_config => 'my_read_cfg', write_config => 'my_write_cfg' }; #FIXME: 1244kB +sub my_read_cfg; +sub my_write_cfg; # fork daemon use Proc::Daemon; Proc::Daemon::Init unless $opts{d}; @@ -95,7 +96,6 @@ my %wg_config; my %eibgaconf; -my %wg_config_local; my %wg_state; my @a_owdev_buttons; my @a_owdev_pio; @@ -1126,8 +1126,7 @@ # (re)read config if ((stat($owdev_cfgfile))[9] > $lastreadtime) { if (-e $owdev_cfgfile) { - my_read_cfg $owdev_cfgfile => %wg_config_local; - %wg_config = %wg_config_local; + my_read_cfg $owdev_cfgfile, \%wg_config; $lastreadtime = time(); while( my ($k, $v) = each(%wg_config) ) { DEBUG("CONFIG: Sensor $k Type $wg_config{$k}{'type'} !"); @@ -1152,7 +1151,7 @@ } } if (-e '/etc/wiregate/eibga.conf') { - my_read_cfg '/etc/wiregate/eibga.conf' => %eibgaconf; + my_read_cfg '/etc/wiregate/eibga.conf', \%eibgaconf; } } else { LOGDIE("unable to read config $owdev_cfgfile"); @@ -1342,7 +1341,7 @@ if($wg_config{''}{'eib_logging'} eq "1") { close FILE_EIBLOG; } $xpl->send_hbeat_end() if defined $xpl; # save state - my_write_cfg %wg_state, $owdev_statefile; + my_write_cfg \%wg_state, $owdev_statefile; threads->exit(); }; $SIG{KILL} = sub { @@ -1350,19 +1349,19 @@ if($wg_config{''}{'eib_logging'} eq "1") { close FILE_EIBLOG; } $xpl->send_hbeat_end() if defined $xpl; # save state - my_write_cfg %wg_state, $owdev_statefile; + my_write_cfg \%wg_state, $owdev_statefile; threads->exit(); }; # Read state if (-e $owdev_statefile) { - eval { my_read_cfg $owdev_statefile => %wg_state; }; + eval { my_read_cfg $owdev_statefile, \%wg_state; }; if ($@) { #statefile trashed, recreate - my_write_cfg %wg_state, $owdev_statefile; + my_write_cfg \%wg_state, $owdev_statefile; INFO("statefile unreadable $owdev_statefile re-created"); } } else { # create state file - my_write_cfg %wg_state, $owdev_statefile; + my_write_cfg \%wg_state, $owdev_statefile; INFO("statefile $owdev_statefile created"); } @@ -1425,7 +1424,7 @@ # save state if (time() > $laststatesaveime+30) { $laststatesaveime = time(); - my_write_cfg %wg_state, $owdev_statefile; + my_write_cfg \%wg_state, $owdev_statefile; DEBUG("statefile $owdev_statefile saved"); } @@ -1475,7 +1474,7 @@ } DEBUG("Thread ow2eib normal exit;"); # save state -my_write_cfg %wg_state, $owdev_statefile; +my_write_cfg \%wg_state, $owdev_statefile; $xpl->send_hbeat_end() if defined $xpl; } # END ow2eib-thread @@ -2269,6 +2268,98 @@ return @ret; } + +sub my_read_cfg +{ + my $cfgfile=shift; + my $cfghash=shift; + %{$cfghash}=(); + + open CONF, "<$cfgfile" || die "Could not open $cfgfile for reading"; + $/="\n"; + + my $record={}; + my $key=''; + + while(<CONF>) + { + if(/^\s*\[\s*(.+?)\s*\]\s*$/) + { + my $newkey=$1; + + if(defined $key) # flush last record + { + if(defined $record->{name} && $cfgfile=~/eibga/) + { + $record->{ga}=$key; + $cfghash->{$record->{name}}=$record; + + # specific to my GA scheme (Fry) + $record->{name}=~/^\s*(\S+)/; + $record->{short}=$1; + $record->{short}="ZV_$1" if $record->{name}=~/^Zeitversand.*(Uhrzeit|Datum)/; # short versions of "Zeitversand" + $cfghash->{$record->{short}}=$record; + # end of specific part + } + $cfghash->{$key}=$record; + } + + # start new record + $record={}; + $key=$newkey; + } + elsif(/^\s*(.+?)\s*\=\s*(.*?)\s*$/) + { + $record->{$1} = $2; + } + } + close CONF; + + if($key) # flush last record + { + if(defined $record->{name} && $cfgfile=~/eibga/) + { + $record->{ga}=$key; + $cfghash->{$record->{name}}=$record; + + # specific to my GA scheme (Fry) + $record->{name}=~/^\s*(\S+)/; + $record->{short}=$1; + $record->{short}="ZV_$1" if $record->{name}=~/^Zeitversand.*(Uhrzeit|Datum)/; # short versions of "Zeitversand" + $cfghash->{$record->{short}}=$record; + # end of specific part + } + $cfghash->{$key}=$record; + } +} + + +sub my_write_cfg +{ + my $cfghash=shift; + my $cfgfile=shift; + + open CONF, ">$cfgfile" || die "Could not open $cfgfile for writing"; + + for my $s (keys %{$cfghash}) + { + next if $cfgfile=~/eibga/ && $s!~/^[\'\/0-9]+$/; + + print CONF "[$s]\n"; + + for my $k (keys %{$cfghash->{$s}}) + { + print CONF "\t$k = $cfghash->{$s}{$k}\n"; + } + } + + close CONF; +} + + + + + =pod =head1 NAME
Kommentar