FritzBoxUtils.pm 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. ##############################################
  2. # $Id: FritzBoxUtils.pm 14541 2017-06-19 09:13:10Z rudolfkoenig $
  3. package main;
  4. use strict;
  5. use warnings;
  6. use Digest::MD5 "md5_hex";
  7. use HttpUtils;
  8. my ($lastOkPw, $lastOkUser, $lastOkHost, $lastOkTime) =("", "", 0);
  9. sub FB_checkPw(@);
  10. sub
  11. FB_doCheckPW($$$)
  12. {
  13. my ($host, $user, $pw) = @_;
  14. my $data = GetFileFromURL("http://$host/login_sid.lua", undef, undef, 1);
  15. return undef if(!$data);
  16. my $chl="";
  17. $chl = $1 if($data =~ /<Challenge>(\w+)<\/Challenge>/i);
  18. my $chlAnsw .= "$chl-$pw";
  19. $chlAnsw =~ s/(.)/$1.chr(0)/eg; # works probably only with ascii
  20. $chlAnsw = "$chl-".lc(md5_hex($chlAnsw));
  21. if($data =~ m/iswriteaccess/) { # Old version
  22. my @d = ( "login:command/response=$chlAnsw",
  23. "getpage=../html/de/internet/connect_status.txt" );
  24. $data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
  25. $data = GetFileFromURL("http://$host/cgi-bin/webcm", undef, $data, 1);
  26. my $isOk = ($data =~ m/checkStatus/);
  27. return $isOk;
  28. } else { # FritzOS >= 5.50
  29. my @d = ( "response=$chlAnsw", "page=/login_sid.lua" );
  30. $data = join("&", map {join("=", map {urlEncode($_)} split("=",$_,2))} @d);
  31. my $url = "http://$host/login_sid.lua";
  32. $url .= "?username=$user" if($user);
  33. $data = GetFileFromURL($url, undef, $data, 1);
  34. my $sid = $1 if($data =~ /<SID>(\w+)<\/SID>/i);
  35. $sid = undef if($sid =~ m/^0*$/);
  36. return $sid;
  37. }
  38. }
  39. sub
  40. FB_checkPw(@)
  41. {
  42. my ($host, $p1, $p2) = @_;
  43. my $user = ($p2 ? $p1 : ""); # Compatibility mode: no user parameter
  44. my $pw = ($p2 ? $p2 : $p1);
  45. my $now = time();
  46. return 1 if($lastOkPw eq $pw &&
  47. $lastOkUser eq $user &&
  48. $lastOkHost eq $host &&
  49. ($now - $lastOkTime) < 300); # 5min cache
  50. if(FB_doCheckPW($host, $user, $pw)) {
  51. $lastOkPw = $pw;
  52. $lastOkUser = $user;
  53. $lastOkTime = $now;
  54. $lastOkHost = $host;
  55. return 1;
  56. } else {
  57. return 0;
  58. }
  59. }
  60. ######## FB_mail ##################################################
  61. # What : Sends a mail
  62. # Call : { FB_mail('empfaenger@mail.de','Subject','text 123') }
  63. # Source: http://www.fhemwiki.de/wiki/E-Mail_senden
  64. # Prereq: - FB7390 needs fhem-installation from fhem.de; installation from AVM will _not_ work (chroot)
  65. # - In FritzBox, Push-Service needs to be active
  66. sub
  67. FB_mail($$$)
  68. {
  69. my ($rcpt, $subject, $text) = @_;
  70. my $tmpfile = "fhem_nachricht.txt";
  71. system("/bin/echo \'$text\' > \'$tmpfile\' ");
  72. system("/sbin/mailer send -i \"$tmpfile\" -s \"$subject\" -t \"$rcpt\"");
  73. system("rm \"$tmpfile\"");
  74. Log 3, "Mail sent to $rcpt";
  75. }
  76. ######## FB_WLANswitch ############################################
  77. # What : Switches WLAN on or off
  78. # Call : { FB_WLANswitch("on") }
  79. # Source: http://www.fhemwiki.de/wiki/Fritzbox:_WLAN_ein/ausschalten
  80. sub
  81. FB_WLANswitch($) {
  82. my $cmd = shift;
  83. my $ret = "";
  84. if ($cmd =~ m/on/i) { # on or ON
  85. $ret .= "ATD:".fhemNc("127.0.0.1:1011", "ATD#96*1*\n", 1);
  86. sleep 1 ;
  87. $ret .= " ATH:".fhemNc("127.0.0.1:1011", "ATH\n", 1);
  88. }
  89. if ($cmd =~ m/off/i) { # off or OFF
  90. $ret .= "ATD:".fhemNc("127.0.0.1:1011", "ATD#96*0*\n", 1);
  91. sleep 1 ;
  92. $ret .= " ATH:".fhemNc("127.0.0.1:1011", "ATH\n", 1);
  93. }
  94. $ret =~ s,[\r\n]*,,g; # remove CR from return-string
  95. Log 3, "FB_WLANswitch($cmd) returned: $ret";
  96. }
  97. 1;