SpaceCP Jamy Timmermans 6de jaar industriële wetenschappen Schooljaar 2013-2014 Mentor: D. De Koker
Literatuurstudie SpaceCP
Jamy Timmermans 6de jaar industri¨ele wetenschappen VTI Aalst
Mentor: Daniel De Koker Industri¨ele wetenschappen, informatica
Voorwoord
SpaceCP Ik ben Jamy Timmermans en computers zijn mijn passie. Vooral de snelheid waaraan ze evolueren boeit me. Nadat ik circa 2011 mijn eigen website en eigen gameserver had, merkte ik dat het vrij vervelend en tijdrovend is om deze systemen online te zetten en te beheren. Toen kreeg ik een idee. Mijn visie: Een programma dat het instellen en vooral beheren van deze systemen pijnloos zou maken. Na in contact te komen met een zeer getalenteerde programmeur die dezelfde visie had vormden we een team en startte we ons eerste prototype: SpaceBukkit. Dit prototype werd een succes na de lancering in 2012 en werd een van de beste gratis programma’s voor het beheer van Bukkit-gebaseerde servers. Omdat het een prototype was, waren er wel bepaalde beperkingen en was het ook enkel gericht naar Bukkit-servers. Hieruit kwam SpaceCP, eerst SpaceBukkit 2.0 geheten. SpaceCP zou de opvolger worden van SpaceBukkit en zou toelaten voor nog gemakkelijker beheer en nog meer flexibiliteit voor ons. Deze ge¨ıntegreerde proef gaat over de keuzes die we gemaakt hebben om SpaceCP op te bouwen. Van front-end design tot communicatie met de servers. Ik zou graag Luca Rager bedanken voor de ondersteuning bij het ontwerp van SpaceBukkit en SpaceCP. Ook wil ik alle mensen die ons geholpen hebben bij de ontwikkeling van SpaceCP bedanken voor hun constructieve input. En ten slotte zou ik mijn mentor meneer De Koker willen bedanken voor de goede opvolging en tips. De ontwikkeling van SpaceCP heeft mij veel bijgeleerd en ik hoop dat de lezer geboeid mag worden met dit werkstuk.
Inhoudsopgave Lijst van figuren
iv
Inleiding
1
1 Het ontwerp
3
1.1
Een verbeterde versie van SpaceBukkit . . . . . . . . . . . . . . . . . . .
3
1.1.1
Wat is SpaceBukkit? . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.1.2
Wat ontbreekt er in SpaceBukkit? . . . . . . . . . . . . . . . . .
4
1.2
SaaS: SpaceCP as a service . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.3
Modulair
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.3.1
Games . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.3.2
Addons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.3.3
Volledig aanpasbaar . . . . . . . . . . . . . . . . . . . . . . . . .
5
2 De uitwerking van SpaceCP
6
2.1
Keuze van de programmeertaal . . . . . . . . . . . . . . . . . . . . . . .
6
2.2
Wat is Node.JS? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.2.1
Gebaseerd op de V8 Javascript engine . . . . . . . . . . . . . . .
7
2.2.2
Evented IO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.2.3
Modulair . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2.4
WebSockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.3.1
SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.3.2
SQL versus NoSQL . . . . . . . . . . . . . . . . . . . . . . . . . .
11
2.3
2.4
UI: De user interface of gebruikersinterface
. . . . . . . . . . . . . . . .
11
2.5
Het Compound MVC framework . . . . . . . . . . . . . . . . . . . . . .
13
ii
INHOUDSOPGAVE
2.6
2.7
2.8
2.9
2.5.1
Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2.5.2
Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
2.5.3
View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
Het opbouwen van het modulaire systeem . . . . . . . . . . . . . . . . .
14
2.6.1
De module repository . . . . . . . . . . . . . . . . . . . . . . . .
14
2.6.2
De module loader . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
De front-end code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.7.1
RequireJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.7.2
AngularJS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.7.3
jQuery en jQuery UI . . . . . . . . . . . . . . . . . . . . . . . . .
17
Communicatie met de gameserver . . . . . . . . . . . . . . . . . . . . . .
17
2.8.1
Wat is RemoteToolkit?
. . . . . . . . . . . . . . . . . . . . . . .
17
2.8.2
De RemoteToolkit API . . . . . . . . . . . . . . . . . . . . . . .
18
2.8.3
De SpaceCP RTK module . . . . . . . . . . . . . . . . . . . . . .
20
Besluit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
3 Gebruiksscenarios
21
3.1
De server met een klein aantal spelers . . . . . . . . . . . . . . . . . . .
21
3.2
De matig populaire server . . . . . . . . . . . . . . . . . . . . . . . . . .
21
3.3
Het grote server netwerk . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
3.4
Het server hosting bedrijf . . . . . . . . . . . . . . . . . . . . . . . . . .
22
Besluit
23
Appendices
24
A Pakket definitie
25
B Pakket lengte
26
Bibliografie
27
iii
Lijst van figuren 1.1
Het SpaceBukkit logo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
2.1
Het SpaceCP logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2
Het Node.JS logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
2.3
Twee oude SpaceCP designs . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.4
Oude versie van het SpaceCP design . . . . . . . . . . . . . . . . . . . .
12
2.5
Het uiteindelijke SpaceCP design . . . . . . . . . . . . . . . . . . . . . .
13
2.6
Een typisch MVC schema . . . . . . . . . . . . . . . . . . . . . . . . . .
14
2.7
Het RequireJS logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.8
Het AngularJS logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.9
Het jQuery logo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
iv
Inleiding Serverbeheer is lang een zware taak geweest die enkel uitgevoerd werd door mensen met een speciale opleiding. Met de komst van online spelletjes zoals Minecraft en Team Fortress 2 willen nu ook minder technisch aangelegde mensen hun eigen servers online zetten. Dit proces gaat vaak gepaard met nachten lang op forums zoeken om een bepaalde functie te activeren of om een foutmelding op te lossen. XereoNet is een internationaal team van software ontwikkelaars, waaronder ik, die vinden dat serverbeheer gemakkelijker kan. Ons eerste project was een webapplicatie1 die het beheer van Minecraft servers omzet naar een gemakkelijk te gebruiken website. Dit hebben we SpaceBukkit gedoopt. Als eerste project was SpaceBukkit wel vrij gelimiteerd in functionaliteit en uitbreidbaarheid. Als tweede project zijn we begonnen aan SpaceCP, waarover ik het ga hebben in deze scriptie. SpaceCP is de opvolger van SpaceBukkit en is volledig herschreven om modulair en uitbreidbaar te zijn. Deze nieuwe webapplicatie heeft als voordeel dat je meerdere spellen kan beheren vanuit dezelfde interface. Ook het gebruik van nieuwe technologie¨en zoals WebSockets en NodeJS laten toe dat gegevens volledig automatisch worden ge¨ updatet. Mijn onderzoeksvraag luidt: ’Hoe is SpaceCP opgebouwd en ontworpen?’. Ik ga het vooral hebben over de verschillende elementen die van SpaceCP een zeer krachtig framework2 maken. In het eerste deel leg ik het ontwerp van SpaceCP uit. In het tweede deel wordt dit ontwerp dan uitgewerkt in verschillende onderdelen. Uiteindelijk geef ik in het laatste deel nog enkele gebruiksscenarios3 voor SpaceCP. 1
Een webapplicatie is een programma dat je kan gebruiken vanuit je webbrowser. Je hoeft deze dus niet te installeren op je pc. 2 Raamwerk: Een schematisch plan dat nog verder moet worden ingevuld. 3 Een voorbeeld van hoe een product gebruikt wordt.
1
LIJST VAN FIGUREN
Het geheel van mijn GIP is online te vinden op http://jamy.be/spacecp. Daar zijn foto’s te vinden op volledige grootte, een video van SpaceCP in gebruik en ook verwijzingen naar al mijn bronnen.
2
Hoofdstuk 1
Het ontwerp 1.1
Een verbeterde versie van SpaceBukkit
Figuur 1.1: Het SpaceBukkit logo - SpaceBukkit, zie (21)
1.1.1
Wat is SpaceBukkit?
SpaceBukkit is een controlepaneel voor Bukkit1 servers. Het doel was om een gratis controlepaneel te ontwikkelen te dat professioneel oogt en alle belangrijke functies bevat om een server te beheren. Samen met teamleden heb ik in 2012 dit controlepaneel gerealiseerd. SpaceBukkit is heel onverwachts snel gegroeid. De vraag naar extra functies was zeer groot, waaronder een simpelere installatie en verbeteringen voor server hosting providers. SpaceBukkit was niet geschreven met deze functies in het achterhoofd dus leek de beste oplossing alles te herschrijven. Er is dan besloten om ontwikkeling aan SpaceBukkit stop te zetten en volledig te gaan voor de herschreven versie, SpaceCP. 1
Bukkit is een verbeterde versie van de server die gebruikt wordt voor het spel Minecraft.
3
1.2 SaaS: SpaceCP as a service
1.1.2
Wat ontbreekt er in SpaceBukkit?
SpaceBukkit was een proof-of-concept en was niet fantastisch georganiseerd. Vele onderdelen werden er tussendoor bijgevoegd en hierdoor had hele controlepaneel geen structuur. Door gebrek aan die structuur werd het onderhouden van SpaceBukkit een zware taak. Hierdoor zijn belangrijke onderdelen achterwege gebleven. De meest prominente staan in de onderstaande lijst.
• Real-time data • Meer gericht naar hosting providers1 • Berichten • Meldingen • Een API • Uitbreidingen
1.2
SaaS: SpaceCP as a service
SpaceCP moet meer gericht zijn naar hosting providers dan SpaceBukkit. Er is wat rondgevraagd, en vele hosting providers willen gemakkelijk aan het paneel en de server van hun klanten kunnen om hulp te leveren. Om dit het gemakkelijkste te verwezenlijken werd er beslist om het SpaceCP paneel te laten uitvoeren van ´e´en centrale server van de host. Zo kunnen ook statistieken over het gebruik van de servers bijgehouden worden en kan er rechtstreeks gecommuniceerd worden met de klant. SaaS staat eigenlijk voor Software as a Service, deze term wordt gebruikt als software wordt gehosting provider in de cloud2 . 1
Een hosting provider is iemand die servers verhuurt. Software in de cloud zijn programma’s die niet worden uitgevoerd op de computer van de gebruiker, maar op servers van de ontwikkelaar. 2
4
1.3 Modulair
1.3
Modulair
SpaceCP moet modulair zijn. Dit om andere ontwikkelaars toe te laten extra pagina’s of games toe te voegen. Om dit te verwezenlijken zijn er 2 categorie¨en van modules voor het paneel:
1.3.1
Games
In SpaceCP kunnen er extra games of spelen toegevoegd worden. Zo differentieert het paneel zich van andere controle panelen die zich vaak focussen op ´e´en game. De ontwikkeling van het paneel start met Minecraft, maar wordt, nadat er een goede fundering is, ook uitgebreid naar andere spelen zoals Team Fortress 2, Garrys Mod, en vele anderen.
1.3.2
Addons
Addons zijn onderdelen van games, een game kan meerdere addons bevatten. Een addon is best te zien als een pagina van een game. Zo is de pagina waar de spelers van een Minecraft server zichtbaar zijn, de addon ‘players’ van de game ‘bukkit’.
1.3.3
Volledig aanpasbaar
Gebruikers kunnen voor hun server modules gemakkelijk in en uitschakelen en enkel de pagina’s tonen die voor hun belangrijk zijn, zo kunnen ze ook nieuwe addons downloaden voor hun server.
5
Hoofdstuk 2
De uitwerking van SpaceCP
Figuur 2.1: Het SpaceCP logo - SpaceCP, zie (22)
Een webapplicatie ontwikkelen is niet eenvoudig. Er moet rekening gehouden worden met verscheidene aspecten. Veel van deze aspecten hebben rechtstreeks impact op hoe de gebruiker de applicatie ervaart. Anderen zijn volledig onzichtbaar voor de gebruiker maar gaan wel gepaard met een snelheidswinst. In dit hoofdstuk wordt uitgelegd welke beslissingen er gemaakt zijn en waarom.
2.1
Keuze van de programmeertaal
Bij SpaceBukkit leek PHP de enige logisch keuze, vele sites gebruiken het en het had een goede reputatie. Maar recent zijn er nog andere programmeertalen bijgekomen die web ontwikkeling toelaten, waaronder Node.JS, Ruby, Python en nog vele anderen. Bij SpaceCP is er gekozen om Node.JS te gebruiken als programmeertaal. In de onderstaande tabel staan de grootste verschillen tussen PHP en Node.JS.
6
2.2 Wat is Node.JS?
PHP Client en server gebruiken verschillende programmeertalen Code wordt synchroon uitgevoerd Code wordt enkel uitgevoerd bij een request Een verbinding per instantie
2.2
Node Client en server gebruiken dezelfde programmeertaal Code wordt asynchroon uitgevoerd Code wordt altijd uitgevoerd Duizenden verbindingen per instantie
Wat is Node.JS?
Figuur 2.2: Het Node.JS logo - Node.JS, zie (11)
2.2.1
Gebaseerd op de V8 Javascript engine
Javascript is de programmeertaal die gebruikt wordt om webpaginas dynamischer te maken. Om een paar voorbeelden te geven, in Hotmail of Gmail wordt Javascript gebruikt om emails te openen en te verzenden en op Facebook wordt het verzenden van berichten afgehandeld door Javascript. Javascript is niet meer weg te denken van het internet. Hierdoor zijn vele webbrowsers bezig met het verbeteren van hun Javascript engines1 . De V8 Javascript engine wordt gebruikt in de Chrome webbrowser van Google. Bij het maken van V8 is er veel aandacht gegaan naar de snelheid. Omdat het V8 project open-source2 is, is het gebruikt om Node op te bouwen. Het grote voordeel van deze keuze is dat er veel code van de server kan worden hergebruikt op de client. Dit spaart veel tijd uit. Ook moet er maar ´e´en programmeertaal gekend zijn om te kunnen programmeren op zowel de server als op de client, beide gebruiken Javascript. 1
De Javascript engine in een browser is het deel dat de Javascript code op de pagina leest en uitvoert. 2 Open source software is software dat door iedereen gratis gebruikt, gemodificeerd en gedeeld mag worden.
7
2.2 Wat is Node.JS?
2.2.2
Evented IO
Node is gebouwd op het principe dat alle input en output tijd in beslag neemt. Gegevens die van het netwerk komen kunnen langer duren om aan te komen dan gegevens die van de harde schijf afkomstig zijn, zoals te zien is op de bovenstaande afbeelding. In conventionele programmeertalen wacht de code dan met verder uit te voeren en blokkeert heel het proces. Als er nog een request aankomt maakt de server gewoon een nieuw proces aan om deze nieuwe request te beantwoorden. In Node is er maar ´e´en proces, dus als er een request aankomt dat wat langer duurt kunnen er geen andere request worden beantwoord. Node lost dit op door gebruik te maken van callback functies. Dit zijn functies die worden opgeroepen wanneer een opdracht voltooid is. Dit heet men non-blocking of asynchrone IO. Anders gezegd, input/output die het hoofdproces niet blokkeert. Stel dat gebruiker A een bestand aanvraagt, dan zal Node in de achtergrond beginnen dat bestand te lezen in een ander proces. Als ondertussen gebruiker B wat info aanvraagt dat al in het geheugen staat kan Node onmiddellijk reageren op gebruiker B terwijl het bestand voor gebruiker A nog geladen wordt. Als dan uiteindelijk het bestand geladen is zal Node de callback functie uitvoeren voor gebruiker A en dan zal gebruiker A zijn bestand ontvangen. Dit is een heel goed systeem om geheugen te besparen, in tegenstelling tot Apache1 die voor elke request een nieuw proces cre¨eert en daarmee heel veel geheugen gebruikt. Asynchroon programmeren vergt wel een verandering in denkpatroon omdat instructies niet opeenvolgend uitvoeren. Hieronder heb ik een codevoorbeeld om het bestand contactenlijst.txt op te halen met Node. Het commando console.log schrijft de tekst tussen de haakjes uit naar het scherm. // In Node var bestand = "contactenlijst.txt"; console.log("We gaan een bestand laden..."); fs.open(bestand, "r", function (fout, inhoud) { if (fout) throw fout; // Doe iets met het bestand console.log("Het bestand is geladen!"); }); 1
Een server die PHP code kan uitvoeren.
8
2.2 Wat is Node.JS?
console.log("De code wordt verder uitgevoerd zonder onderbreking."); Dit wordt weergegeven op het scherm: > We gaan een bestand laden... > De code wordt verder uitgevoerd zonder onderbreking. > Het bestand is geladen! De functie in het commando fs.open wordt pas uitgevoerd als het bestand geladen is, de rest van de code kan dus gerust verdergaan. In het volgende voorbeeld doen we hetzelfde met PHP. Hier kan je iets naar het scherm schrijven door middel van het echo commando. Hier zal het volgende zichtbaar zijn op het scherm: > We gaan een bestand laden... > Het bestand is geladen! > De code voert echter niet verder uit tijdens het laden. Hier stopt het programma volledig wanneer het bestand geladen wordt. Het asynchrone systeem houdt deze tussenpozen bruikbaar.
2.2.3
Modulair
Node is ook modulair opgebouwd, dit om uitgebreide taken op te delen in kleinere sub-modules. Hierdoor is de code veel leesbaarder en veel beter onderverdeeld. Om het nog te verbeteren heeft Node ook een package repository1 . Deze repository heet NPM2 en is zeer krachtig. Dankzij NPM is het zeer gemakkelijk om modules te installeren en te gebruiken. 1 2
Een plaats waar modules worden opgeslagen en van gedownload kunnen worden. NPM: Node Package Manager.
9
2.3 Database
2.2.4
WebSockets
WebSockets is een geavanceerde technologie die toe laat om een interactieve verbinding te openen tussen de browser van de gebruiker en de server. Met deze verbinding kunnen er berichten en events van en naar de server gestuurd worden, zonder dat de client hier de hele tijd achter moet vragen. Dit in tegenstelling tot HTTP1 dat gebaseerd is op requests. Dit is zeer goed voor realtime applicaties en games. Met deze WebSockets kunnen er gegevens zoals een chat of statistieken in realtime worden weergegeven op de client. Iets wat met AJAX2 anders tot een hele seconde vertraagt zou zijn. WebSockets werken niet alleen met Node en zijn ook bruikbaar in PHP, maar dit werkt niet zo gemakkelijk omdat PHP scripts gebaseerd zijn op requests, en niet op events zoals Node.
2.3
Database
Een database is een programma dat gegevens bijhoudt voor de applicatie. Om gegevens correct op te kunnen slaan in een database moet er op voorhand bepaald worden welke gegevens er worden opgeslagen in de database. Het opbouwen van een database is geen eenmalige taak. Naarmate de applicatie groeit en er extra functies worden aan toegevoegd, zal de database ook aangepast moeten worden om deze extra gegevens op te slaan. Er zijn veel verschillende databaseprogramma’s die allemaal hun eigen karakteristieken en toepassingen hebben. Ze kunnen wel opgedeeld worden in twee categorien: SQL en NoSQL.
2.3.1
SQL
SQL staat voor Structured Query Language en is de taal waarmee je met een SQL database communiceert. Een van de meest gekende voorbeelden van een SQL database is MySQL. MySQL is de meest gebruikte database voor web ontwikkeling. 1 2
HTTP is het protocol dat gebruikt wordt om webpagina’s, foto’s etc. te laden van een server. Een systeem om HTTP requests uit te voeren zonder de pagina opnieuw te moeten laden.
10
2.4 UI: De user interface of gebruikersinterface
2.3.2
SQL versus NoSQL
Met de opkomst van NoSQL databases is er veel debat rond welk type database beter is. Als men het heeft over SQL versus NoSQL wordt er eigenlijk bedoeld, relationele databases versus niet-relationele databases. Elk van beide heeft zijn voor- en nadelen. Bij niet-relationele databases wordt er niet gecontroleerd of gegevens van een bepaald datatype zijn wanneer ze worden opgeslagen, dit gebeurt wel bij relationele databases. Deze controle is niet noodzakelijk, maar als er een fout is in de programmacode die de database uitleest zou er wel eens een probleem kunnen ontstaan. De relationele databases zijn vaak opgedeeld in meerdere tabellen die aan elkaar gelinkt zijn aan de hand van relaties. In niet relationele databases staat alle informatie in een document. Dit heeft als resultaat dat de relationele databases vaak properder ogen, maar snel heel onoverzichtelijk worden als er veel informatie wordt in opgeslagen. In niet-relationele databases staat alle informatie in ´e´en document. Op het eerste zicht oogt die niet even proper, maar alle informatie is in een oogopslag terug te vinden. Voor SpaceCP is er gekozen voor een niet-relationele database, voornamelijk omdat het makkelijker werkt vanuit Javascript.
2.4
UI: De user interface of gebruikersinterface
De gebruikersinterface is ´e´en van de belangrijkste elementen van een webapplicatie. Het is het onderdeel waar de gebruiker rechtstreeks in contact mee komt. Als deze niet proper en overzichtelijk oogt zal de gebruiker minder neiging hebben om de applicatie verder te gebruiken. Bij SpaceCP is er veel tijd gestoken in het cre¨eren van een goede gebruikersinterface die, proper en professioneel oogt, in het ’ruimte’ thema past en flexibel genoeg is om de addons in te verwerken. De volgende afbeeldingen laten zien hoe er van twee uitersten uiteindelijk een professioneel ogende gebruikersinterface is gekomen. Vergrootte versies van deze foto’s zijn ook te vinden op mijn website: http://jamy.be/spacecp.
11
2.4 UI: De user interface of gebruikersinterface
Figuur 2.3: Twee oude SpaceCP designs - Het linkse design is iets wat meer speels en het rechtse iets wat professioneler.
Figuur 2.4: Oude versie van het SpaceCP design - Door plaatsgebrek is voor dit design niet geopteerd.
12
2.5 Het Compound MVC framework
Figuur 2.5: Het uiteindelijke SpaceCP design - Het resultaat van ´e´en jaar lang het design aan te passen.
2.5
Het Compound MVC framework
Om het ontwikkelen van een webapp iets te vergemakkelijken kan er gebruik gemaakt worden van een zogenaamd MVC framework. Dit is een stukje software dat web requests omzet naar een vooraf bepaald systeem. MVC staat voor Model-View-Controller en bepaald de 3 belangrijkste componenten. Op de onderstaande afbeelding zie je ook een dispatcher staan, deze zorgt ervoor dat de opgevraagde pagina door de juiste controller verwerkt wordt.
2.5.1
Model
Het model is de gegevenslaag van een MVC framework. Hierin worden gegevens zoals gebruikersgegevens, servergegevens, etc. opgeslagen.
2.5.2
Controller
De controller voert acties uit die de gebruiker heeft opgevraagd. De controller heeft toegang tot het model om gegevens op te vragen.
13
2.6 Het opbouwen van het modulaire systeem
Figuur 2.6: Een typisch MVC schema - Een schema van hoe een request afgehandeld word door een MVC framework.
Nadat de gegevens zijn verwerkt zal de controller de respectievelijke view updaten.
2.5.3
View
De view is een sjabloon van een webpagina, de controller vult bepaalde variabelen in in de view, die dan wordt weergegeven aan de gebruiker.
2.6
Het opbouwen van het modulaire systeem
Om ervoor te zorgen dat SpaceCP uitgebreid kan worden is er een modulair systeem opgebouwd geweest. Dit modulair systeem moet de installatie van modules vergemakkelijken en ook automatisch updates installeren. Het is opgedeeld in twee stukken, de module repository en de module loader.
2.6.1
De module repository
Modules zijn eigenlijk kleine pakketten in een gecomprimeerd formaat dat alle benodigde bestanden bevat. Zoals kort aangehaald in het vorige hoofdstuk, zijn er twee types modules, de games en de addons. Een game kan op zichzelf geen pagina’s toevoegen aan het paneel, maar voegt wel een
14
2.7 De front-end code
API toe om te communiceren met dat type server. Optioneel kunnen er ook een paar acties worden toegevoegd om het gebruik van de API te vergemakkelijken. Een addon is afhankelijk van een game, dit wordt bepaald in een van de configuratiebestanden in het pakket. In de addon staat een bepaalde pagina, die pagina heeft een controller en ´e´en of meerdere views. Deze views bepalen een enkele pagina in SpaceCP. De modules en games worden opgeslagen op een centrale repository waar iedereen van kan downloaden. De modules die op de repository komen worden wel eerst gecontroleerd door het SpaceCP team om ervoor te zorgen dat de modules geen risico vormen voor het paneel.
2.6.2
De module loader
Dit onderdeel van SpaceCP is geschreven zodat we games en addons kunnen installeren en updaten zonder SpaceCP uit te moeten schakelen. Dit doen we door wat aanpassingen te maken aan het MVC framework.
2.7
De front-end code
SpaceCP heeft redelijk veel front-end code, dit is Javascript code die op de browser van de gebruiker wordt uitgevoerd. Deze code is vooral voor de verbinding met de server via WebSockets, het plaatsen van de ontvangen gegevens op de pagina, de animaties etc. Er worden veel aparte libraries gebruikt in SpaceCP. Deze libraries versnellen de ontwikkeling door veelgebruikte functies te versimpelen, of door nieuwe functies toe te voegen. In dit deel ga ik het hebben over de meest prominente libraries gebruikt in SpaceCP.
2.7.1
RequireJS
RequireJS is een Javascript bestand lader. Het verschil tussen het gewoon laden van Javascript bestanden en het laden via RequireJS is dat RequireJS alles asynchroon laadt. Dit heeft als resultaat dat de pagina niet blokkeert bij het laden van de bestanden. Ook zijn alle bestanden ge¨ısoleerd van elkaar, dit maakt het hele systeem veiliger
15
2.7 De front-end code
Figuur 2.7: Het RequireJS logo - RequireJS, zie (2)
en meer gestructureerd. Het idee van RequireJS is om de applicatie op te delen in modules die andere modules laden om taken uit te voeren. Uiteindelijk zijn er dan 20 bestanden in plaats van 1, wat niet optimaal is om te laden. Hiervoor is een een onderdeel in RequireJS dat alle deel-modules compileert tot ´e´en module en dat uiteindelijke bestand wat kleiner maakt.
2.7.2
AngularJS
Figuur 2.8: Het AngularJS logo - AngularJS, zie (6)
HTML is een zeer goede taal om statische pagina’s op te bouwen, maar er is geen ingebouwd systeem om de gegevens op de pagina’s dynamisch te maken. AngularJS is een Javascript library dat dit mogelijk maakt aan de hand van directives. Deze attributen kan je in de pagina invoegen en zo de pagina dynamisch te maken. Angular staat bekend als een model-view-view-model framework, wat gelijkaardig is aan een MVC framework, enkel dat hierbij 2-way data binding is toegevoegd en de controllers eruit gehaald zijn. Bij een MVC framework zet de controller de gegevens in de view en toont dan de view aan de client. Als gegevens aangepast worden moeten we die op een andere manier terugsturen naar het model. Dit is een heel omslachtig systeem. Het MV-VM systeem van Angular werkt op een manier zodat gegevens die op de pagina worden aangepast automatisch ook worden ge¨ updated in het model. dit noemt men
16
2.8 Communicatie met de gameserver
2-way data binding, omdat de gegevens in beide richtingen aan elkaar verbonden zijn.
2.7.3
jQuery en jQuery UI
Figuur 2.9: Het jQuery logo - jQuery, zie (12)
jQuery is een veel gebruikte library die het makkelijker maakt om DOM1 manipulatie, animaties, AJAX en andere veelgebruikte functies uit te voeren. Dit door alles te organiseren in een makkelijk bruikbare API die universeel is in alle browsers. jQuery is uitbreidbaar met allerhande plug-ins die kleine en grote zaken simpeler maken. jQuery UI is een van deze plug-ins die veel interface elementen toevoegen aan je applicatie.
2.8
Communicatie met de gameserver
Om gegevens van en naar de gameserver te sturen moet er een plug-in of module genstalleerd worden dat gegevens kan sturen en ontvangen. Hiervoor wordt gebruik gemaakt van RemoteToolkit.
2.8.1
Wat is RemoteToolkit?
RTK is een server wrapper2 en plug-in waarmee via een API3 opdrachten en gegevens kunnen worden gestuurd naar de server. Ook kan de server hiermee vanop afstand op en afgezet worden. De ontwikkelaar van RTK werkt ook mee aan SpaceCP en is al even bezig met het 1
DOM: Document Object Model, dit is de interne interpretatie van de pagina, gebruikt om de pagina te renderen. 2 Een server wrapper is een programma dat server software uitvoert en beheert. 3 API: Application programming interface
17
2.8 Communicatie met de gameserver
maken van een nieuwe versie van RTK, versie 11. Deze nieuwe versie wordt gebruikt voor SpaceCP omdat er een nieuwe API beschikbaar is die toelaat om events die op de gameserver gebeuren, door te sturen. Dit is niet mogelijk in de vorige versie van RTK.
2.8.2
De RemoteToolkit API
De API in RTK is een zogenaamde persistence, evented API. Persistence wil zeggen dat het communicatiekanaal openblijft voor extra gegevens zoals events. De communicatie gaat over een TCP socket verbinding. Pakketten die over deze verbinding gaan hebben een bepaalde vorm, dit noemt men de pakket definitie. Als pakketten zich niet aan deze vorm houden kunnen we ze niet lezen. Deze definitie is te vinden in bijlage A. De eerste 2 delen zijn constanten om de integriteit van het pakket te controleren. De eerste 4 bytes zijn altijd 0x49504352 of omgezet naar tekst IPCR. Als dit niet zo is kunnen we aannemen dat het pakket ofwel niet compleet is ofwel nog een deel bevat van het vorige pakket. Hierna komt de endianness constant, dit is 1 byte1 . De endianness van een waarde bepaald hoe deze is opgeslagen in het geheugen, bij little-endian is de minst significante byte opgeslagen in het laagste geheugen adres. Bij big-endian is het dan het omgekeerde, de meest significante byte is opgeslagen in het laagste geheugen adres. De beste manier om meest en minst significante byte te begrijpen is door een nummer te nemen, bijvoorbeeld 123. Hierbij weten we dat de 1 het meeste impact heeft op de waarde van het nummer. Dit is dan het meest significante nummer. 123 wordt dus in het alledaagse leven geschreven als big-endian, omdat het meest significante nummer eerst staat. Als je dit als little-endian wilt schrijven zou dit resulteren in 321 waar het minst significante nummer eerst wordt geschreven, hier het nummer 3. In de volgende byte staan gegevens over het pakket zelf, de eerste bit2 is een bit die weergeeft of het pakket ge¨encrypteerd is. De tweede bit is een waarde om weer te geven of de sessie mag be¨eindigd worden, als deze op 1 staat zal RTK die sessie afsluiten. de volgende 6 bits is de waarde die weergeeft met welke versie van de API dit pakket gemaakt is. 1
1 byte is 8 bits. Een bit is een computerterm voor waarde in het 2-delig talstelsel. Die waarde kan ofwel 0 (onwaar) ofwel 1 (waar) zijn. 2
18
2.8 Communicatie met de gameserver
Hierna komen we aan de access key. Dit is de sleutel die bij een onge¨encrypteerd pakket controleert of het wel van een geautoriseerde bron komt. Dit is de SHA2561 van de gebruikersnaam, het wachtwoord en de salt. De volgende twee variabelen zijn enkel voor ge¨encrypteerde pakketten, om ervoor te zorgen dat de pakketten correct ge¨encrypteerd worden. Hieronder komt het belangrijke gedeelte. De gegevens van het pakket. Eerst en vooral, de session id, elk verzonden pakket heeft een andere session id om ervoor te zorgen dat geen dubbele pakketten worden verzonden. Hierna is er de lengte van het data block, dit komt later aan bod. Het volgende onderdeel is de lengte van de methode en de methode zelf, die bepaalt welke actie je wilt uitvoeren. Hierop volgen de parameters, dit zijn gegevens om instellingen mee te sturen met het pakket. Ten laatste is er dan het data blok, dit is waar extra gegevens worden in opgeslagen. Met deze definitie kan iedereen een programma schrijven dat kan communiceren met RemoteToolkit. Voor SpaceCP is eer ook een stuk code geschreven om met RTK te communiceren. Deze code is te vinden op NPM (28). Om deze pakketten te lezen kan er op twee manieren te werk gegaan worden: Aannemen dat het pakket al compleet is aangekomen en ´e´en voor ´e´en de gegevens uitlezen, of eerst controleren of het pakket volledig is door de lengte te berekenen. Hieronder wordt de berekeningen beschreven die nodig zijn on de lengte te berekenen. De Javascript code die deze berekening uitvoert is te vinden in bijlage B. Als de eerste manier gekozen wordt zal er voor elke lijn code ook een controle moeten zijn opdat er niet te veel gelezen wordt2 . Voor de tweede manier is er een functie nodig die de lengte van het pakket berekent. Deze functie moet rekening houden dat bepaalde gegevens in het pakket niet altijd dezelfde lengte hebben, waaronder de methode, de parameters en de data. Juist voor deze reden zijn er speciale plaatsen waar de lengte van die variabelen worden gegeven. Eerst wordt de lengte van de methode opgeslagen. Deze bevindt zich steeds op positie 44 in het pakket3 . Dit is te achterhalen door het aantal bytes te tellen die de methode vooraf gaan. 1
SHA256: Secure Hashing Algorithm, 256bit. Dit is een functie die een hash cre¨eert van een bepaalde waarde. 2 Als dit gebeurt zal de server een foutmelding geven dat er meer gegevens worden opgevraagd dan er aanwezig zijn. 3 Deze posities worden bepaald vanaf positie nul, dus dit is de 45ste byte van het pakket.
19
2.9 Besluit
Ten tweede wordt het aantal parameters opgeslagen. Deze bevindt zich na de methode, maar aangezien de methode ook een bepaalde lengte inneemt (die we hiervoor bepaald hebben), moet die lengte er ook bijgeteld worden. Het aantal parameters bevindt zich dus op positie 45 plus de lengte van de methode. Verder moet voor elke parameter ook een lengte berekend worden. In het begin van elke parameter staat zijn lengte gegeven, de som van al deze lengtes plus het aantal parameters geeft dan de lengte van het parameter gedeelte. Als laatste moet de lengte van de data nog bijgeteld worden. Deze lengte is te vinden op positie 42 van het pakket. De som van al deze lengtes bepalen de lengte van het pakket, hieruit kan worden afgeleid of er te weinig, genoeg, of te veel gegevens zijn doorgestuurd. Indien er te weinig is doorgestuurd wordt de data tijdelijk opgeslagen tot er meer data toekomt.
2.8.3
De SpaceCP RTK module
Om extra acties of methodes toe te voegen aan RTK moet er een extra module ge¨ınstalleerd worden op RTK. Voor SpaceCP wordt er een module ontwikkeld die toelaat om gegevens zoals de online spelers op de server door te sturen naar SpaceCP.
2.9
Besluit
Al deze onderdelen zijn al geheel of gedeeltelijk ge¨ımplementeerd in SpaceCP. Wat er verder nog moet worden afgewerkt zijn de addons voor Bukkit. Als deze af zijn en volledig werken kan er een b`eta release worden uitgerold. Hierbij wordt dan veel aandacht besteedt aan hoe een webapplicatie best wordt uitgerold. Met de b`eta kunnen we dan alle bugs1 eruit halen zodat we een stabiel en volledig werkend product kunnen uitbrengen. Hierna kan er dan verdere aandacht besteedt worden aan uitrollen bij verschillende hosting providers.
1
bugs is een term voor fouten in computerprogramma’s.
20
Hoofdstuk 3
Gebruiksscenarios 3.1
De server met een klein aantal spelers
Een kleine server1 kan gemakkelijk nieuwe plugins toevoegen, de spelers beheren en zien hoeveel spelers er dagelijks online zijn. Dit alles zonder veel moeite en vanop eender welke plek.
3.2
De matig populaire server
Een ietwat populairdere server2 kan met SpaceCP zijn server vlot beheren via de plugin configuratie pagina. Ook reservekopie¨en en het schema met geplande taken nemen veel druk van de administrator zijn schouders. De administrator kan ook extra gebruikers toevoegen. Deze extra gebruikers kunnen worden gelimiteerd tot bepaalde functies.
3.3
Het grote server netwerk
In een groot server netwerk3 is het heel belangrijk dat alle servers online blijven. Ons ge¨ıntegreerd notificatie systeem laat de administrators en de gebruikers iets weten als er zich een probleem voordoet. 1
Tussen 0 en 20 spelers. Tussen 21 en 100 spelers. 3 Meerdere servers met vele spelers, meestal gebruikt om de hoeveelheid spelers te balanceren. 2
21
3.4 Het server hosting bedrijf
Ook een goed overzicht hebben is zeer belangrijk. De SpaceCP backend laat toe om alle servers te sorteren op naam, adres, statistieken etc. Op deze manier kunnen de werkende servers er uit worden gefilterd en is alleen het belangrijke nog zichtbaar.
3.4
Het server hosting bedrijf
Een server hosting bedrijf heeft vele servers en vele gebruikers. SpaceCP maakt het gemakkelijk voor de support teams om even een server te beheren en de fouten op te lossen. Dit zonder ´e´en keer de webbrowser te verlaten. Ook de automatisering en koppeling met verscheidene commerci¨ele pakketten laat veel werk voor het hosting bedrijf achterwege.
22
Besluit Uiteindelijk komen we dan terug bij de onderzoeksvraag, hoe is SpaceCP opgebouwd en ontworpen? Heel belangrijk is het ontwerp. [zie deel 1] Als het ontwerp niet goed uitgedacht is komt er een moment dat er aanpassingen nodig zijn die veel dubbel werk opleveren voor de programmeurs. Het ontwerp loopt nauw samen met de keuze van programmeertaal omdat bepaalde interacties mogelijk verschillend verlopen in bepaalde programmeertalen. Denk aan het verschil tussen synchroon en asynchroon programmeren [zie 2.2.1]. Deze keuze beperkt ook het aantal software-bibliotheken die beschikbaar zijn. Net om deze reden is voor Javascript gekozen bij het ontwerp van SpaceCP. Met AngularJS als belangrijkste front-end bibliotheek, en CompoundJS als backend server is er veel flexibiliteit en vrijheid in de code. [zie deel 2] Het is ook duidelijk dat SpaceCP de amateurs en de server hosts helpt bij het opzetten en het beheer van hun servers en gebruikers. Maar dat SpaceCP ook een krachtig hulpmiddel is voor de doorgewinterde beheerder die zijn team van moderators toegang wil geven tot een gemakkelijk systeem. [zie deel 3] SpaceCP heeft veel potentieel en kan uitgroeien tot een heus platform voor serverbeheer van alle soorten.
23
Appendices
24
Bijlage A
Pakket definitie Magic number: 4 bytes (0x49504352 for raw packets) Endianness constant: 0xAB Encrypted: bool (1 bit) Kill session flag: bool (1 bit) Packet revision: 6 bits Access key: 32 bytes == ==IF ENCRYPTION IS ON, ALL BELOW IS ENCRYPTED== == --ONLY IF ENCRYPTED-Access key: 32 bytes Next initialization vector: 16 bytes --END-SessionID: 4 bytes (int32) data block length: 2 bytes (unsigned short) Method name length: 1 byte Method name: n bytes Parameter count: 1 byte Parameters: Parameter length: 1 byte Parameter: n bytes Data block: n bytes (up to 65535)
25
Bijlage B
Pakket lengte function getLength (buffer) { var a,b,c=0,d,x=0; if (buffer.length < 45) return buffer.length+1; a = buffer[44]; if (buffer.length < 46+a) return buffer.length+1+a; b = buffer[45+a]; for (var i = 0; i < b; i++) { if (buffer.length < 46+a+i+c) return buffer.length+1+a+i+c; x = buffer[46+a+i+c]; c += x; } d = buffer.readInt16BE(42); return 46+a+b+c+d; }; Deze code is een onderdeel van de NodeJS module voor RTK. De volledige code is te vinden op Github: https://github.com/JamyDev/node_RTKAPI
26
Bibliografie [1] Bolton, D., (2010). What is SQL? Geraadpleegd op 17 november 2013 via http://cplus.about.com/ od/thebusinessofsoftware/a/whatissql.htm. [2] Burke, J., (2011). RequireJS. Geraadpleegd op 17 november 2013 via http://requirejs.org/. 16 [3] Cogswell, J., (2011). SQL vs. NoSQL: Which Is Better? Geraadpleegd op 17 november 2013 via http://slashdot.org/topic/bi/sql-vs-nosql-which-is-better/. [4] Cois, C. A., (2010). Understanding The Node.js Event Loop — Udemy. Geraadpleegd op 16 november 2013 via https://www.udemy.com/lectures/understanding-the-nodejs-event-loop-91298. [5] Foundation, M., (2012). WebSockets — MDN. Geraadpleegd op 17 november 2013 via https:// developer.mozilla.org/en/docs/WebSockets. [6] Google, (2010). AngularJS by Google. Geraadpleegd op 18 november 2013 via http://angularjs.org/. 16 [7] Hemel, Z., (2012). Node.js and The Case of the Blocked Event Loop - Zef.me. Geraadpleegd op 16 november 2013 via http://zef.me/4561/node-js-and-the-case-of-the-blocked-event-loop. [8] Impact, L., (2013). Node.js vs PHP using Load Impact to visualize node.js efficiency — Load Impact Blog. Geraadpleegd op 16 november 2013 via http://blog.loadimpact.com/2013/02/01/ node-js-vs-php-using-load-impact-to-visualize-node-js-efficency/. [9] Initiative, O. S., (2005). The Open Source Initiative. Geraadpleegd op 22 november 2013 via http: //opensource.org/. [10] International, E., (2011). ECMAScript. Geraadpleegd op 16 november 2013 via http://www. ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf. [11] Joyent, (2010). Node.JS. Geraadpleegd op 17 november 2013 via http://nodejs.org/. 7 [12] jQuery Foundation, (2013). jQuery. Geraadpleegd op 18 november 2013 via http://jquery.com/. 17 [13] Mardanov, A., (2013). PHP vs. Node.js — webapplog. Geraadpleegd op 16 november 2013 via http://webapplog.com/php-vs-node-js/. [14] Meerdere, (2011). javascript - How to decide when to use NodeJS? - Stack Overflow. Geraadpleegd op 16 november 2013 via http://stackoverflow.com/questions/5062614/ how-to-decide-when-to-use-nodejs. [15] Meerdere, (2013). Node.js, PHP, Javascript Confusion - Stack Overflow. Geraadpleegd op 16 november 2013 via http://stackoverflow.com/questions/16384339/node-js-php-javascript-confusion.
27
BIBLIOGRAFIE
[16] Microsoft, (2003). Model-View-Controller. Geraadpleegd op 20 november 2013 via http://msdn. microsoft.com/en-us/library/ff649643.aspx. [17] Mikoluk, K., (2013). NoSQL vs SQL - A Time for Change? Geraadpleegd op 17 november 2013 via https://www.udemy.com/blog/nosql-vs-sql/. [18] MongoDB, (2013). NoSQL Databases Explained — MongoDB. Geraadpleegd op 17 november 2013 via http://www.mongodb.com/learn/nosql. [19] Nuzum, M., (2013). Why I switched to Node.js — Bearfruit. Geraadpleegd op 16 november 2013 via http://www.bearfruit.org/2013/05/03/why-i-switched-to-node-js/. [20] Persson, M., (2010). Minecraft. Geraadpleegd op 17 november 2013 via https://minecraft.net/. [21] Rager, L., (2011). Home - SpaceBukkit by XereoNet. Geraadpleegd op 20 november 2013 via http://spacebukkit.xereo.net/. 3 [22] Rager, L., (2013). Home - SpaceCP by XereoNet. Geraadpleegd op 20 november 2013 via http: //spacecp.xereo.net/. 6 [23] Rager, L. and Timmermans, J., (2012). SpaceBukkit Beta 1.2 - Web Administration the awesome way! Geraadpleegd op 20 november 2013 via https://forums.bukkit.org/threads/ web-admin-spacebukkit-beta-1-2-web-administration-the-awesome-way.58252/. [24] Resin.io, T., (2013). JavaScript, The Final Frontier. Geraadpleegd op 19 november 2013 via http: //resin.io/javascript-the-final-frontier/. [25] Shawwa, N. E., (2011). Scripting vs. Coding vs. Programming — A Software Engineer’s thoughts and rantings. Geraadpleegd op 16 november 2013 via http://www.naelshawwa.com/ scripting-coding-programming/. [26] Stones-Havas, N., (2011-2013). RemoteToolkit - Restarts + crash detection + auto saves + remote console! Geraadpleegd op 17 november 2013 via http://forums.bukkit.org/threads/ admn-remotetoolkit-r10-a15-restarts-crash-detection-auto-saves-remote-console-1-6-4.674/. [27] Takada, M., (2011). Understanding the node.js event loop — Mixu’s tech blog. Geraadpleegd op 16 november 2013 via http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/. [28] Timmermans, J., (2013). RTKAPI. Geraadpleegd op 22 november 2013 via https://npmjs.org/package/ rtkapi. 19
28