Ankündigung

Einklappen
Keine Ankündigung bisher.

HSL - keine Ausführung im HS.

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    HS/FS HSL - keine Ausführung im HS.

    Ich brauche mal etwas Hilfe, wenn ich das ganze über den debugger starte, funktioniert es. Im HS funktioniert das ganze nicht. Wo ist mein Fehler ?

    ---


    # Kompilieranweisung: python 11202_Digestauth.py
    import base64
    import marshal
    import re
    import md5

    #doByteCode=False
    doByteCode=True
    LOGIKNAME="digestauth"
    LOGIKID="11202"
    VERSION=""
    LOGIKFILE=LOGIKID+"_"+LOGIKNAME+VERSION
    LOGIK = """

    5000|"digest auth"|0|6|"E1 User"|"E2 Password"|"E3 IP"|"E4 URL"|"E5 Get-Param"|"E6 Param2"|1|"A1 Result"|"v1.1"

    # Anzahl Eingaenge | #Ausgaenge | #Zeitspeicher | #Speichervariablen | #Berechung bei init | Kodierter Formel
    5001|6|1|0|0|1

    #Definition der Eingaenge:
    5002|1|""|1
    5002|2|""|1
    5002|3|""|1
    5002|4|""|1
    5002|5|""|1
    5002|6|""|1


    #5004|Ausgang|Init.-Wert|Binaer|Typ|Datenformat
    5004|1|""|0|1|0

    """

    code = """
    global urllib2
    import urllib2

    debugurl = ""
    def authfetch(username,password,url,path,param,param2) :
    #print username

    auth = urllib2.HTTPPasswordMgrWithDefaultRealm()
    auth.add_password (None, url, username, password)

    opener = urllib2.build_opener(urllib2.HTTPBasicAuthHandler( auth), urllib2.HTTPDigestAuthHandler(auth))
    urllib2.install_opener(opener)

    req = ""
    if (len(path)>0):
    req += path
    if (len(param)>0):
    req += "?" + param;
    if (len(param2)>0):
    req += param2
    try:
    debugurl = url + req
    page_content = urllib2.urlopen(url + req)
    return (page_content.code)
    except urllib2.HTTPError, e:
    #print url + "?" + param
    return (e.code)

    if (len(EN[1])> 0 and len(EN[2])>0 and len(EN[3])>0 ):
    AN[1] = authfetch (EN[1], EN[2], EN[3], EN[4], EN[5],EN[6])
    AC[1] = 1


    """

    if doByteCode:
    data=compile(code,"<string>","exec")
    data=marshal.dumps(data)

    #5012|Ende Ausf.|Bedingung|Formel|Zeitformel|Ausgang|Zeitspei cher|Speichervar|Neg.Ausgang

    formel = "5012|0|"EC[1]"|"eval(__import__('marshal').loads(__import__('ba se64').decodestring('"+re.sub("\n","",base64.encod estring(data))+"')))"|""|0|0|0|0"
    else:
    formel = "5012|0|"EC[1]"|"eval(compile(__import__('base64').decodestring( '"+re.sub("\n","",base64.encodestring(code))+"'),' <string>','exec'))"|""|0|0|0|0"

    open(LOGIKFILE+".hsl",'w').write(LOGIK+"\n"+formel +"\n")
    print "File "" + LOGIKFILE + "" created"


    #2
    evtl. liegt es am überflüssigen marshal. Das brauchst du ja eigentlich nur wenn du den code (geheim) halten willst. Dadurch bindest du dich an die Python Version.

    Das "global"'n würde ich auch nicht unbedingt machen.
    Nils

    aktuelle Bausteine:
    BusAufsicht - ServiceCheck - Pushover - HS-Insight

    Kommentar


      #3
      Moin,

      der Fehler muss irgendwo anders sein. Vielleicht hab ich auch einen generellen Fehler in meinem Ansatz. Ich möchte eigentlich nur eine URL ausgeführt haben, die eine Digestauthentifizierung vorher benötigt. Dazu soll die Routine ausgeführt werden, wenn am Eingang was ändert.

      Anbei die "geänderte" version, die immer noch nicht funktioniert. Die Marshal-Geschichte hatte ich von einem deiner Skripte übernommen, ist jetzt ausgeschaltet.

      Über den Textselektor übergebe ich verschiedene PTZ-Positionen, die dann per http-get (und Digestauth) an die Kamera übergeben werden sollen.

      /edit: hab hier 2 Bilder noch eingefügt, das erste Bild ist richtig, das zweite bitte ignorieren, dort hatte ich die falsche Eingangsvariable verwendet, aber selbst mit der richtigen funktioniert es nicht...

      # Kompilieranweisung: python 11202_Digestauth.py
      # Debuggen: python LogikGen.py -d -i 11202_digestauth.hsl
      #
      # en[1]="admin"
      # en[2]="test0815"
      # en[3]="http://192.168.1.150"
      # en[4]="/stw-cgi/ptzcontrol.cgi"
      # en[5]="msubmenu=preset&action=control&PresetName="
      # en[6]="Gartenhaus"

      import base64
      import marshal
      import re
      #import md5

      #doByteCode=False
      doByteCode=False
      LOGIKNAME="digestauth"
      LOGIKID="11202"
      VERSION=""
      LOGIKFILE=LOGIKID+"_"+LOGIKNAME+VERSION
      LOGIK = """

      5000|"digest auth"|0|6|"E1 User"|"E2 Password"|"E3 IP"|"E4 URL"|"E5 Get-Param"|"E6 Param2"|1|"A1 Result"|"v1.1"

      # Anzahl Eingaenge | #Ausgaenge | #Zeitspeicher | #Speichervariablen | #Berechung bei init | Kodierter Formel
      5001|6|1|0|0|1

      #Definition der Eingaenge:
      5002|1|""|1
      5002|2|""|1
      5002|3|""|1
      5002|4|""|1
      5002|5|""|1
      5002|6|""|1


      #5004|Ausgang|Init.-Wert|Binaer|Typ|Datenformat
      5004|1|""|0|1|0

      """

      code = """
      #import urllib2
      #global urllib2

      debugurl = ""
      def authfetch(username,password,url,path,param,param2) :
      #print username

      auth = __import__('urllib2').HTTPPasswordMgrWithDefaultRe alm()
      auth.add_password (None, url, username, password)

      opener = __import__('urllib2').build_opener(__import__('url lib2').HTTPBasicAuthHandler(auth), __import__('urllib2').HTTPDigestAuthHandler(auth))
      __import__('urllib2').install_opener(opener)

      req = ""
      if (len(path)>0):
      req += path
      if (len(param)>0):
      req += "?" + param;
      if (len(param2)>0):
      req += param2
      try:
      debugurl = url + req
      page_content = __import__('urllib2').urlopen(url + req)
      return (page_content.code)
      except __import__('urllib2').HTTPError, e:
      #print url + "?" + param
      return (e.code)

      if (len(EN[1])> 0 and len(EN[2])>0 and len(EN[3])>0 ):
      AN[1] = authfetch (EN[1], EN[2], EN[3], EN[4], EN[5],EN[6])
      AC[1] = 1


      """

      if doByteCode:
      data=compile(code,"<string>","exec")
      data=marshal.dumps(data)

      #5012|Ende Ausf.|Bedingung|Formel|Zeitformel|Ausgang|Zeitspei cher|Speichervar|Neg.Ausgang

      formel = "5012|0|"EC[6]"|"eval(__import__('marshal').loads(__import__ ('ba se64').decodestring('"+re.sub("\n","",base64.encod estring(data))+"')))"|""|0|0|0|0"
      else:
      formel = "5012|0|"EC[6]"|"eval(compile(__import__('base64').decodestr ing( '"+re.sub("\n","",base64.encodestring(code))+"' ),' <string>','exec'))"|""|0|0|0|0"

      open(LOGIKFILE+".hsl",'w').write(LOGIK+"\n"+formel +"\n")
      print "File "" + LOGIKFILE + "" created"
      You do not have permission to view this gallery.
      This gallery has 2 photos.
      Zuletzt geändert von sipiyou; 03.10.2015, 04:40.

      Kommentar


        #4
        Hi,

        erste Idee

        Code:
            global socket
            import socket
            if not hasattr(socket,"_hs_dnsresolver"):
                ## alltes getaddrinfo speichern
                socket._socket_getaddrinfo = socket.getaddrinfo
                ## den HS internen Resolver an das socket Modul binden
                socket._hs_dnsresolver = self.MC.DNSResolver.getHostIP
                ## neue getaddrinfo Funktion
                def _hsgetaddrinfo(host, port, family=0, socktype=0, proto=0, flags=0): 
                    return socket._socket_getaddrinfo(socket._hs_dnsresolver(host),port, family,socktype,proto,flags)
                ## und die alte gegen die neue ersetzen
                socket.getaddrinfo = _hsgetaddrinfo
        füg das mal in deinen code vor allem anderen ein.

        Das Linux des Homeservers startet ja ohne Netzwerk Konfiguration, sprich (resolv.conf) die Namensauflösung der Standard Libraries funktionieren daher nicht so ohne weiteres. Im nachhinein gestartete Prozesse könnte man durch vorheriges erstellen einer resolv.conf funktionsfähig machen. Die hs_main jedoch nicht, daher tauschen wir die low-level Funktion im socket Modul einfach aus, die von den anderen Modulen verwendet wird.

        lg Nils
        Nils

        aktuelle Bausteine:
        BusAufsicht - ServiceCheck - Pushover - HS-Insight

        Kommentar


          #5
          Moin,

          Danke, dass du dir Zeit nimmst!

          Leider immer noch keine Änderung. Die Resolv.conf brauch ich ja nur, wenn ich URL's eingebe, die aufgelöst werden sollen - das ist denke ich im zweiten Step interessant.
          Aktuell verwende ich statische IP-Adressen, wofür keine Auflösung notwendig ist.

          Was mich wundert ist, dass in der HS-Debug-Seite (Event-Dir) auch keinerlei traces da sind - oder ist das richtig ? Ich hab irgendwie das Gefühl, dass die Routine überhaupt nicht ausgegeben wird. Ist mein trigger ggf. falsch ?

          wenn ich das im Debugger ausführe, dann muss ich dort "run" ausführen, bei autorun 1 und anschliessende änderung von EN[6] passiert nichts. Also:

          -------- funktioniert:
          en[1]="admin"
          en[2]="test0815"
          en[3]="http://192.168.1.150"
          en[4]="/stw-cgi/ptzcontrol.cgi"
          en[5]="msubmenu=preset&action=control&PresetName="
          en[6]="Gartenhaus"

          run
          --------
          autorun 1
          en[1]="admin"
          en[2]="test0815"
          en[3]="http://192.168.1.150"
          en[4]="/stw-cgi/ptzcontrol.cgi"
          en[5]="msubmenu=preset&action=control&PresetName="
          en[6]="Gartenhaus"

          passiert nichts.

          /EDIT: Alles zurück. Es funktioniert jetzt. Wie immer sitzt der Fehler direkt vor dem PC... Hab im Logikeditor anstelle einen Punkt in der IP "vergessen" gehabt... hachja...

          Vielen, vielen, vielen Dank! Ich werd das Modul demnächst hier auch veröffentlichen, selbst Axis hat auf Digest-Auth umgestellt, d.h. wenn jemand per Commandos festgelegte Pan-Positionen abfahren will, kommt mit dem HS nicht weiter.
          Zuletzt geändert von sipiyou; 28.02.2016, 09:53.

          Kommentar


            #6
            Hast du dies bereist mit Axis getestet?

            Gr. Frans

            Kommentar


              #7
              Hi,

              ja, funktioniert auch bei Axis. Das ganze funktioniert bei allen Systemen, die eine Digest-Authentifizierung benötigen.

              Im Download-Bereich kannst du die "finale" version herunterladen:

              http://service.knx-user-forum.de/?co...nload&id=11202

              Kommentar


                #8
                Hallo,

                Ich habe deinen Beitrag gefunden, nach der Suche sich mit DIGEST auf einer Website anzumelden, ich versuche nun schon mit allen Tricks mich auf meinem Pellet-Kessel von Windhager einzuloggen um diverse Daten auszulesen (Es gibt bereits fertige Bausteine für Ochsner Wärmepumpen, jedoch passen die einfach nicht, da hier eine andere Authentifizierung angewandt wird.). Kurz zu meinem Dilemma:

                Ich möchte folgende Seite aufrufen:

                http://192.168.100.139/api/1.0/looku...nt=10&offset=0

                Diese Seite erfordert einen Login (DIGEST-Verschlüsselt)

                Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
                Accept-Encoding: gzip, deflate
                Accept-Language: de,en-US;q=0.7,en;q=0.3
                Authorization: Digest username="Service", realm="RC7000", nonce="mgPqDGVnBQA=9d5ae600f38a9dc8fba6323f0553398 b97104127", uri="/api/1.0/lookup/1/15/0/0/4/0?count=10&offset=0", algorithm=MD5, response="6004bbe1a6a045af04e62caeb1c01df7", qop=auth, nc=00000003, cnonce="ddc5a00d3c19a21b"
                Cache-Control: max-age=0
                Connection: keep-alive
                Host: 192.168.100.139
                Upgrade-Insecure-Requests: 1
                User-Agent: Mozilla/5.0 (Windows NT 6.1


                Sollte das mit deinem Baustein funktionieren? Ich habe es bereits versucht, jedoch leider ohne Erfolg... Vielleicht kann mir jemand weiterhelfen?

                LG PETER

                Kommentar

                Lädt...
                X