(IRC Service Webinterface) Implementierung in PHP + XMLRPC

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
MyJohnny
User
Beiträge: 5
Registriert: Donnerstag 28. Januar 2010, 13:35

Hallöchen liebes Forum!

Zunächst einmal, ich bin ganz neu hier und auch ganz neu in Python.
Ich hatte früher damit eigentlich nie was zu tun, da ich mehr so der Java, C++ und PHP etc. typ bin/war. Aber jetzt muss ich mich damit auseinander setzen, da ich vor einem größeren Projekt gestellt wurde.
Ich hab mir einige Sachen von Python angeschaut und das was Python kann ist eigentlich sehr gut und ich hab mich auch entschlossen nun diese Sprache Schritt für Schritt zu erlenen.

Ich bin zuständig für ein IRC Netzwerk eine Hauptseite zu erstellen. Das ist das geringste Problem, nimmt zwar viel Zeit in Anspruch, aber machbar ist es!
Wie euch bestimmt bekannt ist gibt es in jedem IRC Netzwerk sog. Services wie OperServ, MemoServ etc.
Als Software haben die Betreiber "Atheme IRC Services" installiert und dazu gibt es auch ein Webinterface in Python geschrieben.

Da ich aber jetzt die Seite in PHP erstellen möchte muss ih das ganze Interface umschreiben. Ein bisschen durchgeblickt hab ich schon.

Python erstellt eine Verbindung mit dem XMPRPC Service des Servers und schickt alle Befehle dorthin. Jedoch wird mir nirgendswo klar, WIE diese Verbindung auszusehen hat, welche Befehle übermittelt werden um die Verbindung einzuleiten, welche Parameter wann gesendet werden um sich überhaupt anzumelden. Kurzerhand habe ich nach einem Modul für PHP gesucht: die XMLRPC Library aber dort konnte ich keine "create connection" Funktion o.ä. sehen.. und deshalb bin ich sehr verwirrt.

Und ein weiteres Problem ist: in einer Datei wird immer:
self.parent.atheme.command (...) aufgerufen, aber ich finde NIRGENDS wie diese Funktion aussieht.. wenn ich wüsste, wie diese Funktion aussieht dann wär ich auch schonmal ein ganzes stückchen weiter.

Es wäre nett, wenn ihr mir helfen könntet.. denn ich suche bereits seit gestern mittag nach der Implementierung dieser Funktion.

Das einzige was ich wissen möchte ist wie gesagt, wie Python diese Verbindung aufbaut und wie diese command () funktion aussieht.

Hier ist ein kleiner Teil des Sourcecodes:

Code: Alles auswählen

middleware.athemeconnection.py
class AthemeXMLConnection(object):
    def __init__(self, url):
        self.proxy = ServerProxy(url)
        self.chanserv = AthemeChanServMethods(self)
        self.memoserv = AthemeMemoServMethods(self)
        self.nickserv = AthemeNickServMethods(self)

    def __getattr__(self, name):
        return self.proxy.__getattr__(name)

    def login(self, username, password):
        self.username = username
        self.authcookie = self.atheme.login(username, password)
Hier ist auch wieder diese Sache mit self.atheme.login () ...
Ich kann nicht sehen, dass die Login funktion irgendwo implementiert worden ist.. :(

Und hier ist die Sache mit der command () methode:

Code: Alles auswählen

    def delete(self, message_id):
        self.parent.atheme.command(self.parent.authcookie, self.parent.username, '0.0.0.0', 'MemoServ', 'DELETE', message_id)
Ich kann nicht nachvollziehen wo ich self.parent.atheme finden kann, dnen wie es aussieht wird ja von dort alles aufgerufen.


Ihr würdet mir einen RIESEN gefallen tun, wenn ihr mir hierbei helfen könntet!

Hier sind die ganzen Dateien (12 Stück oder so glaub ich), die zum Webinterface gehören:

http://hg.atheme.org/atheme-web/atheme- ... 8f3609b1ac

* EDIT *
Ich bin jetzt in PHP schlauer geworden, es gibt doch die Funktion
xmlrpc_encode_request. Wenigstens bin ich einen kleinen Schritt schonmal weiter :)
* * * * *


