Anfrage auf Anpassung eines Codes

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
flamburion
User
Beiträge: 1
Registriert: Freitag 5. Juli 2013, 19:52

Hallo

ich bin eigentlich kein Programmierer und es liegt mir auch nicht wirklich. Daher möchte ich hier einmal anfragen, ob sich jemand bereit erklärt mir ein klein wenig Arbeit abzunehmen. Für Euch ist es vermutlich eine Sache von 10min, was mich vermutlich mehrere Wochen dauert bis ich dazu in der Lage bin.

Ich betreibe derzeit einen Blog und verwende dort ein Script welches über Nagios, Daten aus einer FritzBox ausliesst. Leider ist diese Ausgabe nicht gefiltert, so dass man alles erhält, aber Nagios und der User eher wenig damit anfangen können. Dieser bereits vorhandene aber unfertige Code scheint mir derzeit die einzig herumschwebende Variante zu sein. Das ganze Thema ist sowieso etwas mager aufgebaut und die Beiträge die man findet, scheinen alle nicht 100% zu funktionieren. Gedacht ist das ganze für Linux Maschinen wie Debian und Python.

Hier einmal das unvollendete Codestück

Code: Alles auswählen

#!/usr/bin/env python

from SOAPpy 
import SOAPProxy
print SOAPProxy(proxy='http://192.168.178.254:49000/upnp/control/WANCommonIFC1',
                namespace='urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1',
                soapaction='urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1#GetCommonLinkProperties',
                noroot=True).GetDSLLinkInfo()

Das gibt mir die Print-Funktion derzeit aus:

Code: Alles auswählen

<SOAPpy.Types.structType GetCommonLinkPropertiesResponse at 3071752396>: {'NewPhysicalLinkStatus': 'Up', 'NewLayer1DownstreamMaxBitRate': '0', 'NewWANAccessType': 'DSL', 'NewLayer1UpstreamMaxBitRate': '0'} 
Hier ein bereits vollendetes Script, welches die externe IP-Adresse sowie einen Status an Nagios übergibt:

Code: Alles auswählen

#!/usr/bin/env python

import os, sys

import pycurl
import libxml2

class Response:
    def __init__(self):
        self.contents = ''
    def body_callback(self, buf):
        self.contents = self.contents + buf

# use your IP here!
url = "http://192.168.178.254:49000/upnp/control/WANIPConn1"
if len(sys.argv) > 1:
   url = sys.argv[1]

data = """
<?xml version="1.0"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" 
  s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
   <s:Body> 
      <u:GetStatusInfo xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" /> 
   </s:Body> 
</s:Envelope>"""

r = Response()
c = pycurl.Curl()
try:
    try:
        c.setopt(pycurl.URL, url)
        c.setopt(pycurl.POST, 1)
        c.setopt(pycurl.POSTFIELDS, data)
        c.setopt(pycurl.INFILESIZE, len(data))
        c.setopt(pycurl.WRITEFUNCTION, r.body_callback)
        c.setopt(pycurl.CONNECTTIMEOUT, 30)
        c.setopt(pycurl.TIMEOUT, 300)
        c.setopt(pycurl.HTTPHEADER, ['SOAPACTION: "urn:schemas-upnp-org:service:WANIPConnection:1#GetStatusInfo"', 'CONTENT-TYPE: text/xml;', 'User-Agent: nagios'])
        c.perform()
    except:
        print "ERROR - HTTP request to UPNP server not possible"
        sys.exit(2)
finally:
    c.close()

exitcode = 2
try:
    try:
        doc = libxml2.parseDoc(r.contents)
        ctxt = doc.xpathNewContext()
        ctxt.xpathRegisterNs('s',"http://schemas.xmlsoap.org/soap/envelope/")
        ctxt.xpathRegisterNs('u',"urn:schemas-upnp-org:service:WANIPConnection:1")
        elements = ctxt.xpathEval('/s:Envelope/s:Body/u:GetStatusInfoResponse/NewConnectionStatus')
        state = elements[0].content
        elements = ctxt.xpathEval('/s:Envelope/s:Body/u:GetStatusInfoResponse/NewUptime')
        uptime = elements[0].content
        print "OK - %s: uptime: %ss" % (state, uptime)
        if state == "Connected":
            exitcode = 0
        else:
            exitcode = 1
    finally:
        doc.freeDoc()
except:
    print "ERROR - cannot parse UPNP response or response invalid"

sys.exit(exitcode)


Ich hoffe das man eventuell das letzte Script einfach anpassen kann und einfach nur die Adresse welche per U-PnP abgefragt werden, sowie die Ergebnisse ähnlich einer GREP-Funktion (aus Linux) filtern könnte. Hier wäre die gewünschte Ausgabe UP, wiederzufinden unter 'NewPhysicalLinkStatus': 'Up'.

Falls weiteres Hintergrundwissen benötigt wird, könnt ihr eventuell ein Blick hier rauf werfen:
http://terranas.qcloudnas.com/wordpress ... berwachen/
aber haut mich bitte nicht für diese schlechte Übersicht, ich suche noch nach geeigneten Shortcodes.

Ich plane dann mit Hilfe eures Codes, weitere Scripte daraus zu erstellen, da die Nachfrage nach solchen Scripten wohl nicht gerade wenig ist. Euren Code würde ich dann auch in meinem Blog veröffentlichen wollen, sowie die Modifikationen.

Ich bin auch bereit, mit eurer Hilfe diesen Code selber zu schreiben, ich möchte nur dazu sagen, dass ich kein Freund der Programmierung bin auch wenn ich mich mit HTML, CSS, PHP und ein wenig mit C auskenne. Ich habe auch Verständnis dafür wenn sich niemand bereit erklärt für einen anderen die Arbeit zu machen, nur weil dieser zu "faul" ist. Es würde mir eventuell schon weiterhelfen, das Script zu verstehen. Die Abfragen bezüglich der URI / URL's verstehe ich schon, stocke hier aber ganz klar beim Filtern und zurückgeben der Ergebnisse via Print.


mit freundlichen Grüßen
Marcel
Zuletzt geändert von Anonymous am Freitag 5. Juli 2013, 21:19, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Antworten