FritzBoxUtils.pm 3.5 KB

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