Bin für jede Hilfe dankbar!
Mit freundlichem Gruß

Johnny
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

`.atheme` wird in dem Code gar nicht definiert (auf den ersten Blick zumindest):

Code: Alles auswählen

~$ hg clone http://hg.atheme.org/atheme-web
...
~$ cd atheme-web/
~/atheme-web$ grep -nHIir -- atheme\s*= .
Keine `.atheme`-Zuweisung im Code vorhanden. Gib doch mal `.atheme` aus.
MyJohnny
User
Beiträge: 5
Registriert: Donnerstag 28. Januar 2010, 13:35

Danke für deine Antwort erstmal.

Ich muss dazu sagen ich hab noch kein Python bei mir installiert o.ä.
Wollte mir erstmal den Code anschauen und probieren den sofort in PHP. Tut mir leid :(

Wie kann es sein, dass wenn .atheme nicht definiert ist, man trotzdem darauf zugreifen kann?
Ich habe in den repositories nachgeguckt und folgendes unter "atheme" gefunden:

http://hg.atheme.org/atheme/atheme/file/54886689c61b

Kann doch aber nicht sein, dass Python ein C Script aufruft? Wobei es nicht mal definiert ist?


Was brauchst du denn genau? also was genau soll `.atheme` liefern?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Letztendlich sieht es so aus, dass in ``AthemeXMLConnection`` ein ``__getattr__`` definiert ist, der alle Zugriffe darauf über den in Zeile 216 angelegten ``ServerProxy`` leitet.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Hallo!

Auf den ersten Blick würde ich sagen, dass in der Klasse AthemeXMLConnection durch:

Code: Alles auswählen

 
def __getattr__(self, name):
    return self.proxy.__getattr__(name) 
der Lookup an self.proxy "weitergeleitet" wird.
Hierzu http://docs.python.org/reference/datamo ... _getattr__

Dies wird weiter oben durch

Code: Alles auswählen

self.proxy = ServerProxy(url)
aus dem durch

Code: Alles auswählen

from xmlrpclib import ServerProxy
importierten Modul xmlrpclib instanziiert.
Ich denk da gehts dann weiter.....
Natürlich ohne Gewähr, da ich selber noch Anfänger bin... :roll:

Grüßle...

EDIT: Da war ich wohl zu langsam.... :)
MyJohnny
User
Beiträge: 5
Registriert: Donnerstag 28. Januar 2010, 13:35

Aah, ok jetzt seh ich das auch.

Die Funktionen command(), login() etc. müssen doch aber irgendwo definiert sein? Der Server Proxy nimmt die Requests an, aber der ServerProxy wird ja nirgendswo definiert..

Ich möchte gerne wissen, was diese Funktionen genau an den Server schicken und in welcher Reihenfolge. Wenn ich das in PHP umsetzt muss ich ja ebenfalls eine login() methode schreiben..

Kann ich mir den source der Funktionen command() etc. irgendwo anschauen?

Ich hab noch was vergessen zu sagen..
ich weiß, dass der ServeProxy eine lib ist:

class xmlrpclib.ServerProxy(uri[, transport[, encoding[, verbose[, allow_none[, use_datetime]]]]])
Mich würds halt gerne interessieren wie diese funktionen aussehen im inneren damit ich mit PHP auch direkt die ganzen Services wie NickServ etc. ansteuern kann :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

MyJohnny hat geschrieben:Die Funktionen command(), login() etc. müssen doch aber irgendwo definiert sein? Der Server Proxy nimmt die Requests an, aber der ServerProxy wird ja nirgendswo definiert..
Ja, sind sie - auf der Serverseite. Der Proxy ist ja nur ein Proxy und leitet die Requests transparent weiter.
MyJohnny hat geschrieben:Ich möchte gerne wissen, was diese Funktionen genau an den Server schicken und in welcher Reihenfolge.
Das ist bereits alles was sie machen - sie werden einfach weitergereicht. Du stellst dir das wohl komplizierter vor als es ist.
MyJohnny hat geschrieben:Kann ich mir den source der Funktionen command() etc. irgendwo anschauen?
Klar, sind im Sourcecode von Atheme. ``command()`` findest du etwa hier.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
MyJohnny
User
Beiträge: 5
Registriert: Donnerstag 28. Januar 2010, 13:35

