.titleBar { margin-bottom: 5px!important; }

Fritzbox7050 change Port mit Phyton Script

Dieses Thema im Forum "AVM" wurde erstellt von fritz_er, 11 März 2009.

  1. fritz_er

    fritz_er Neuer User

    Registriert seit:
    11 März 2009
    Beiträge:
    1
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    #1 fritz_er, 11 März 2009
    Zuletzt von einem Moderator bearbeitet: 11 März 2009
    Hallo Leute, ich hab das selbe vor wie der der das Script auf die http://www.wehavemorefun.de/fritzbox/index.php/Fritzbox-change-port.py gestellt hat allerdings hab ich echt keine Ahnung von Phyton.

    Hab mir den Interpreter für Windows gedownloadet Vers.3.0, und auch schon etwas probiert.
    Ich weiß aber nicht so recht was ich ändern muss bzw. wo ich es ändern muss.

    Will nur das sich die IP für ein bestimmtes Port mit dem Script ändert, mehr nicht. Hab auch keine Passwort abfrage in meiner Fritzbox und hab das in dem Script auskommentiert.
    Wenn ich allerdings die Regel konfiguriere und es ausführe bringt er immer Invaild Syntax.

    Vielleicht könnt ihr mir da Weiterhelfen da ich keine nähere Beschreibung zu dem Script gefunden habe.

    Script:
    Code:
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    #
    # Verändert die Ziel-IP der Portforwarding der Fritz-Box für HTTP und HTTPS.
    #
    # HINWEIS: Um rauszufinden, welche Daten tatsächlich gesendet werden, muss ein
    #   Paketsniffer (z.B. Wireshark) verwendet werden. Dabei reicht es, sich die 
    #   POST-Daten beim Login und beim Speichern einer Portfreigabe anzusehen.
    #
    # Copyright (c) 2008 Sebastian Krysmanski
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy 
    # of this software and associated documentation files (the "Software"), to deal 
    # in the Software without restriction, including without limitation the rights 
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
    # copies of the Software, and to permit persons to whom the Software is 
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in all
    # copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
    # SOFTWARE.
    #
    
    import urllib
    import re
    import sys
    
    # URL zum Fritz-Box-Web-Interface
    FRITZBOX_URL = "http://fritz.box/cgi-bin/webcm"
    # URL zur UPnP-Desc-Datei der FritzBox
    FRITZBOX_UPNP_INFO_URL = "http://fritz.box:49000/igddesc.xml"
    # Liste aller unterstützten Versionen
    SUPPORTED_VERSIONS = ("29.04.67")
    
    def GetFritzBoxVersion():
      socket = urllib.urlopen(FRITZBOX_UPNP_INFO_URL)
      lines = socket.readlines()
      socket.close()
    
      fritzVersion = None
      for line in lines:
        result = re.search(r"<friendlyName>.+\(UI\) ([^<]+)</friendlyName>", line)
        if result:
          fritzVersion = result.group(1)
          break
    
      return fritzVersion
    
    
    def CallFritzBox(data):
      enc_data = urllib.urlencode(data)
      socket = urllib.urlopen(FRITZBOX_URL, enc_data)
      lines = socket.readlines()
      socket.close()
      return lines
      
    def Login(password):
      # Daten zum Anmelden per Passwort an die Fritzbox
      # Quelle: Werden gesendet, wenn ein Passwort auf der Startseite eingegeben wird.
      data = { 
          'getpage' : '../html/index_inhalt.html',
          'errorpage' : '../html/index_inhalt.html',
          'var:pagename' : 'home',
          'var:menu' : 'home',
          'login:command/password' : password
        }
    
      line = "".join(CallFritzBox(data))
      result = re.search(r"<p class=\"errorMessage\">(.+?)</p>", line)
      if result:
        # Es ist ein Fehler aufgetreten; Nachricht zurückgeben
        errorMsg = result.group(1)
        errorMsg = errorMsg.replace("FEHLER: ", "")
        return errorMsg
    
      return None
    
      
    def ChangePortForwardingRule(ruleNumber, isActivated, name, protocol, port, endport, toIP, toPort):
      # Daten zum Ändern eines Ports
      # Quelle: Wenn man die Änderungen an einer Portweiterleitung speichert (also
      #   nach dem Eingeben der neuen Informationen).
      ruleID = 'rule' + str(int(ruleNumber))
      data = { 
          'getpage' : '../html/de/menus/menu2.html',
          'errorpage' : '../html/de/menus/menu2.html',
          'var:pagename' : 'portfw',
          'var:errorpagename' : 'portrule',
          'var:menu' : 'internet',
          'var:rule' : ruleID,
          'var:isnew' : '0',
          'var:isexp' : '0',
          'forwardrules:settings/' + ruleID + '/activated' : '1',
          'forwardrules:settings/' + ruleID + '/description' : name,
          'forwardrules:settings/' + ruleID + '/protocol' : protocol,
          'forwardrules:settings/' + ruleID + '/port' : port,
          'forwardrules:settings/' + ruleID + '/endport' : endport,
          'forwardrules:settings/' + ruleID + '/fwip' : toIP,
          'forwardrules:settings/' + ruleID + '/fwport' : toPort
        }
      CallFritzBox(data)
      
    #
    # Main-Sektion
    #
    
    if len(sys.argv) != 3:
      print("Verwendung: " + sys.argv[0] + " <Passwort> <ToIP>")
      sys.exit(1)
    
    # Nach FritzBox-Version suchen
    print "Prüfe FritzBox-Version"
    fritzVersion = GetFritzBoxVersion()
    
    if fritzVersion == None:
      print "Error: Die Version der FritzBox konnte nicht ermittelt werden."
      sys.exit(1)
    if fritzVersion not in SUPPORTED_VERSIONS:
      print "Error: Nicht unterstützte FritzBox-Version: " + fritzVersion
      sys.exit(1)
    
    print "Unterstützte Version gefunden: " + fritzVersion
    
    print "Einloggen..."
    errorMsg = Login(sys.argv[1])
    if errorMsg != None:
      print "Es ist ein Fehler beim Login aufgetreten:"
      print errorMsg
      sys.exit(1)
    
    # Portforwardings umlegen
    print "Ändere Portforwarding 'HTTP-Server'..."
    ChangePortForwardingRule(0, True, 'HTTP-Server', 'TCP', 80, 80, sys.argv[2], 80)
    print "Ändere Portforwarding 'HTTPS-Server'..."
    ChangePortForwardingRule(1, True, 'HTTPS-Server', 'TCP', 443, 443, sys.argv[2], 443)
    
    print "Fertig"
    
    Ps.: Bin mir nicht sicher ob es für meine Fritzbox 7050 mit aktueller Firmare überhaupt geht da er es uhrsprünglich für eine andere Fritzbox programmiert hat.

    Vielen Dank