diff --git a/fhem/docs/commandref_frame.html b/fhem/docs/commandref_frame.html index 3b6fe10af..cab8ee287 100644 --- a/fhem/docs/commandref_frame.html +++ b/fhem/docs/commandref_frame.html @@ -177,7 +177,17 @@ telnet) or single client command (via fhem.pl). Example:
If a OS-user called fhem exists, and FHEM is started as root, FHEM will -automatically change to to this user via setuid.
+automatically change to to this user via setuid. +

+ +If FHEM is started with the -d option (perl fhem.pl -d fhem.cfg), then the +verbose level is set to 5 and the logfile is redirected to the STDOUT. +

+ +The environment variable FHEM_GLOBALATTR is evaluated: it consists of space +separated name=value pairs, where name is a global attribute. Values from this +source override values set in the configuration file. + diff --git a/fhem/docs/commandref_frame_DE.html b/fhem/docs/commandref_frame_DE.html index ad131b4f0..02cb2198f 100644 --- a/fhem/docs/commandref_frame_DE.html +++ b/fhem/docs/commandref_frame_DE.html @@ -158,7 +158,17 @@ Die Kommunikation mit FHEM kann entweder in einer "session" (über telnet) o
Falls FHEM als root gestartet wurde, und ein OS-Benutzer fhem existiert, dann -wechselt FHEM nach dem start zu diesem Benutzer (via setuid).
+wechselt FHEM nach dem start zu diesem Benutzer (via setuid). +

+ +Falls FHEM mit der -d Koommandozeilenoption gestartet wurde (perl fhem.pl -d +fhem.cfg), dann wird verbose auf 5 gesetzt und die Logs werden auf STDOUT +geschrieben. +

+ +Die Umgebungsvariable FHEM_GLOBALATTR wird ausgewertet: sie enthält +Leerzeichengetrennte Name=Wert Paare, wobei Name ein global Attribut ist. So +gesetzte Werte überschreiben die Werte aus der Konfigurationsdatei.
diff --git a/fhem/fhem.pl b/fhem/fhem.pl index 7c8362e58..503cda098 100755 --- a/fhem/fhem.pl +++ b/fhem/fhem.pl @@ -111,6 +111,7 @@ sub WriteStatefile(); sub XmlEscape($); sub addEvent($$); sub addToDevAttrList($$); +sub applyGlobalAttrFromEnv(); sub delFromDevAttrList($$); sub addToAttrList($); sub delFromAttrList($); @@ -562,7 +563,9 @@ if(configDBUsed()) { # 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. +my (undef, $globalAttrFromEnv) = parseParams($ENV{FHEM_GLOBALATTR}); setGlobalAttrBeforeFork($attr{global}{configfile}); +applyGlobalAttrFromEnv(); Log 1, $_ for eval{@{$winService->{ServiceLog}};}; @@ -609,6 +612,7 @@ if(configDBUsed()) { } } } +applyGlobalAttrFromEnv(); my $pfn = $attr{global}{pidfilename}; if($pfn) { @@ -1481,6 +1485,7 @@ CommandRereadCfg($$) $ret = (defined($ret) ? "$ret\n$ret2" : $ret2) if(defined($ret2)); } } + applyGlobalAttrFromEnv(); $defs{$name} = $selectlist{$name} = $cl if($name && $name ne "__anonymous__"); $inform{$name} = $informMe if($informMe); @@ -2742,7 +2747,10 @@ GlobalAttr($$$$) return undef; } - return undef if($type ne "set"); + my $ev = $globalAttrFromEnv->{$name}; + return "$name is readonly, it is set in the FHEM_GLOBALATTR environment" + if(defined($ev) && defined($val) && $ev ne $val); + ################ if($name eq "logfile") { my @t = localtime(gettimeofday()); @@ -5608,6 +5616,7 @@ parseParams($;$$$) $joiner = $separator if(!$joiner); # needed if separator is a regexp $keyvalueseparator = '=' if(!$keyvalueseparator); my(@a, %h); + return(\@a, \%h) if(!defined($cmd)); my @params; if( ref($cmd) eq 'ARRAY' ) { @@ -5925,4 +5934,13 @@ IsWe(;$$) return $we ? 1 : 0; } +sub +applyGlobalAttrFromEnv() +{ + while(my ($k,$v)= each %{$globalAttrFromEnv}) { + Log 3, "From the FHEM_GLOBALATTR environment: attr global $k $v"; + CommandAttr(undef, "global $k $v"); + } +} + 1;