################################################################ # $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; 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; my $module; my $err = "Missing perl module '$module'. Please install this module first."; my $err; $module = "HTTP::Request::Common"; if(!checkModule($module)) { Log 1, "$name $err"; return $err; } $module = "LWP::UserAgent"; if(!checkModule($module)) { Log 1, "$name $err"; return $err; } 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"; } } } sub checkModule($) { my $module = shift; eval("use $module"); if($@) { return(0); } else { return(1); } } 1; =pod =begin html

fheminfo

=end html =begin html_DE

fheminfo

=end html_DE =cut