diff --git a/fhem/CHANGED b/fhem/CHANGED index a7202e53b..f5d695afa 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -28,6 +28,7 @@ - bugfix: rename may overwrite other devices - feature: FLOORPLAN longpoll (Matthias) - feature: support for recurring events added in 57_Calendar.pm (Boris) + - feature: new command fheminfo. Shows system informations. (M. Fischer) - 2012-10-28 (5.3) - feature: added functions trim, ltrim, rtrim, UntoggleDirect, diff --git a/fhem/FHEM/98_fheminfo.pm b/fhem/FHEM/98_fheminfo.pm new file mode 100644 index 000000000..68ff5086a --- /dev/null +++ b/fhem/FHEM/98_fheminfo.pm @@ -0,0 +1,411 @@ +################################################################ +# $Id$ +# vim: ts=2:et +# +# (c) 2012 Copyright: Martin Fischer (m_fischer at gmx dot de) +# All rights reserved +# +# This script free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# any later version. +# +# The GNU General Public License can be found at +# http://www.gnu.org/copyleft/gpl.html. +# A copy is found in the textfile GPL.txt and important notices to the license +# from the author is found in LICENSE.txt distributed with these scripts. +# +# This script is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +################################################################ +package main; +use strict; +use warnings; +use Config; +use HTTP::Request::Common qw(POST); +use LWP::UserAgent; + +sub CommandFheminfo($$); + +######################################## +sub +fheminfo_Initialize($$) +{ + if(!eval "require FhemUtils::release") { + require release; + } + + my %hash = ( + Fn => "CommandFheminfo", + Hlp => "[send],show or send Fhem statistics", + ); + $cmds{fheminfo} = \%hash; +} + +######################################## +sub +CommandFheminfo($$) +{ + my ($cl,$param) = @_; + + # split arguments + my @args = split(/ +/,$param); + + my $name = "fheminfo"; + my %info; + + return "Unknown argument $args[0], usage: fheminfo [send]" if(@args && lc($args[0]) ne "send"); + + my $branch = $DISTRIB_BRANCH; + my $release = $DISTRIB_RELEASE; + my $os = $^O; + my $arch = $Config{"archname"}; + my $perl = $^V; + my $uniqueID = AttrVal("global","uniqueID",join "", map { unpack "H*", chr(rand(256)) } 1..16); + my $sendStatistics = AttrVal("global","sendStatistics",1); + + $attr{global}{uniqueID} = $uniqueID; + $attr{global}{sendStatistics} = $sendStatistics; + + my $ret = checkConfigFile($uniqueID); + + return $ret if($ret); + + foreach my $d (sort keys %defs) { + my $n = $defs{$d}{NAME}; + my $t = $defs{$d}{TYPE}; + my $m = AttrVal($n,"model","unknown"); + $info{modules}{$t}{$n} = $m; + } + + my $str; + $str = "Fhem info:\n"; + $str .= sprintf(" Release%*s: %s\n",2," ",$release); + $str .= sprintf(" Branch%*s: %s\n",3," ",$branch); + $str .= sprintf(" OS%*s: %s\n",7," ",$os); + $str .= sprintf(" Arch%*s: %s\n",5," ",$arch); + $str .= sprintf(" Perl%*s: %s\n",5," ",$perl); + $str .= sprintf(" uniqueID%*s: %s\n",0," ",$uniqueID); + $str .= "\n"; + + my $contModules; + my $contModels; + my $modStr; + my @modules = keys %{$info{modules}}; + my $length = (reverse sort { $a <=> $b } map { length($_) } @modules)[0]; + + $str .= "Defined modules:\n"; + + foreach my $t (sort keys %{$info{modules}}) { + my $c = scalar keys %{$info{modules}{$t}}; + my @models; + foreach my $n (sort keys %{$info{modules}{$t}}) { + my $model = $info{modules}{$t}{$n}; + if($model ne "unknown") { + push(@models,$model) if(!grep {$_ =~ /$model/} @models); + } + } + $str .= sprintf(" %s%*s: %d\n",$t,$length-length($t)+1," ",$c); + if(@models != 0) { + $modStr .= sprintf(" %s%*s: %s\n",$t,$length-length($t)+1," ",join(",",sort @models)); + $contModels .= join(",",sort @models)."|"; + } + $contModules .= "$t:$c|"; + } + + if($modStr) { + $str .= "\n"; + $str .= "Defined models per module:\n"; + $str .= $modStr; + } + + $ret = $str; + + if(@args != 0 && $args[0] eq "send") { + my $uri = "http://fhem.de/stats/statistics.cgi"; + my $req = HTTP::Request->new("POST",$uri); + $req->content_type("application/x-www-form-urlencoded"); + my $contInfo; + $contInfo = "Release:$release|"; + $contInfo .= "Branch:$branch|"; + $contInfo .= "OS:$os|"; + $contInfo .= "Arch:$arch|"; + $contInfo .= "Perl:$perl"; + chop($contModules); + if(!$contModels) { + $req->content("uniqueID=$uniqueID&system=$contInfo&modules=$contModules"); + } else { + chop($contModels); + $req->content("uniqueID=$uniqueID&system=$contInfo&modules=$contModules&models=$contModels"); + } + + my $ua = LWP::UserAgent->new( + agent => "Fhem/$release", + timeout => 60); + my $res = $ua->request($req); + + $ret .= "\nserver response: "; + if($res->is_success) { + $ret .= $res->content."\n"; + } else { + $ret .= $res->status_line."\n"; + } + } + + return $ret; +} + +######################################## +sub checkConfigFile($) { + my $uniqueID = shift; + my $name = "fheminfo"; + my $configFile = AttrVal("global","configfile",""); + + if($configFile) { + my $fh; + if(!open($fh,"<".$configFile)) { + return "Can't open $configFile: $!"; + } + + my @currentConfig = <$fh>; + close $fh; + + if(!grep {$_ =~ /uniqueID/} @currentConfig) { + my @newConfig; + my $done = 0; + + foreach my $line (@currentConfig) { + push(@newConfig,$line); + if($line =~ /modpath/ && $done == 0) { + push(@newConfig,"attr global uniqueID $uniqueID\n"); + push(@newConfig,"attr global sendStatistics 1\n"); + $done = 1; + } + } + + if(!open($fh,">".$configFile)) { + return "Can't open $configFile: $!"; + } + + foreach (@newConfig) { + print $fh $_; + } + close $fh; + Log 1, "$name global attributes 'uniqueID' and 'sendStatistics' added to configfile $configFile"; + } + } + +} + +1; + +=pod +=begin html + + +

