2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-16 10:46:03 +00:00

fhem.pl: configDB patches from betateilchen

git-svn-id: https://svn.fhem.de/fhem/trunk@5079 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-03-01 07:59:19 +00:00
parent 8f5cdeaf5f
commit 64862bcb3a

View File

@ -123,6 +123,13 @@ sub CommandShutdown($$);
sub CommandSleep($$);
sub CommandTrigger($$);
# configDB special
sub cfgDB_Init;
sub cfgDB_ReadAll($);
sub cfgDB_SaveState;
sub cfgDB_SaveCfg;
sub cfgDB_GlobalAttr;
##################################################
# Variables:
# global, to be able to access them from modules
@ -365,6 +372,13 @@ $winService ||= {};
# Server initialization
doGlobalDef($ARGV[0]);
if($attr{global}{configfile} eq 'configDB') {
eval "use configDB";
Log 1, $@ if($@);
cfgDB_Init();
}
# As newer Linux versions reset serial parameters after fork, we parse the
# config file after the fork. But we need some global attr parameters before, so we
# read them here.
@ -389,12 +403,17 @@ while(time() < 2*3600) {
sleep(5);
}
my $ret = CommandInclude(undef, $attr{global}{configfile});
Log 1, "configfile: $ret" if($ret);
if($attr{global}{configfile} eq 'configDB') {
cfgDB_ReadAll(undef);
if($attr{global}{statefile} && -r $attr{global}{statefile}) {
$ret = CommandInclude(undef, $attr{global}{statefile});
Log 1, "statefile: $ret" if($ret);
} else {
my $ret = CommandInclude(undef, $attr{global}{configfile});
Log 1, "configfile: $ret" if($ret);
if($attr{global}{statefile} && -r $attr{global}{statefile}) {
$ret = CommandInclude(undef, $attr{global}{statefile});
Log 1, "statefile: $ret" if($ret);
}
}
SignalHandling();
@ -1068,7 +1087,8 @@ CommandRereadCfg($$)
my ($cl, $param) = @_;
my $name = ($cl ? $cl->{NAME} : "__anonymous__");
my $cfgfile = ($param ? $param : $attr{global}{configfile});
return "Cannot open $cfgfile: $!" if(! -f $cfgfile);
return "Cannot open $cfgfile: $!"
if(! -f $cfgfile && $attr{global}{configfile} ne 'configDB');
$attr{global}{configfile} = $cfgfile;
WriteStatefile();
@ -1091,13 +1111,21 @@ CommandRereadCfg($$)
%inform = ();
doGlobalDef($cfgfile);
setGlobalAttrBeforeFork($cfgfile);
my $ret;
my $ret = CommandInclude($cl, $cfgfile);
if($attr{global}{statefile} && -r $attr{global}{statefile}) {
my $ret2 = CommandInclude($cl, $attr{global}{statefile});
$ret = (defined($ret) ? "$ret\n$ret2" : $ret2) if(defined($ret2));
if($attr{global}{configfile} eq 'configDB') {
cfgDB_ReadAll($cl);
} else {
setGlobalAttrBeforeFork($cfgfile);
$ret = CommandInclude($cl, $cfgfile);
if($attr{global}{statefile} && -r $attr{global}{statefile}) {
my $ret2 = CommandInclude($cl, $attr{global}{statefile});
$ret = (defined($ret) ? "$ret\n$ret2" : $ret2) if(defined($ret2));
}
}
DoTrigger("global", "REREADCFG", 1);
$defs{$name} = $selectlist{$name} = $cl if($name && $name ne "__anonymous__");
@ -1125,6 +1153,11 @@ CommandQuit($$)
sub
WriteStatefile()
{
if($attr{global}{configfile} eq 'configDB') {
cfgDB_SaveState();
return "";
}
return "No statefile specified" if(!$attr{global}{statefile});
if(!open(SFH, ">$attr{global}{statefile}")) {
my $msg = "WriteStateFile: Cannot open $attr{global}{statefile}: $!";
@ -1189,6 +1222,11 @@ CommandSave($$)
WriteStatefile();
if($attr{global}{configfile} eq 'configDB') {
$ret = cfgDB_SaveCfg();
return ($ret ? $ret : "Saved configuration to the DB");
}
$param = $attr{global}{configfile} if(!$param);
return "No configfile attribute set and no argument specified" if(!$param);
if(!open(SFH, ">$param")) {
@ -1590,7 +1628,7 @@ CommandDeleteAttr($$)
delete($defs{$sdev}{'.userReadings'});
}
$ret = CallFn($sdev, "AttrFn", "del", @a);
my $ret = CallFn($sdev, "AttrFn", "del", @a);
if($ret) {
push @rets, $ret;
next;
@ -3036,6 +3074,12 @@ sub
setGlobalAttrBeforeFork($)
{
my ($f) = @_;
if($f eq 'configDB') {
cfgDB_GlobalAttr();
return;
}
open(FH, $f) || die("Cant open $f: $!\n");
while(my $l = <FH>) {
$l =~ s/[\r\n]//g;