Oh man ! Jaa jetzt seh ich das endlich auch. Ich hätte nicht gedacht, dass es so einfach ist Daten an den Proxy transparent zu schicken. Im Sourcecode seh ich jetzt auch:

Code: Alles auswählen

115 xmlrpc_register_method("atheme.login", xmlrpcmethod_login);
116 xmlrpc_register_method("atheme.logout", xmlrpcmethod_logout);
117 xmlrpc_register_method("atheme.command", xmlrpcmethod_command); 
Okay nun bin ich schon ein GANZES stückchen weiter!!

In PHP hab ich dazu folgendes Beispiel gefunden:

Code: Alles auswählen

<?php
$request = xmlrpc_encode_request("method", array(1, 2, 3));
$context = stream_context_create(array('http' => array(
    'method' => "POST",
    'header' => "Content-Type: text/xml",
    'content' => $request
)));
$file = file_get_contents("http://www.example.com/xmlrpc", false, $context);
$response = xmlrpc_decode($file);
if ($response && xmlrpc_is_fault($response)) {
    trigger_error("xmlrpc: $response[faultString] ($response[faultCode])");
} else {
    print_r($response);
}
?>
Theoretisch müsste ich dann einfach nur die Zeile

Code: Alles auswählen

$request = xmlrpc_encode_request("method", array(1, 2, 3));
in

Code: Alles auswählen

$request = xmlrpc_encode_request("login", array("username","passwort"));
umändern, für die login() methode.

Ich hab jetzt noch (hoffentlcih) eine letzte frage:

Wenn ich mich einlogge, bekomm ich ein Objekt anscheinend?

Code: Alles auswählen

self.authcookie = self.atheme.login(username, password)
dieser authcookie wird immer beim command() übergeben:
z.b.:

Code: Alles auswählen

    def list_own_access(self):
        return self._parse_access(self.parent.atheme.command(self.parent.authcookie, self.parent.username, '0.0.0.0', 'NickServ', 'LISTCHANS'))
Meint ihr ich kann in PHP auch einfach:

$authcookie = .... login ("username", "passwort"); machen
und dann mit $authcookie arbeiten oder muss ich das dort anders behandeln?
Wenn ja dann kann ich diesen authcookie auch immer übergeben
als parameter... $...-> command ($authcookie, ..);

Vielen Dank schonmal für eure antworten und überhaupt dass ihr einen blick auf den sourcecode getätigt habt!!

[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also ich denke das ist keine Python-Frage mehr und PHP vermeide ich sowieso wie die Pest (wenn man sich dieses umständliche ``xmlrpc_encode_request`` anschaut dann habe ich offensichtlich nicht viel verpasst), also falls hier niemand mit PHP-Kenntnissen antworten wird verweise ich auf PHP-Communities die diese XML-RPC-Library auch tatsächlich nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
MyJohnny
User
Beiträge: 5
Registriert: Donnerstag 28. Januar 2010, 13:35

Hey, ja da hast du wohl recht. Der beste Weg ist einfach durch systematisches ausprobieren, was ich auc getan habe.

Natürlich geht das auch viel einfacher in PHP wie man sieht:

Code: Alles auswählen

print_r (XMLRPC_request ("myserver:8080", "/xmlrpc", "login", array("uname","upass")));
Trotzdem vielen dank für eure Hilfe, ohne euch hätte ich es wahrscheinlich nicht hinbekommen!
Ach und was ich noch entdeckt habe:

in `self.parent.atheme.login ()..' ist dieses `atheme` nicht definiert weil
`atheme.login()` generell die ganze funktion ist, die übermittelt wird.
also im c source code heißt die methode nicht nur login(), sondern atheme.login(), deswegen wurde das `atheme` auch nirgends definiert im python source code :)

Grüße und Danke nochmals!
Johnny

** Thread kann geschlossen werden **[/code]
Antworten