fheminfo

+ + +=end html +=begin html_DE + + +

fheminfo

+ + +=end html_DE +=cut diff --git a/fhem/docs/commandref_frame.html b/fhem/docs/commandref_frame.html index dfc28769f..5dc4be173 100644 --- a/fhem/docs/commandref_frame.html +++ b/fhem/docs/commandref_frame.html @@ -37,6 +37,7 @@ define   delete   deleteattr   + fheminfo   get   getstate   ?,help   @@ -969,7 +970,8 @@ A line ending with \ will be concatenated with the next one, so long lines shutdown.
- +
  • sendStatistics +
  • statefile
    Set the filename where the state and certain at @@ -982,6 +984,8 @@ A line ending with \ will be concatenated with the next one, so long lines Used by the web frontend fhemweb.pl (webpgm2) as a Page title.

  • +
  • uniqueID +
  • updatebranch
    The update branch will be set by the file FhemUtils/release.pm contained diff --git a/fhem/docs/commandref_frame_DE.html b/fhem/docs/commandref_frame_DE.html index 4218b01d0..1d7c780a6 100644 --- a/fhem/docs/commandref_frame_DE.html +++ b/fhem/docs/commandref_frame_DE.html @@ -34,6 +34,7 @@ define   delete   deleteattr   + fheminfo   get   getstate   ?,help   @@ -1013,7 +1014,8 @@ Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.

    gelöscht.

  • - +
  • sendStatistics +
  • statefile
    Dieses Attribut legt den Namen der Datei fest, in die @@ -1028,6 +1030,8 @@ Zeilen erstreckende Befehle, indem man keine \ am Zeilenende eingeben muss.

    Festlegung des Seitentitels benutzt..

  • +
  • uniqueID +
  • updatebranch
    Dieses Attribut wird mittels der Datei FhemUtils/release.pm gesetzt die