FritzBoxUtils.pm 3.4 KB

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