FritzboxSID

Erstellen der SID einer AVM FritzBox, um verschiedene Operationen über Query (z.B. Neustart, IP-Wechsel) durchzuführen in Ruby

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /usr/bin/env ruby
# -*- coding: UTF-8 -*

require 'rubygems'
require 'digest/md5'
require 'net/http'

class FritzBox
  def initialize(ipfritz,key)
    @net   = Net::HTTP.new(ipfritz)
    @dig   = Digest::MD5.new
    @key   = key
    @sid   = nil
    @start = Time.now # for the 20 minutes timeout
  end

  def getSID
    if Time.now-@start > 1200 or @sid.nil?
      uri     = "/login_sid.lua"
      xmlcont = @net.get(uri).body
      sid     = xmlcont.scan(/<SID>(.+)<\/SID>/).flatten.join

      if sid=="0000000000000000"
        challenge = xmlcont.scan(/<Challenge>(.+)<\/Challenge>/).flatten.join
        md5       = @dig.hexdigest("#{challenge}-#{@key}".encode('utf-16le'))
        username  = ''
        uri       = "/login_sid.lua?username=%s&response=%s-%s" % [username,challenge,md5]
        xmlcont   = @net.get(uri).body
        sid       = xmlcont.scan(/<SID>(.+)<\/SID>/).flatten.join
      end
      @sid   = sid
    end
    @start = Time.now
  end

  def getMyIP
    getSID
    uri     = "/internet/inetstat_monitor.lua?sid=%s" % [@sid]
    webcont = @net.get(uri).body
    myip    = webcont.scan(/IP-Adresse: (.*)<.span/).flatten.join
  end

  def ipreset
    getSID
    myoldip = getMyIP
    uri     = "/internet/inetstat_monitor.lua?sid=%s&useajax=1&action=disconnect" % @sid
    webcont = @net.get(uri).body
    sleep 15
    puts "old IP: #{myoldip}"
    puts "new IP: #{getMyIP}"
  end
end

if __FILE__==$0
  fb=FritzBox.new("192.168.1.1","secret")
  puts fb.getMyIP
end
6. März 2017 11:59:19
© 2017. Thomas Buschhardt. Some Rights Reserved. Alle hier genannten Marken sind Eigentum der jeweiligen Inhaber.