irc/wwcn gateway

Gerrit Hiddink (grit@wit387401.student.utwente.nl)
Tue, 3 Nov 1998 13:47:56 +0100 (MET)

Heu,

ik heb wat nagedacht over hoe wwcn aan irc geknoopt kan worden, en dit is
eruit gekomen:

je kunt irc en wwcn modelleren als event driven: er komt een message binnen,
en de server verandert intern wat data en stuurt eventueel een message door.
Niet alleen verschillen de berichten tussen irc en wwcn, maar ook de data
die een server bewaart verschilt: irc bewaart *alles*, wwcn servers bewaren
alleen data van hun eigen users, de kanalen waar die users op zitten, en de
users op die kanalen. Plus nog een aantal users die aan het /msg'en zijn met
de users op die server.

Een kanaal op WWCN wordt dus "onderhouden" door een groep servers, namelijk
servers die users hebben op dat kanaal. Een IRC bericht, bv "user x joint
kanaal c" moet dan doorgestuurd worden naar deze groep WWCN servers.
Hiervoor worden multicast groups gebruikt.

Maar wat nu als er achter een WWCN server een heel IRC netwerk zit? Dan
zouden alle berichten van alle kanalen naar die ene WWCN server gestuurd
moeten worden. Dat zou net zoveel verkeer veroorzaken als op IRC en we
zouden qua datareductie niets opgeschoten zijn. Nou wil het "toeval" dat
je op WWCN prima kunt zeggen dat een WWCN server een bepaalde GROEP kanalen
gateway't. Bijvoorbeeld een stuk of 50, of 500 rustige kanalen. Dat heeft
als voordeel dat als 1 zo'n gateway server crasht, dat dan alleen de kanalen
op dat ding niet meer ge-gateway'y worden (hoe erg kun je een taal
verkrachten). Plus dat je per gateway niet zo'n monster machine nodig hebt,
maar kunt volstaan met een klein dingetje.

Zo'n gateway moet dus op WWCN doen alsof'tie op een stuk of wat kanalen zit,
en alle data van alle users op die kanalen beheren (dus wijzigingen op die
kanalen zoals JOIN en LEAVE verwerken). Voor die kanalen moet 'ie dus ook
de wijzigingen doorsturen van de ene naar de andere kant.

Je zou je voor kunnen stellen dat kanalen op IRC kunnen opgeven of ze
gegateway't willen worden. Deze wijs je dan toe aan een server. Zolang dat
er nog niet zoveel zijn, kun je 1 server gebruiken, en naarmate er meer
kanalen komen kun je naar keuze meer servers inzetten. Dit is een fijne
eigenschap van een werkelijk schaalbaar gedistribueerd systeem!

Het is daarna heel simpel om een IRC netwerk in 2 stukken te knippen en te
vervangen door WWCN: aan beide zijden van de wwcn "wolk" staat voor elk
kanaal een gateway server. Events op die kanalen worden door de WWCN servers
automatisch doorgestuurd naar alle WWCN servers die zich met dat kanaal
bemoeien, dus naar beide WWCN gateways voor dat kanaal. En zo wordt het
verder doorgestuurd naar beide zijden van het IRC netwerk. Ook weet elke
WWCN gateway welke andere WWCN servers, mogelijk gateways, op zijn kanalen
zitten. Dus een event op een IRC kanaal zal naar de WWCN gateway gestuurd
worden (IRC servers sturen alle kanaalwijzigingen door naar alle servers),
en deze gateway zal het dan naar de gateway aan de andere kant van het WWCN
netwerk sturen. Zo zal de boodschap door het WWCN netwerk lopen en
uiteindelijk weer aan de andere kant in het IRC netwerk geinjecteerd worden.

Wat er dus gebouwd moet worden is een apparaat dat uit een config file leest
voor welke kanalen hij gateway moet zijn. Hij verstaat zowel het IRC als het
WWCN protocol, en beheert datastructuren hiervan. Elke wijziging, komend van
het IRC netwerk of het WWCN netwerk, die betrekking heeft op een kanaal dat
hij beheert of een user op dat kanaal, stuurt hij door naar de andere kant.
Deze gateway moet eigenlijk opgebouwd worden uit bestaande source trees van
de IRC en WWCN server. Er moet aan beide zijden een patch overheen gegooid
worden die event "detectors" installeren: de server moet een BLIEP geven als
er wat dan ook gebeurt, en die BLIEP moet ook vertellen wat er dan gebeurt
is. De echte gateway zoekt dan uit of het een relevante BLIEP is, en propt
de bliep in een event "handler".

Dus voor zowel de irc server als de wwcn server moeten detectors en event
handlers krijgen voor:

user joins channel en wat is bekend over die user
user leaves channel
channel is created
channel dies
user quits

We hebben het nu nog niet gehad over private messages tussen users. Dat
bewaar ik voor een volgende keer.

Ik zal prototypes maken voor de event detectors en de event handlers. Dan
kunnen jullie fijn uitvechten wie welke gaat implementeren. De code die je
dan schrijft is eenvoudig te testen: een detector kan z'n output naar het
scherm dumpen en je kunt met een irc client testen of 'ie het doet. Een
event handler kun je andersom testen door bv een aantal getimede events te
sturen en met je irc client te kijken of het werkt. Dit lijkt me tevens
een mooie opdeling van het werk dat gedaan moet worden.

ok ik heb gelogen bovenaan het mailtje. Ik had helemaal niet nagedacht. Maar
het werkt bij mij het beste als ik nadenk tijdens het schrijven, en schrijf
tijdens het nadenken.

Grit