1 Abstract De doelstelling van dit eindwerk was het maken van een applicatieonafhankelijke webinterface, die met zo weinig mogelijk extra werk op elk ...
Abstract De doelstelling van dit eindwerk was het maken van een applicatieonafhankelijke webinterface, die met zo weinig mogelijk extra werk op elk product toepasbaar moet zijn. Het testplatform hiervoor was de Cameleon Videogenerator. Dit gebeurde in opdracht van Barco. De Cameleon Videogenerator zal helaas nog niet volledig zijn afgewerkt tegen de einddatum van dit eindwerk. Hierdoor kan er nog geen connectie gemaakt worden met de parameter pool. (Dit is de verzameling van alle parameters.)
In hoofdzaak omvat het eindwerk het ontwerpen van een embedded webserver op de toepassing zelf en een website die hoofdzakelijk wordt opgebouwd aan de hand van CGI shell scripts. Deze scripts zorgen ook voor de koppeling met de ParPool/applicatie. Mooi samengevat in één zin: “Embedded Webserver: Interfacing the embedded application through third-party webserver and platform oriented webpages using the ParameterPool”.
Het belangrijkste onderdeel van de verschillende toepassingen is de applicatie. Deze maakt enerzijds alle berekeningen (processing) en houdt anderzijds een aantal parameters bij om die berekeningen te kunnen maken. De parameters kunnen vervolgens worden uitgewisseld met de verschillende interfaces. Voorbeelden zijn: de hoogte, de breedte, de kleur... van het beeld.
Het uiteindelijke doel is om via een gewone browser te kunnen surfen naar de toepassing om deze op die manier volledig in te stellen en te gebruiken.
Een bijkomende, beperkende factor is dat te ontwikkelen firmware kleiner moet zijn dan 1 megabyte. Dit komt omdat de meeste toepassingen slechts enkele megabyte ter beschikking hebben. Dit sluit dus scripttalen zoals ASP, PHP, JSP… (en alle bijhorende franjes) uit.
Trefwoorden: Xml CGI Shell scripts Webinterface
Wouter Weyne
5
Inhoudsopgave Woord vooraf Abstract ......................................................................................................................5 Inhoudsopgave ...........................................................................................................6 De alfabetische lijst van gebruikte symbolen en afkortingen ......................................8 Inleiding: .....................................................................................................................9 • Doelstelling ......................................................................................................9 • De Cameleon Videogenerator .......................................................................10 Algemene info over de Videogenerator..........................................................10 • Gebruikte programma’s .................................................................................13 o Notepad2....................................................................................................13 o Debian........................................................................................................13 o Apache .......................................................................................................14 o WinSCP......................................................................................................15 o Busybox .....................................................................................................16 o Busybox httpd.............................................................................................16 1. De talen: ............................................................................................................17 1.1 XML/XSL ....................................................................................................17 1.1.1 XML vs. HTML ....................................................................................18 1.1.2 XML.....................................................................................................19 1.1.3 XSL .....................................................................................................21 1.2 CGI Shell scripts.........................................................................................22 1.2.1 Shell scripts.........................................................................................23 Wat is een scripttaal?.....................................................................................23 Bash...............................................................................................................24 Voorbeelden ..................................................................................................24 Haserl ............................................................................................................26 1.2.2 CGI scripts ..........................................................................................30 1.3 Remote ParPool protocol ...........................................................................31 1.3.1 Remote connectie ...............................................................................32 Scope.............................................................................................................32 Aanpak...........................................................................................................32 De embedded applicatie ................................................................................33 De provider ....................................................................................................33 Het protocol ...................................................................................................33 Security en authenticatie................................................................................34 Voorbeelden en implementaties ....................................................................34 1.3.2 Remote ParPool protocol ....................................................................35 Benamingen...................................................................................................35 Opmerkingen .................................................................................................35 De lijst met alle commando’s .........................................................................36 Uitleg bij de parameters uit de antwoorden....................................................37 Message flow.................................................................................................38 Object setup...................................................................................................38 Beschrijving van de objecten .........................................................................39 2. De website:........................................................................................................40 2.1 Applicatieonafhankelijk platform .................................................................40
Wouter Weyne
6
2.1.1 XML/XSL .............................................................................................40 De header ......................................................................................................40 Het menu .......................................................................................................43 De footer ........................................................................................................45 Visuele opmaak .............................................................................................47 2.1.2 Connectie tussen XML en shell scripts ...............................................48 2.1.3 Shell scripts.........................................................................................49 De checkbox ..................................................................................................49 Het textfield....................................................................................................51 De radiobuttons..............................................................................................53 Het dropdown menu.......................................................................................55 De “save” knop...............................................................................................58 2.1.4 Connectie tussen shell scripts en ParPool ..........................................60 Theoretische benadering ...............................................................................61 Huidige situatie ..............................................................................................61 2.1.5 Het opzetten van de webserver en de website....................................62 Ontwikkelplatform ..........................................................................................63 Doelplatform ..................................................................................................63 2.2 Specifiek toegepast op de Cameleon Videogenerator ...............................64 2.2.1 De parameters en hun usesettings .....................................................65 Besluit.......................................................................................................................67 Bijlage 1....................................................................................................................68 Bijlage 2....................................................................................................................92 Bijlage 3....................................................................................................................95 Literatuurlijst ...........................................................................................................101
Wouter Weyne
7
De alfabetische lijst van gebruikte symbolen en afkortingen CGI
Common Gateway Interface
CSS
Cascading Style Sheet
DTD
Document Type Definition
HTML
HyperText Markup Language
OSD
On-Screen Display
SGML
Standard Generalized Markup Language
XML
eXtensible Markup Language
XSD
XML Schema Definition Language
XSL
Extensible Stylesheet Language
Wouter Weyne
8
Inleiding: • Doelstelling De doelstelling van dit eindwerk was het maken van een applicatieonafhankelijke webinterface, die met zo weinig mogelijk extra werk op elk product toepasbaar moet zijn. Het testplatform hiervoor was de Cameleon Videogenerator. Dit gebeurde in opdracht van Barco. De Cameleon Videogenerator zal helaas nog niet volledig zijn afgewerkt tegen de einddatum van dit eindwerk. Hierdoor kan er nog geen connectie gemaakt worden met de parameter pool. (Dit is de verzameling van alle parameters.)
In hoofdzaak omvat het eindwerk het ontwerpen van een embedded webserver op de toepassing zelf en een website, die hoofdzakelijk wordt opgebouwd aan de hand van CGI shell scripts. Deze scripts zorgen ook voor de koppeling met de ParPool/applicatie. Mooi samengevat in één zin: “Embedded Webserver: Interfacing the embedded application through third-party webserver and platform oriented webpages using the ParameterPool”.
Het belangrijkste onderdeel van de verschillende toepassingen is de applicatie. Deze maakt enerzijds alle berekeningen (processing) en houdt anderzijds een aantal parameters bij om die berekeningen te kunnen maken. De parameters kunnen vervolgens worden uitgewisseld met de verschillende interfaces. Voorbeelden zijn: de hoogte, de breedte, de kleur... van het beeld.
Het uiteindelijke doel is om via een gewone browser te kunnen surfen naar de toepassing om deze op die manier volledig in te stellen en te gebruiken.
Een bijkomende, beperkende factor is dat te ontwikkelen firmware kleiner moet zijn dan 1 megabyte. Dit komt omdat de meeste toepassingen slechts enkele megabyte ter beschikking hebben. Dit sluit dus scripttalen zoals ASP, PHP, JSP… (en alle bijhorende franjes) uit.
Wouter Weyne
9
• De Cameleon Videogenerator Algemene info over de Videogenerator
De videogenerator is een toestel dat schermen kan uittesten door beeldlijnen door te sturen. Deze vormen samen een beeldpatroon. Waaruit deze lijnen bestaan, staat hieronder uitgelegd. De videogenerator zal gebruikt worden voor het uittesten van beeldschermen. Hiervan zal nu eerst het principe worden uitgelegd en dit aan de hand van een CRT-beeld.
Een CRT-beeld kan bestaan uit 625 lijnen. Een beeld wordt opgedeeld in even en oneven rasters. Een raster wordt 24 keer per seconde op het scherm geprojecteerd. Daardoor verkrijgen we een beeldfrequentie van 50Hz. Elk lijnsignaal bestaat uit een blanking-signaal en het signaal zelf. Hoe groter het signaal, hoe meer wit het beeld op het scherm bevat.
Aan het begin van het lijnsignaal is er bij analoge signalen een burst signaal. Deze dient als referentie. De frequentie van het signaal is dezelfde als die van het burst signaal. Naarmate deze frequentie in fase verschoven is met het burst signaal, verandert de kleur op het scherm. Figuur 1.1: Lijnsignaal + blanking
Wouter Weyne
10
Voor de beeldsynchronisatie, is er na elk raster een verticale synchronisatie nodig.
In de videogenerator kan via een menu heel wat ingesteld worden. Voorbeelden hiervan zijn de intensiteit, het contrast, de kleuren… maar ook synchronisatiesignalen en vele andere controlesignalen. Door deze parameters te regelen, kan men zien of het scherm al dan niet voldoet aan bepaalde eisen. Men kan ook de eigenschappen van het scherm afregelen om tot het best mogelijke beeldresultaat te komen.
De vereenvoudigde voorstelling van de doelstelling en de werking van de Cameleon videogenerator zijn op de volgende bladzijde mooi samengevat in een overzichtelijke figuur.
Wouter Weyne
11
Figuur 1.3: Algemeen beeld
Wouter Weyne
12
• Gebruikte programma’s o Notepad2 Met dit eenvoudige programma is zowat alles van dit eindwerk geschreven en ontwikkeld.
Notepad2 is een handige vervanger voor het Kladblok uit Windows. Kladblok (of Notepad), dat is meegeleverd met Windows, is één van de handigste programma's die er zijn, klein, snel en zonder poespas. Notepad2 probeert dit voorbeeld te volgen, het is ook klein en snel, maar het heeft meer. Bijvoorbeeld syntaxis highlighting voor HTML en andere veelgebruikte talen.
Dit was handig voor het ontwikkelen van de CSS file, de XSL file en in het begin ook de XML files.
Een typische “point & click” ontwikkelingstool was uiteraard goed van pas gekomen. Deze zijn echter in het algemeen (voor XML/XSL) en zeker voor deze specifieke toepassingen, helemaal onbestaande.
o Debian Debian is de Linux distributie waarin de website en webserver oorspronkelijk ontwikkeld werden, door gebrek aan embedded linux systemen.
Debian is een distributie van vrije software die gecreëerd is door de samenwerking van vrijwilligers over de hele wereld. Sinds het ontstaan is het uitgebrachte systeem, Debian GNU/Linux, gebaseerd op de Linuxkernel, en het besturingssysteem baseert zich op het GNU-project.
Debian kenmerkt door o.a. een gegarandeerde open en niet commerciële instelling en apt-get. Dit laatste programma zorgt ervoor dat je automatisch software kunt installeren en updaten.
Wouter Weyne
13
Debian heeft een aanbod van duizenden kant en klare softwarepakketten voor een tiental computerarchitecturen. Deze pakketten zijn vrij beschikbaar via het internet in een paar verzamelingen waarin vrije en niet-vrije software strikt gescheiden zijn.
o Apache Dit is de webserver waarmee en waarvoor de website oorspronkelijk getest en ontwikkeld is. Uiteraard omwille van dezelfde reden als hierboven beschreven: een gebrek aan embedded linux systemen.
Apache is een open source web server voor UNIX (BSD, GNU/Linux Mac OS X, Solaris en andere UNIX-systemen), Microsoft Windows, Novell Netware, BeOS, OS/2 en IBM's OS/400. Over de oorsprong van de naam Apache verschillen de meningen. Soms wordt aangenomen dat de oorspronkelijke auteur gewoon een originele naam had verzonnen terwijl anderen claimen dat de naam voorkwam uit "a patchy server". De eerste versie van Apache (welke uitkwam in februari 1995) bestond namelijk uit een aangepaste (gepatchte) versie van de NCSA HTTP-server. Later is alle code van Apache herschreven.
Oorspronkelijk was Apache het enige open source alternatief voor de Netscape webserver. Sinds de eerste versie is de populariteit gestaag toegenomen. In mei 2005 maakten ongeveer 70% van alle websites gebruik van Apache. Volgens de meeste statistieken neemt het gebruik ervan nog steeds toe. De door Netcraft uitgevoerde maandelijkse telling van het aantal webservers op het Internet wordt door de Internetgemeenschap als de meest accurate referentie beschouwd.
Apache wordt gebruikt in combinatie met verschillende databases, template-talen, scripttalen en programmeertalen ten behoeve van web-applicaties. Vooral de modulaire architectuur, die met het uitbrengen van Apache 2.0 nog sterk verbeterd is, maakt Apache tot een zeer geliefde webserver. De 2.0 release maakt het ook mogelijk om Apache als threaded webserver te gebruiken, wat de prestatie op het Windows besturingssysteem sterk verbetert.
Wouter Weyne
14
Enkele populaire modules voor Apache zijn:
mod_perl, om CGI in Perl te draaien op Apache mod_php, om PHP-webapplicaties te draaien op Apache mod_python, om Python-webapplicaties te draaien op Apache mod_proxy, om Apache om te toveren tot een HTTP-proxy mod_ssl, om Apache ondersteuning voor SSL te geven mod_rewrite, om de links die Apache geeft om te schrijven. verscheidene authenticatiemodules, zoals mod_auth_ldap (om webgebruikers te authenticeren tegenover een LDAP-server)
In 1999 is de Apache Software Foundation opgericht welke Apache (en ook andere vrije software, zoals het veelgebruikte 'Jakarta Struts') onderhoudt en verder ontwikkelt. Apache is de webservercomponent van de LAMP webontwikkelingsomgeving.
o WinSCP WinSCP is een grafische open-source Secure Shell File Transfer Protocol-client voor Windows die gebruik maakt van SSH. Het oudere SCP-protocol wordt ook ondersteund. De hoofdfunctie van het programma is het veilig kopiëren van bestanden tussen een lokale en een externe computer.
Het handige aan dit programma is het transfereren van bestanden tussen Windows en Linux. Het kiest automatische de juiste transfermode en vermijdt alle problemen.
Wouter Weyne
15
o Busybox Busybox is het embedded Linux-besturingssysteem dat op de Cameleon videogenerator draait.
Embedded Linux is de algemene naam voor Linux-besturingssysteem voor een ingebed systeem. Embedded Linux bestaat niet als een speciale soort GNU/Linux; het is een gewone, doch licht uitgevoerde, Linux kernel die specifiek voor bepaalde handelingen afgesteld is (zo zal een router geen X Window-systeem draaien). Bovenop deze kernel draait dan andere Linuxsoftware. Men kan kiezen er de traditionele GNU-software en -bibliotheken op te draaien, of lichtere alternatieven zoals dus in dit geval Busybox.
o Busybox httpd Dit is de webserver van Busybox. Het is een zeer simpele, kleine en eenvoudige versie. Men kan er niet veel mee doen, maar voor deze opdracht is het net voldoende.
Hoe deze server moet worden ingesteld volgt later in dit werk.
Wouter Weyne
16
1. De talen: 1.1
XML/XSL
Één van de allereerste vragen/problemen, die ik voorgeschoteld kreeg, was de keuze tussen XML (eXtensible Markup Language) en HTML. Op voorhand was iedereen er gewoon van uitgegaan dat het een site in HTML zou worden. In de Barco afdeling te Kuurne hebben ze echter onlangs alle sites vervangen hebben door XML exemplaren. Dit komt omdat er steeds meer met XML-based protocols (zoals SOAP) wordt gewerkt. Het protocol dat zal worden gebruikt is echter nog steeds text-based (het Remote ParPool protocol) en XML/XSL (Extensible Stylesheet Language) is een stuk ingewikkelder dan HTML. Toch werd er uiteindelijk beslist om XML te gebruiken. Dit heeft namelijk twee grote voordelen:
-
Er is veel minder werk als er later wordt overgeschakeld naar een XML-based protocol.
-
Eens klaar kan sneller en eenvoudiger een gelijkaardige site worden gemaakt voor een andere toepassing (cameleon, isis3…)
Wouter Weyne
17
1.1.1
XML vs. HTML
Hieronder worden enkele belangrijke voor- en nadelen opgesomd.
HTML: structuur (data) en weergave worden gecombineerd
+
Werkt op elke browser.
-
Resulteert in heel veel werk bij overschakeling naar een XML-based protocol.
XML: structuur (data) en weergave zijn afzonderlijk
+ Gemakkelijker als template te gebruiken: enkel het korte en overzichtelijke XML bestand dient te worden gewijzigd terwijl de XSL en CSS files hetzelfde blijven. +
In de toekomst zal XML HTML vervangen. Als tussenstap werd alvast XHTML (Extensible Hypertext Markup Language) in het leven geroepen. Dit is HTML opgemaakt volgens de XML subset.
+ Relatief weinig extra werk bij overschakeling naar een XML-based protocol.
-
Werkt niet op elke browser, al hebben alle nieuwere versies van de bekendste browsers nu wel al xml en xsl ondersteuning. Voor een gedetailleerd overzicht, zie hieronder.
XML Browser support •
Mozilla Firefox: Vanaf versie 1.0.2, ondersteunt Firefox XML en XSLT (en CSS).
•
Mozilla: Mozilla gebruikt Expat voor XML parsing en heeft ondersteuning om XML en CSS weer te geven.
•
Netscape: Vanaf versie 8 gebruikt Netscape de Mozilla engine, en daardoor heeft het dezelfde XML / XSLT ondersteuning als Mozilla.
•
Opera: Vanaf versie 9 heeft Opera ondersteuning voor XML en XSLT (en CSS). Versie 8 ondersteunt enkel XML + CSS.
•
Internet Explorer: Vanaf versie 5 ondersteunt Internet Explorer XML, Namespaces, CSS, XSLT en XPath.
Wouter Weyne
18
1.1.2
XML
Wat is XML nu eigenlijk? “eXtensible Markup Language (XML) is een standaard voor het definiëren van formele markup-talen voor de representatie van gestructureerde gegevens in de vorm van platte tekst. Deze representatie is zowel machineleesbaar als leesbaar voor de mens.”
Met andere woorden: XML is een bepaalde manier om gegevens gestructureerd vast te leggen. Deze manier is gedefinieerd en mag iedereen gebruiken. Het is ontworpen om zowel door een programma als door een mens leesbaar te zijn. XML is niet alleen geschikt om gegevens in op te slaan maar wordt veel gebruikt om gegevens via het internet te versturen.
XML is een afgeleide en vereenvoudigde vorm van SGML, Standard Generalized Markup Language, een heel complexe standaard die gebruikt werd om ingewikkelde documenten vorm te geven.
De bekendste afgeleide vorm van SGML is uiteraard HTML of HyperText Markup Language. HTML heeft voor een doorbraak in SGML-achtig vormgegeven tekst gezorgd, maar gegevens die op een HTML-pagina staan zijn voor computers niet als zodanig te herkennen.
XML zorgt nu juist voor die herkenbaarheid van gegevens. Voorbeeld: een XML-bestand dat landen en hun hoofdstad beschrijft zou er als volgt uit kunnen zien: BelgiëBrusselFrankrijkParijs
Wouter Weyne
19
Het gaat in dit bestandsformaat dus meer om de structuur van informatie, dit in tegenstelling tot HTML, of liever de manier waarop HTML veel gebruikt wordt, waarbij het meer gaat om de presentatie van de informatie. In deze HTML-bestanden beschrijven de tags wel hoe informatie moet worden gepresenteerd maar niet wat deze informatie betekent. Dit wordt afgeraden, en is grotendeels verwijderd uit HTML 4.01 Strict.
Hoe de gegevens opgemaakt zullen worden, wordt bepaald via een XSL document. Via deze weg wordt aan de XML data door XSD (XML Schema Definition Language, de opvolger van DTD (Document Type Definition)) en XSL een keurige opmaak gegeven en blijft de scheiding tussen opmaak en inhoud.
Data in XML-formaat kunnen door middel van XSLT-transformaties worden omgezet naar andere formaten zoals HTML, maar ook naar een XML-document met een andere structuur. In het geval van de transformatie naar HTML kan deze bewerking zowel aan de browserzijde als op de webserver plaatsvinden.
Wouter Weyne
20
1.1.3
XSL
“Extensible Stylesheet Language of XSL is een formele taal waarin beschreven kan worden, hoe XML-documenten geformatteerd moeten worden.”
Voorbeeld (toegepast op het XML voorbeeld): <xsl:stylesheet
xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
Voorbeeld
Naam
Hoofdstad
<xsl:for-each select="database/land">
<xsl:value-of select="naam"/>
<xsl:value-of select="hoofdstad"/>
Voeg ook de volgende lijn toe in het .xml bestand:
Resultaat:
Wouter Weyne
21
1.2
CGI Shell scripts
XML alleen is uiteraard niet voldoende, er is ook nog een scripttaal vereist. Dit is nodig voor de interactie tussen de website en het besturingssysteem (Linux – Debian). Hiervoor is er niet veel keuze, wegens de plaatsbeperking. Alle moderne scripttalen zoals ASP, PHP, JSP… nemen algauw enkele megabyte in. Deze geheugenruimte is nu eenmaal niet voor handen in de meeste embedded systemen. Ook de performantie zou drastisch lijden onder één van deze scripttalen. De keuze viel dus op één van de oudste scripttalen, die er zijn: CGI Shell scripts.
CGI Shell scripts is een samentrekking van CGI scripts en shell scipts. Deze shell scripts waren oorspronkelijk geschreven in de bash-taal. Kort voor het einde van dit eindwerk is echter nog beslist om over te stappen van de bash shell en bash-taal naar Haserl. Bij de bespreking van de website zelf, op het einde van deze scriptie, zal er telkens een vergelijking worden gemaakt tussen beide. Dit althans voor de onderdelen die nog binnen de opgegeven tijd konden worden omgevormd.
Wouter Weyne
22
1.2.1 Shell scripts Wat is een scripttaal?
Een scripttaal is een programmeertaal die geschikt is voor het schrijven van scripts. Dit zijn kleine programma’s om veel voorkomende taken (zoals systeembeheertaken) te automatiseren, of om een grote, maar eenmalige, taak te verrichten. Veelal hebben deze taken te maken met het verwerken van tekstbestanden. Scripttalen zijn over het algemeen highlevel talen, en worden doorgaans geïmplementeerd door middel van een interpreter, omwille van snelheid en gemak bij het ontwikkelen.
De scripttalen komen voort uit de gewoonte uit de jaren '60 om een reeks commando's (een batch) op een ponskaart te zetten. Bij latere, interactieve besturingssystemen (met een commandoregel) werden regelmatig uitgevoerde commandoreeksen opgeslagen in een bestand.
Toen men inzag dat een dergelijk bestand in feite een nieuw programma was, voegde men constructies toe aan de commandotaal zoals conditionele uitvoering (if-then-else), lussen (while, for) en variabelen. De shell van het besturingssysteem Unix (vanaf begin jaren '70) en taal SNOBOL zijn hier vroege voorbeelden van. Later (eind jaren '70) werd AWK ontworpen.
Vanaf eind jaren '80 werd een scala aan scripttalen ontwikkeld, zoals Perl, Python, ColdFusion, Tcl en Ruby. Sommige van deze talen bleken ook succesvol buiten hun oorspronkelijke toepassingsdomein.
In de jaren '90 werden verschillende scripttalen voor het Web ontwikkeld: bijvoorbeeld JavaScript, dat meestal in de browser, en VBScript, dat meestal op de server draait, en talen als ASP en PHP die uitsluitend op de server draaien. Alle zorgen voor dynamiek en interactie op websites. Java is geen scripttaal, omdat het wordt gecompileerd.
Wouter Weyne
23
Bash
Voor dit eindwerk is eerst gewerkt met scripts in de bash taal. Het voordeel hiervan is dat er geen extra interpreter vereist is. De linux Shell, waarop de webserver zich bevindt, doet al het werk.
Bash (Bourne-Again Shell) is de naam van een bekende shell van een Unix besturingssysteem. Het is geschreven door de GNU-organisatie en is sterk geïnspireerd op sh (afgeleid van de eerste twee letters van shell), het opdrachtregelprogramma van Unix. De naam is een woordvariant op de naam van het originele sh, dat voluit Bourne shell heet, naar de auteur (Stephen Bourne). Bourne Again wordt in het Engels hetzelfde uitgesproken als born again, wat wedergeboren betekent. Bash streeft 100% uitwisselbaarheid met sh na.
Omwille van de rijke syntaxismogelijkheden van Bash is het ook mogelijk in Bash complexe opdrachtregels uit te voeren. Deze opdrachten kunnen worden opgeslagen in afzonderlijke bestanden (meestal omwille van hun lengte) en vormen dan bash-scripts.
Een shell script begint altijd met het opgeven van de plaats van de shell. (#!/bin/bash)
Voorbeelden
#!/bin/bash echo -n "Kies een kleur (blauw, groen, rood...): " read -e COLOR echo Je hebt $COLOR gekozen!
Hier komt eerst een tekst op het scherm die vraagt een kleur in te typen. Vervolgens wordt de ingetypte kleur in een variabele ingelezen. Ten slotte wordt de inhoud van de variabele weergegeven ter controle.
Wouter Weyne
24
#!/bin/bash ls > output.txt
Dit voorbeeld voert het “ls” commando uit, wat neerkomt op het weergeven van de inhoud van de huidige directory. Vervolgens schrijft het script deze inhoud weg in het bestand “output.txt”.
#!/bin/bash let temp=$1**2 echo "$1 ^ 2 = $temp !"
In dit script wordt met een externe variabele gewerkt; deze wordt binnengelezen en verder gebruikt als variabele $1. Eerst wordt deze variabele gekwadrateerd en weggeschreven in de variabele met naam “temp”. Ten slotte wordt deze variabele, samen met nog wat extra tekst ter verduidelijking, op het scherm geplaatst.
In dit laatste voorbeeld wordt eerst een regel tekst op het scherm getoond. Vervolgens wordt een bericht ingelezen vanuit de directory /home/wouter en ook op het scherm gezet. Als laatste wordt dan weer een regel tekst weergegeven. Op het scherm zal dit er gewoon uitzien als één lang bericht.
Wouter Weyne
25
Haserl •
Wat is Haserl?
Haserl staat voor “Html And Shell Embedded Report Language”.
Haserl is een klein cgi programma, dat toelaat om shell scripts te gebruiken in html documenten. Dit laat je dus toe om net als bij PHP, ASP, JSP… in-process te werken. Het is uiteraard bedoeld voor omgevingen waar de vorige drie scripttalen te groot voor zijn.
Het was geschreven voor Linux, maar is gekend om op FreeBSD te draaien. Als men de binary file compileert kom je meestal onder de 20K uit. Het wordt voornamelijk gebruikt om cgi scripts uit te voeren op een kleine webserver, zoals mini-httpd, thttpd, of de server die standaard in busybox aanwezig is. In dit eindwerk is uiteraard de laatste gebruikt.
De naam "Haserl" komt van het Beierse woord voor "konijn". Het logo van Haserl is dan uiteraard ook de afbeelding van een konijn. Het programma is gratis beschikbaar onder de voorwaarden van de GNU Public License (GPL2). •
Waarom Haserl gebruiken?
Haserl stelt het absolute minimum ter beschikking om shell scripts te verbinden met een webserver cgi. Waarom zouden we dan Haserl gebruiken? Waarom niet gewoon shell scripts uitvoeren en met behulp van "echo" of "cat" de html genereren? (zoals wel gedaan met in de bash-taal) Hieronder volgen enkele redenen waarom Haserl is geschreven:
Automatische FORM parsing, FORM elementen worden geparsed en vervolgens geplaatst in omgevingsvariabelen, die gebruikt kunnen worden door de cgi. Dit betekent dat het shell script zich geen zorgen hoeft te maken over het decoderen van de POST of GET data die verzonden wordt door de browser.
Parsen gebeurt zoals bij "php-lite". Alles wat niet in ... ?> tags staat wordt verondersteld html te zijn. Dit is dus net hetzelfde als PHP gebruiken.
Wouter Weyne
26
Klein! Het is zeer klein en compileert gewoonlijk voor minder dan 20kB (stripped). De optionele database module (haserldb) voegt hieraan minder dan 60kB toe (stripped).
Parsing aan de hand van condities Blokken script (of html) kunnen worden gegenereerd aan de hand van conditionele uitdrukkingen. Het is bijvoorbeeld mogelijk om een self-referencing cgi script te maken dat a)een form weergeeft, b) de invoer valideert en informatie opnieuw opvraagt indien nodig, en c) handelt naar de form data, door gebruik te maken van conditionele if/then/else scripts.
Haserl neemt alle form invoer van de client (via het POST of GET statement) en creëert omgevingsvariabelen vanuit de form inhoud. Dit is op zich niets nieuw en is reeds voorgedaan door andere cgi programma’s. Haserl kan echter overweg met MIME data verzonden via de enctype="multipart/form-data" methode. Deze methode wordt gebruikt wanneer er bestanden worden geüpload van de client, waardoor het simpel wordt om een cgi te schrijven die geüploade binary files behandelt door enkel en alleen het gebruik van shell scripts. •
Safety Features
Het programmeren van cgi's met shell scripts is gevaarlijk. Er is reeds veel geschreven over waarom geen cgi's in shell script mogen worden gemaakt. Om enige bescherming te voorzien wanneer shell wordt gebruikt als cgi scripting language, heeft haserl de volgende onderdelen:
Form variabelen krijgen het woord FORM ervoor. Vermits de client gelijk welke data naar de server kan versturen, plaatst haserl het woord FORM_ voor alle geüploade form elementen. Dit voorkomt dat clients met slechte bedoelingen zaken als
REMOTE_ADDR=trusted.host
of SCRIPT_NAME=/etc/passwd
kunnen
versturen.
Geüploade bestanden worden enkel aanvaard als ze verwacht worden. haserl zet de file-upload mogelijkheid standaard uit. Om toe te staan dat een bestand wordt
Wouter Weyne
27
geüpload naar de server, moet je de -u parameter meegeven op de haserl command line – zoals dit: #!/usr/local/bin/haserl -u Privilege Escalation. Bijvoorbeeld: als er één cgi script is die "root" access nodig heeft, maar alle andere niet, dan kan men dat ene script instellen alsof het van de "root" is, en de andere scripts zullen nog steeds uitgevoerd worden zoals deze van de non-privilege user. •
Een voorbeeld ter verduidelijking
Hieronder is een voorbeeld te zien van een functioneel haserl script dat de invoer van de gebruiker neemt, dit omvormt naar uppercase, en de gebruiker toelaat het resultaat (opnieuw) te bewerken. Als er enige invoer was, geeft de form aan of deze al dan niet omgevormd is naar uppercase.
#!/usr/bin/haserl content-type: text/html Sample Haserl Form
Sample form running on hostname ?>
Please note that I had to uppercase some of your inputInput above was already uppercased
Op de volgende bladzijde volgt de uitleg van dit voorbeeld.
Wouter Weyne
28
Lijn 1 specificeert Haserl als de script interpreter.
Lijn 2 specificeert de http header "content-type". Het is een standaard gebruik voor cgi scripts om http headers door te geven vlak voor de inhoud. Een enkele witte lijn (lijn 3) scheidt de http headers van de inhoud. Andere http headers kunnen worden gespecificeerd en het is ook mogelijk om andere MIME-types (audio, image, plain-text, etc.) te maken met Haserl.
Lijnen 4-10 zijn standaard HTML. Haserl geeft deze door aan stdout (de client browser) en dit unparsed.
Lijn 11 de hostname ?> constructie doet het "hostname" program lopen, wat de hostname naar stdout print. Dit betekent dat de client iets ontvangt in de aard van "Sample form running on localhost" of "Sample form running on Darkstar".
Lijn 12 gebruikt de door de web-server gegenereerde SCRIPT_NAME omgevingsvariabele om een self-referencing cgi te maken. Als de CGI een andere naam krijgt op de server, zal het nog steeds werken zonder enige verandering aan de code.
Lijn 13 creëert een "textarea" form element met de naam "textarea1". Het script plaats vervolgens de, naar uppercase omgezette, inhoud van de omgevingsvariabele "FORM_textarea1" in het form element. Haserl zorgt voor het parsen van form elementen. Wanneer er dus op de "submit" knop wordt geklikt, zal de invoer van de client (uit het "textarea1" form element) worden opgeslagen in een omgevingsvariabele met de naam "FORM_textarea1". Het effect hiervan is dat alles wat de client aan de webserver doorgaf in uppercase zal omgevormd zijn.
Lijn 18 begint een conditioneel blok. Lijn 19 wordt enkel uitgevoerd als de shell uitdrukking "true" is. Lijn 20 bevat een "else" clausule die ervoor zorgt dat lijnen 21-23 uitgevoerd worden als de uitdrukking "false" is.
Lijnen 21-23 bevatten een conditioneel blok dat wordt uitgevoerd binnenin een ander blok (lijn 18). Het is dus mogelijk om if/then clauses te nesten.
Wouter Weyne
29
1.2.2 CGI scripts Een Common Gateway Interface of CGI is een belangrijke WWW technologie, die het mogelijk maakt om in de browser dynamisch gegevens op te vragen van de webserver. CGI is een standaard voor data overdracht tussen de cliënt en het programma.
CGI is ontwikkeld door NCSA in 1993 voor de NCSA HTTPd webserver. Gegevens uit de querystring worden door de webserver als omgevingsvariabelen doorgegeven aan het aangeroepen CGI-programma, en deze worden door het programma gebruikt als parameters. Het programma stuurt het resultaat van de bewerking terug naar de webserver, en de webserver stuurt het terug naar de browser.
CGI-programma's worden door de webserver principieel anders behandeld dan statische HTML pagina's. Daarom hebben CGI-programma's speciale rechten (uitvoerbaar) nodig. Vaak worden dergelijke programma's bij elkaar in een directory gezet, waarbij de benodigde rechten op alle bestanden in die directory staat. Een veelgebruikte naam voor zo'n directory is "cgi-bin".
Voor CGI-programma's kan een scripttaal worden gebruikt, maar ook een gecompileerd programma. Het is zelfs mogelijk om onder Windows, een DOS batch-file als CGIprogramma te laten functioneren.
Scripttalen die veel voor CGI worden gebruikt zijn Perl, Python en Ruby. Bij CGI wordt elke keer als een CGI-programma wordt opgevraagd, een nieuw proces gestart. Dat kan capaciteitsproblemen geven bij een te groot aantal requests. Later ontwikkelde technologieën als PHP, ASP en ColdFusion ondervangen dit probleem. Bij deze technologieën lopen de scripts in-process (de scripts bevinden zich midden in de HTML/XML pagina’s) in de webserver. Hier werd gekozen voor scripts in de bash taal, zoals hiervoor vermeld.
In de veelgebruikte Apache webserver is het inmiddels mogelijk om CGI-programma's inproces te laten lopen, door het installeren van de mod_perl module. De webserver is daardoor in staat om zelf perl-scripts te interpreteren en hoeft geen externe perl-interpreter aan te roepen. Dit is uiteraard enkel voor perl-scripts.
Wouter Weyne
30
1.3
Remote ParPool protocol
Een site opgebouwd uit enkel XML en shell scripts is uiteraard nog vrij statisch. Om de parameters van een applicatie te kunnen veranderen moet er een connectie worden opgezet met deze applicatie. Dit gebeurt vanuit de shell scripts. Vervolgens wordt het Remote ParPool protocol gebruikt om, over deze connectie, commando’s door te geven die onder andere de parameters kunnen opvragen en wijzigen.
Op de volgende bladzijde wordt eerst de remote connectie toegelicht, gevolgd door een korte uiteenzetting van het Remote ParPool protocol.
Wouter Weyne
31
1.3.1
Remote connectie
Scope
Hierin wordt beschreven hoe de communicatie verloopt met een embedded applicatie (via een andere embedded applicatie, een remote interface...).
Aanpak
Er is gekozen om netwerk sockets en een protocol te gebruiken als communicatie kanaal tussen de verschillende processen. Dit laat toe om enkele processen op andere fysische processors binnen hetzelfde systeem te plaatsen of op andere machines buiten het systeem. Dit wordt duidelijk gemaakt via onderstaande figuur en de bijhorende uitleg op de volgende bladzijde.
Figuur 1.4: remote connectie
Wouter Weyne
32
De embedded applicatie
Tegenwoordig is de applicatie één monolithisch blok dat instaat voor de functionaliteit. De enige mogelijkheid om te communiceren met de applicatie is via een user-interface of een remote protocol. Beide gebruiken de ParameterPool als interface naar de rest van de functionaliteit binnenin het monolithisch blok.
Sinds er binnen Barco is overgestapt naar embedded Linux als operating system voor al hun applicaties, kan er wat nieuwe functionaliteit gebruikt worden als socket voor remote connecties. Door gebruik te maken van deze remote connectie, biedt de applicatie ook extra functionaliteit via een socket, gebruik makende van een gedefinieerd protocol. Dit kan gebruikt worden om delen van de applicatie te verplaatsen naar zijn eigen proces. De application is uitgebreid met een provider, die een service aanbiedt op een welbepaalde socket.
De provider
De provider is een deel van de software die toegang verleent tot de embedded applicatie op een vooraf gedefinieerde socket, gebruik makende van een vooraf gedefinieerd protocol. Dit kan bijvoorbeeld een provider zijn om de ParameterPool te benaderen. Deze provider luistert op poort 1234 of naar een unix socket voor inkomende connecties. Er is een zeker protocol vooraf gedefinieerd voor deze connectie. De provider luistert enkel naar connecties afkomstig van de “local host”.
Het protocol
Voor elke provider is er een protocol gedefinieerd. Dit is een text-based protocol voor het gemak van het debuggen. Momenteel is er geen algemeen protocol voor alle providers. Het protocol dat hier gebruikt wordt is het RemoteParPoolProtocol, meer uitleg hierover volgt verder.
Wouter Weyne
33
Security en authenticatie
We splitsen de remote verbindingen op in twee groepen: processen, die zich bevinden op het systeem en processen, die zich bevinden op een ander systeem. Lokale processen kunnen rechtstreeks connecteren op de provider met behulp van een network socket (bv. poort 1234) of via een unix socket (bv. /tmp/some_socket). Aangezien je zelf het lokale systeem beheert is er geen nood aan authenticatie of aan de encryptie van de data. Deze manier van werken zorgt niet voor extra belasting.
Remote processen kunnen uiteraard geen directe verbinding maken met de providers. Deze moeten eerst een verbinding maken met de SSH daemon. Deze daemon voorziet het systeem met een versleutelde en geverifieerde connectie. Het remote proces kan een verbinding maken met alle providers door middel van deze SSH connectie.
Voorbeelden en implementaties •
Een provider voor de ParameterPool, deze voorziet alle operaties op parameters en het verwittigingsmechanisme naar een client.
•
Het debuggen van de applicatie over het netwerk.
•
Het tekenen en bedienen van de OSD (on-screen display) in een afzonderlijk proces. Het tekenen van de the OSD laadt de processor en zou de applicatie voor een tijdje kunnen blokkeren. Dit kan voorkomen worden door deze functionaliteit te verplaatsen naar een ander proces. De Linux kernel zal dit proces uitvoeren wanneer nodig.
Wouter Weyne
34
1.3.2
Remote ParPool protocol
Nu volgt een blik op het Remote ParPool protocol, een protocol dat reeds werd gesitueerd in het vorige onderdeel.
Dit protocol is geïnspireerd op het Barco protocol, met een aantal aanpassingen om het te vereenvoudigen.
Benamingen •
Server: deze bezit de ParameterPool en voorziet een socket waarop een client verbinding kan maken.
•
Client: deze bevindt zich in een third party application en wil verbinding maken met de ParameterPool.
Opmerkingen •
Dit is een ASCII-based protocol.
•
De communicatie is geblokkeerd tussen de verschillende berichten.
•
De commands voor het protocol zijn case insensitive.
•
Berichten eindigen met een linefeed (\n)
•
Meerdere commando’s kunnen gecombineerd worden in één bericht door gebruik te maken van een : als scheidingsteken tussen de verschillende commando’s.
Wouter Weyne
35
De lijst met alle commando’s
Command name
Initiator
Usage
Expected reply
Description
getversion
Client
getversion
ES,0,1.0, 1.1,...
Get a list of the supported protocol versions.
version
Client
version,2.0
No Reply
Session will use this protocol version as of now.
getcollectorcount
Client
getcolcnt
ES,0,x
Ask for the number of registered collectors.
getparametercount
Client
getparcnt, collId
ES,0,x
Ask for the number of registered parameters in the collector with id CollId.
getparametertype
Client
getpartype,id
ES,0,x
Ask for the type of a given combined parameter id.
lookupparameterid
Client
lookupparid, collector,parameter
ES,0,id
Get the id of the parameter according to it's collectorname and parametername
lookupcollectorid
Client
lookupcolid,collector
ES,0,id
Get the id of the collector according to it's collectorname.
Observerparameterchange
Client
observe,id[, changeMask]
No Reply
Start observing changes for a certain parameter
getpermissions
Client
getperm,id
ES,0,r,w,x
Get the permissions of a parameter (combined parameter id)
getparametername
Client
getparname,id
ES,0,name
Get the name of a parameter
ES,0
Set the parameter (according to the collector id and the parameter id) to the value.
setvalue
Client
setv,id,value,mask
getvalue
Client
getv,id
ES,0,value
Get the value of a parameter (according to the collector id and the parameter id).
increment
Client
incr,id,step,mask
ES,0
Increment the value of the parameter.
decrement
Client
decr,id,step,mask
ES,0
Decrement the value of the parameter.
getmin
Client
getmin,id
ES,0,x
Get the minimum allowed value of the parameter.
Wouter Weyne
36
getmax
Client
getmax,id
ES,0,x
Get the maximum allowed value of the parameter.
getstringvalue
Client
getstring,id
ES,0,string
Get the string representation of a parameter.
getdefaultvalue
Client
getdefault,id
ES,0,x
Get the default value of a parameter.
getlength
Client
getlength,id
ES,0,x
Get the length of a stringparameter.
getmaxlength
Client
getmaxlength,id
ES,0,x
Get the maximum length of a stringparameter.
execute
Client
execute,id
ES,0
Execute a commandparameter.
format
Client
format,id,value
ES,0,x
Format a value according to a formatter (addressed through the id)
reverseformat
Client
reverseformat,id, string
ES,0,x
Reverse format a value according to a formatter (addressed through the id)
alias
Client
alias,name
ES,0,id
Search the parameter (name) in all collectors and return the best matching.
notify
Server
notify,id,mask
No Reply
Change notification of the ParPoolChangeManager
Uitleg bij de parameters uit de antwoorden
x Numerieke waarde collId Numeriek, id van een collector id Numeriek, id van een parameter of collector of beide collector String, naam van een collector parameter String, naam van een parameter changeMask String, TBD
Wouter Weyne
37
mask String, TBD value String of numerieke waarde step Numerische waarde, gebruikt bij increments of decrements name String, de alias van een parameter
Message flow •
Als er verbinding wordt gemaakt vraagt de client naar de beschikbare versies van het protocol. De versie wordt geselecteerd door het version statement.
•
Bij de meeste berichten treedt de klant als initiator op, met uitzondering van de change notifications.
Object setup
Dit is een overzicht van de architectuur. Dit omvat een main application (rechts), die de ParPool bevat en een slave application (links). Deze slave application maakt gebruik van een RemoteParPool, die een deel van de ParPool in de main application kopieert om dan verder te gebruiken. Op de volgende bladzijde is dit in een figuur mooi weergegeven en volgt nog wat extra uitleg over de verschillende onderdelen.
Wouter Weyne
38
Figuur 1.5: object setup
Beschrijving van de objecten
•
ParPool: de volledige ParameterPool, die alle parameters bevat die gekend zijn door het systeem.
•
ParPoolInterface: een façade, die zich voor de ParPool bevindt en die een enkel toegangspunt voorziet naar de ParPool en zijn parameters.
•
ParPoolServer: een server, die luistert naar een socket en die het protocol ondersteunt.
•
ParPoolClient: een client verbonden met een server en ook deze client ondersteunt het protocol.
•
RemoteParPool: een ParPool, die dezelfde interface/functionality biedt zoals de ParPool, maar slechts voor een bepaald aantal parameters. Deze RemoteParPool onthoudt alle data van zijn parameters.
Wouter Weyne
39
2. De website: 2.1
Applicatieonafhankelijk platform
2.1.1
XML/XSL
Dit is het belangrijkste deel van de website. De XML indexpagina is uiteraard nodig om naar de website te kunnen surfen, maar het XSL bestand is het hart van het hele gebeuren. Hierin bevindt zich voor elke instantie precies één opmaakmodel. Zo bestaat er een model voor een tekstveld, het menu, een dropdown list…
Hier zullen enkel het menu, de header en de footer worden besproken. Deze zijn voor alle pagina’s hetzelfde. De rest van de XSL file komt aan bod in het onderdeel over de shell scripts. Dit is omdat alle data, waarmee de XSL file werkt, gegenereerd wordt via deze shell scripts. Het zou niet duidelijk overkomen als deze los van elkaar worden besproken.
De header
De header bevat twee nuttige links in verband met Barco (“home” en “about us”) en de mogelijkheid om de webmaster te mailen.
1. Screenshot
Figuur 2.1: site header
Wouter Weyne
40
2. XML data
HomeAbout Us Mail Pagemaster
Tussen de header tags worden de drie links en de tekst, die op het scherm moet komen, weergegeven. Deze data zal nu verwerkt worden door de XSL file.
3. XSL opmaakmodel
<xsl:apply-templates select="header" />
Hier wordt eerst de afbeelding linksboven geplaatst, met bijhoren link naar barco.com. Tussen de commentaar tags wordt vervolgens verwezen naar de header template. Alles wordt ook opgemaakt met zelfgedefinieerde CSS klasses.
In deze header template worden vervolgens de links op hun juiste positie gezet en wordt ook het verticale streepje tussen de verschillende links gezet.
Wouter Weyne
42
Het menu
1. Screenshot
Figuur 2.2: site menu
2. XML data
Color gatesSync parametersSignal swing parametersFrequency ratesHorizontal settingsVertical settings
Dit is het navigatieblok, de links verwijzen naar shell scripts (.sh) uit de cgi-bin directory, maar later meer hierover.
Het menu begint met een afbeelding van de Barco controlrooms. Vervolgens staat eerst de titel van het menu te lezen, deze titel verwijst terug naar de index pagina. Ten slotte wordt er eerst een kleine insprong gemaakt en dan komt de inhoud van het menu.
De footer
1. Screenshot
Figuur 2.3: site footer
Wouter Weyne
45
2. XML data
De footer is vrijwel analoog met de header. De data bestaat simpelweg uit een aantal nuttige links.
3. XSL opmaakmodel
<xsl:apply-templates select="footer" />
Eerst is er weer de typische verwijzing naar de footer template.
In deze footer template worden de links op hun juiste positie gezet en wordt ook het verticale streepje tussen de verschillende links gezet. Het geheel wordt afgerond met het plaatsen van het Barco logo in de rechter benedenhoek.
Visuele opmaak
De XSL zorgt uiteraard enkel voor de opmaak van de data, de echte visuele opmaak gebeurt via een externe CSS file. Hiervoor werd gebruik gemaakt van de Barco CSS file om de typische Barco lay-out te bekomen. (voor de CSS file, zie bijlage 1)
Wouter Weyne
47
2.1.2
Connectie tussen XML en shell scripts
De CGI scripts worden telkens opgeroepen door in het menu op één van de links te klikken. Deze links verwijzen allemaal naar een specifiek shell script. Elk shell script zal een volledige XML pagina genereren, die dan op de gebruikelijke manier opgemaakt wordt door de XSL en CSS files.
Deze scripts dienen allemaal in de speciale cgi-bin directory te staan. Op die manier weet de server dat het een bestand is, dat hij moet uitvoeren en niet gewoon weergeven, zoals alle andere bestanden.
Een voorbeeld ter verduidelijking: Color gates
Door te klikken op deze link (“Color gates”) zal het script “page1.sh” uit de cgi-bin directory worden uitgevoerd.
Het uitvoeren van de CGI shell scripts gebeurt door de specifieke Linux shell (bash, Haserl…). Deze shell zal voornamelijk XML tags en inhoud weergeven via het echo commando, aangevuld met enkele speciale commando’s om de parameters op te vragen.
Wouter Weyne
48
2.1.3
Shell scripts
Elk shell script heeft twee opdrachten. De eerste opdracht is het genereren van XML code aan de hand van het echo commando. De tweede opdracht is dan het inlezen en wegschrijven van de parameters, maar dit wordt besproken in het volgende punt.
Naast het genereren van de reeds besproken delen (het menu, de header en de footer) worden ook de in- en uitvoermogelijkheden gegenereerd. Dit zijn de checkbox, het textfield, de radiobuttons en het dropdown menu. Deze vier worden hieronder nu uitgelegd.
De checkbox
Deze mogelijkheid wordt meestal gebruikt als de keuze van in- en uitvoer “aan/uit” is. Dit is de meest duidelijke manier, aangevinkt is de optie “aan” en niet aangevinkt is de optie “uit”. Er wordt natuurlijk zoveel mogelijk vermeden dat de klant niet gewenste inhoud kan opgeven.
1. Screenshot
Figuur 2.4: checkboxen
Wouter Weyne
49
2. XML data
De code voor één checkbox, de “Channel red” uit het screenshot, wordt nu onder de loep genomen.
echo
""
echo
"Channel red:"
echo -n
"channelRed"
cat
/var/www/pars/channelRed
echo
""
echo
""
Bij de data worden het label en de naam weergegeven. Tussen dit alles wordt ook nog de gewenste waarde ingelezen via het “cat” commando. Over dit commando en het opvragen van de parameters volgt later meer uitleg.
In de eerst kolom van de tabel wordt het label geplaatst om duidelijk te maken over welke parameter het gaat. Vervolgens wordt de checkbox gemaakt met één of twee attributen. Het eerste is de naam en als de ingelezen waarde gelijk is aan “1” wordt het tweede attribuut “checked”.
Het textfield
Dit is veruit de gevaarlijkste vorm van in- en uitvoer. Dit gebruikt men als de opties in de tientallen lopen. Het grote gevaar hierbij is dat de klant eender wat kan invoeren. Dit is echter de enige oplossing zonder met een extra scripttaal te moeten werken, wat gezien de opdracht uiteraard niet mogelijk is.
1. Screenshot
Figuur 2.5: textfields
2. XML data
De code voor één textfield, de “Pixel time” uit het screenshot, wordt nu onder de loep genomen.
echo
""
echo
"Pixel time:"
echo
"pixelTime"
cat
/var/www/pars/pixelTime
echo
"15ns"
echo
""
Wouter Weyne
51
De data is analoog met de checkbox, alleen komen er nog de lengte van het veld bij en de eenheid die na het veld staat.
In de eerst kolom van de tabel wordt het label geplaatst om duidelijk te maken over welke parameter het gaat. Vervolgens wordt het textfield gemaakt met drie attributen. Het eerste is de naam, het tweede de waarde en het derde de lengte van het veld. In de derde en laatste kolom wordt ten slotte nog de eenheid van de parameter vermeld.
Wouter Weyne
52
De radiobuttons
De radiobuttons worden gebruikt als de keuzemogelijkheden uit een twee- tot viertal opties bestaan. Dit is duidelijk en overzichtelijk en opnieuw kan de klant niets verkeerd doen.
1. Screenshot
Figuur 2.6: radiobuttons
2. XML data
echo
""
echo
"Horizontal polarity:"
echo
"syncPolHorizontal"
echo
""
echo
"Negative0syncPolHorizontal"
echo -n
""
cat
/var/www/pars/syncPolHorizontal
echo
""
echo
""
echo
""
echo
"Positive1syncPolHorizontal"
echo -n
""
cat
/var/www/pars/syncPolHorizontal
echo
""
echo echo
"" ""
Wouter Weyne
53
Op de vorige bladzijde was de code voor één groep radiobuttons te zien, de groep “Horizontal polarity” uit het screenshot.
Elke groep heeft een gemeenschappelijke naam en label. Naast deze twee zijn er dan ook nog de “values”. Dit zijn alle verschillende radiobuttons van één groep. Elke value heeft een naam, een ID, de groepsnaam en de favoriete waarde. Deze waarde dient om te weten welke radiobutton aangeklikt moet zijn en wordt opnieuw ingelezen via het cat commando.
In de eerst kolom van de tabel wordt het label geplaatst om duidelijk te maken over welke parameter het gaat. Vervolgens worden de radiobuttons gemaakt met drie of vier attributen: de naam, het ID, de groepsnaam en de eventuele selectie.
Wouter Weyne
54
Het dropdown menu
Het dropdown menu wordt gebruikt als er zo’n vijf tot twintig mogelijke opties zijn. Dit is duidelijk en overzichtelijk en opnieuw kan de klant niets verkeerd doen. Het dropdown menu is veruit het meeste werk, wat zich vertaalt in de grootste hoeveelheid code. Toch blijft het allemaal heel overzichtelijk.
1. Screenshot
Figuur 2.7: dropdown menu
2. XML data
echo
""
echo
"Sync select:"
echo
"syncSelect"
echo
""
echo
"None0"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"ACS1"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
Wouter Weyne
55
echo
""
echo
""
echo
"ACS DCS2"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"ACS DSS3"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"ACS DCS
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
DSS4"
echo
"DCS5"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"DCS DSS6"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"DSS7"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"DPMS Off8"
echo -n
""
cat
/var/www/pars/syncSelect
Wouter Weyne
56
echo
""
echo
""
echo
""
echo
"DPMS Suspend9"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"DPMS Standby10"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo
""
echo
""
echo
"DPMS On11"
echo -n
""
cat
/var/www/pars/syncSelect
echo
""
echo echo
"" ""
Elk dropdown menu heeft een gemeenschappelijke naam en label. Naast deze twee zijn er dan ook nog de “values”. Dit zijn alle verschillende opties van één menu. Elke value heeft een naam, een ID en de favoriete waarde. Deze waarde dient om te weten welke optie aangeklikt moet zijn en wordt opnieuw ingelezen via het cat commando.
In de eerst kolom van de tabel wordt het label geplaatst om duidelijk te maken over welke parameter het gaat. Vervolgens wordt het dropdown menu gemaakt waarbij elke optie twee of drie attributen heeft. Dit zijn de naam, het ID en de eventuele selectie.
Wouter Weyne
58
De “save” knop
Deze knop maakt deel uit van een form die telkens de hele pagina omvat. Bij een klik op de knop wordt het shell script opgeroepen dat bij de pagina hoort. Dit script zorgt voor het ophalen en wegschrijven van de variabelen. Meer hierover in het volgende onderdeel.
1. Screenshot
Figuur 2.8: save button
2. XML data
echo
""
De knop is uiteraard het eenvoudigste om te maken wat XML data betreft. De twee opties die meegegeven worden zijn het type van de knop en de waarde die op de knop te lezen staat.
3. XSL stylesheet
Hierbij wordt er vertrokken vanuit de form:
Deze bestaat uit twee grote delen: de secties (alles wat hiervoor is besproken) en de knop (om de form uit te voeren).
De knop zelf krijgt gewoon het type en de waarde mee uit de XML data.
Wouter Weyne
60
2.1.4
Connectie tussen shell scripts en ParPool
Theoretische benadering
Dit is de manier waarop het uiteindelijk zal moeten werken. Er moet echter nog een stuk software geschreven worden door mensen van Barco zelf vooraleer dit kon toegepast worden.
Deze software draait rond één socket die zich gedraagt als een file. Die file dient als een doorgeefluik voor de commando’s van het Remote Parpool protocol. Hoe deze commando’s juist worden opgebouwd valt hieronder te lezen.
1. Lezen
Om een waarde te kunnen inlezen, moet de website eerst het “getvalue” commando naar deze file versturen. Het gebruik van het commando is als volgt: getv, id. De file zal dan in de ParameterPool de waarde van de parameter met dat ID gaan ophalen. Deze waarde wordt vervolgens terug naar diezelfde file geschreven. Ten slotte lees je deze file net zoals je de inhoud van een andere file leest.
cat
/tmp/special-file
2. Schrijven
Om een waarde te kunnen wegschrijven moet je eerst deze waarde in een variabele steken. Dit gebeurt door elke in- en uitvoermogelijkheid een naam te geven en er vervolgens het script “proccgi.sh” op los te laten. Voor dit script: zie bijlage 2.
Elke variabele waarde van de pagina zal nu in een variabele zitten met de naam “$FORM_naam”. Nu hoeft enkel nog deze opgevulde variabele aan de speciale file te worden doorgegeven. Dit gebeurt via het “setvalue” commando. Je stuurt via een echo de string “setv,id,value,mask” naar de file en de applicatie doet de rest.
Wouter Weyne
61
Huidige situatie
Dit is de manier waarmee er gewerkt werd tot aan de inleverdatum van deze scriptie. Er moet dus nog een stuk software geschreven worden door mensen van Barco zelf vooraleer er kon worden overgeschakeld naar de echte manier.
In deze situatie draait alles rond een groot aantal files. Er zijn evenveel files als er parameters zijn. Elke parameter is specifiek gekoppeld aan zijn eigen file, in deze laatste staat simpelweg de waarde van de parameter.
1. Lezen
Om een waarde te kunnen inlezen, moet de website simpelweg de inhoud van de file lezen.
cat
/var/www/pars/parameterX
2. Schrijven
Om een waarde te kunnen wegschrijven moet je eerst deze waarde in een variabele steken. Dit gebeurt door elke in- en uitvoermogelijkheid een naam te geven en er vervolgens het script “proccgi.sh” op los te laten. Voor dit script: zie bijlage 2.
Elke variabele waarde van de pagina zal nu in een variabele zitten met de naam “$FORM_naam”. Nu hoeft enkel nog deze opgevulde variabele aan de specifieke file te worden doorgegeven. Dit gebeurt via een simpel echo –n commando. De –n is zeer belangrijk, zonder dit wordt er ook nog een linefeed (een nieuwe lijn) meegegeven met de waarde, wat voor veel problemen zorgt.
echo –n
$FORM_parameterX > /var/www/pars/parameterX
Wouter Weyne
62
2.1.5
Het opzetten van de webserver en de website
In dit onderdeel wordt stap voor stap overlopen wat er moet gebeuren om tot een werkend geheel te komen. Dit gebeurt zowel voor het ontwikkelplatform als het doelplatform.
Ontwikkelplatform
Het ontwikkelplatform was Apache 1.3.
Het eerste wat noodzakelijk is, is het downloaden en installeren van de Apache 1.3 server. Deze server kent reeds de extensies .xml en .xsl en heeft een speciale directory voor cgi scripts. Nu is er dus al een correct werkende server.
Het volgende punt is het plaatsen van de files. Het merendeel van de files moet naar de /var/www map (het is echter mogelijk deze map te veranderen bij de server instellingen). De grote uitzondering hierop zijn de cgi shell scripts. Deze moeten in de /usr/lib/cgi-bin directory komen. Dit is een directory die doorgelinkt wordt naar /var/www/cgi-bin. Dit doorlinken en het juist zetten van alle opties op deze directory gebeurt in en door de “alias” module van de server.
Ten slotte moeten de juiste permissies nog gezet worden. Voor alle shell scripts in de cgi-bin directory gebeurt dit met het commando “chmod 700 *”. De shell scripts moeten dus toestemming hebben om uitgevoerd te kunnen worden.
Als er in plaats van met de echte ParameterPool, nog met afzonderlijke files gewerkt wordt, dan moeten al deze files volledige schrijf- en uitvoertoestemming krijgen. Dit gebeurt met het commando “chmod 777 *”.
Wouter Weyne
63
Doelplatform
Het doelplatform is de standaard httpd server van Busybox 1.5.
Hierbij is het zeer belangrijk om Busybox 1.5 te kiezen want op voorgaande versies duiken er steeds onverklaarbare problemen op.
Deze server is automatisch aanwezig in Busybox, het enige wat gedaan moet worden is het aanroepen ervan. Dit gebeurt door het commando “httpd –h /var/www”. De –h parameter duidt de home-locatie aan.
Het volgende punt is het plaatsen van de files. Op deze server dient gewoon alles onder de /var/www map te staan.
Ten slotte moeten de juiste permissies nog gezet worden. Voor alle shell scripts in de cgi-bin directory is dit met het commando “chmod 700 *”. De shell scripts moeten dus toestemming hebben om uitgevoerd te kunnen worden.
Als er in plaats van met de echte ParameterPool, nog met afzonderlijke files gewerkt wordt, dan moeten al deze files volledige schrijf- en uitvoertoestemming krijgen. Dit gebeurt met het commando “chmod 777 *”.
Wouter Weyne
64
2.2
Specifiek toegepast op de Cameleon Videogenerator
Voor de specifieke toepassing naar één platform toe, wordt er vertrokken van de lijst met alle mogelijke parameters (en hun usesettings). Deze waarden van de Cameleon videogenerator zijn hieronder terug te vinden.
Hoe het uiteindelijke resultaat er nu uitziet kan je bekijken in bijlage 3!
2.2.1
De parameters en hun usesettings
// Status controls channelRedID,
On/Off
channelGreenID,
On/Off
channelBlueID,
On/Off
// Analog sync syncOnRedID,
On/Off
syncOnGreenID,
On/Off
syncOnBlueID,
On/Off
// Digital sync syncGateHorizontalID,
On/Off
syncGateVerticalID,
On/Off
syncGateCompositeID,
On/Off
syncGateTrilevelID,
On/Off
// Digital polarity syncPolHorizontalID,
Positive/Negative
syncPolVerticalID,
Positive/Negative
syncPolCompositeID,
Positive/Negative
Wouter Weyne
65
// Gamma gammaGateID,
On/Off
gammaSwingID,
0.0 to 5.0
// PedestalGate pedestalGateID,
On/Off
pedestalSwingID,
0 to 1V
// Outputswing videoSwingID,
0 to 1V
syncSwingID,
0 to 0.3V
trilevelSwingTopID,
0 to 0.3V
trilevelSwingBottomID,
0 to 0.3V
// Tri level sync horizontalTriLevelSyncID,
x pixels
verticalTriLevelSyncID,
x lines
// Basics rate pixelRateID,
MHz
// derived pixelTimeID,
ns
// basics horizontalTotalID,
x pixels
horizontalSyncPulseWidthID,
x pixels
horizontalBackPorchID,
x pixels
horizontalResolutionID,
x pixels
horizontalFrontPorchID,
x pixels
Wouter Weyne
66
// derived horizontalRateID,
kHz
horizontalTotalTimeID,
us
horizontalSyncPulseWidthTimeID, us horizontalBackPorchTimeID,
us
horizontalResolutionTimeID,
us
horizontalFrontPorchTimeID,
us
horizontalActiveBeginID,
us
horizontalActiveEndID,
us
// basics verticalTotalID,
x lines
verticalSyncPulseWidthID,
x lines
verticalBackPorchID,
x lines
verticalResolutionID,
x lines
verticalFrontPorchID,
x lines
verticalScanID,
progressive/interlaced
// derived verticalRateID,
Hz
verticalTotalTimeID,
ms
verticalSyncPulseWidthTimeID,
ms
verticalBackPorchTimeID,
ms
verticalResolutionTimeID,
ms
verticalFrontPorchTimeID,
ms
verticalActiveBeginID,
ms
verticalActiveEndID
ms
Wouter Weyne
67
Besluit Ik ben zeer blij dat deze opdracht uiteindelijk tot een goed einde is gebracht. Het heeft heel wat moeite gekost.
De algemene conclusie van dit eindwerk is dat XML veel moeilijker te ontwikkelen is dan HTML, maar eens je door dat zware deel heen bent, is het een enorme verrijking t.o.v. HTML.
Dit moet ook één van de eerste keren zijn dat de ongebruikelijke combinatie van CGI shell scripts en XML gebruikt wordt. Het levert echter kleine en makkelijk te onderhouden sites op!
Ten slotte prijs ik me gelukkig dat ik dit project heb mogen volbrengen als eindwerk. Wat ik deze drie maand bijgeleerd heb, kon onmogelijk geleerd worden in alle jaren die ik al naar school ben gegaan.
Wouter Weyne
68
Bijlage 1 /* HTML Tag redefinition */ body{ background-color: #FFFFFF; color: #4F5557; font: normal normal normal 11px/normal Verdana,Arial,Helvetica,sansserif; margin: 1px; line-height:normal; }
Bijlage 2 #!/bin/sh # # Process input to a CGI script. Written and Copyright 1995 Frank Pilhofer # You may freely use and distribute this code free of charge provided that # this copyright notice remains. [email protected] # # All variables in here are prefixed by _F_, so you shouldn't have # any conflicts with your own var names # # get query string. if $REQUEST_METHOD is "POST", then it must be read # from stdin, else it's in $QUERY_STRING # if [ ${DEBUG:-0} -eq 1 ] ; then echo --Program Starts-- 1>&2 fi # if [ "$REQUEST_METHOD" = "POST" ] ; then _F_QUERY_STRING=`dd count=$CONTENT_LENGTH bs=1 2> /dev/null`"&" if [ "$QUERY_STRING" != "" ] ; then _F_QUERY_STRING="$_F_QUERY_STRING""$QUERY_STRING""&" fi if [ ${DEBUG:-0} -eq 1 ] ; then echo --Posted String-- 1>&2 fi else _F_QUERY_STRING="$QUERY_STRING""&" if [ ${DEBUG:-0} -eq 1 ] ; then echo --Query String-- 1>&2 fi fi if [ ${DEBUG:-0} -eq 1 ] ; then ( echo " " $_F_QUERY_STRING echo --Adding Arguments-- ) 1>&2 fi # # if there are arguments, use them as well. # for _F_PAR in $* ; do _F_QUERY_STRING="$_F_QUERY_STRING""$_F_PAR""&" if [ ${DEBUG:-0} -eq 1 ] ; then echo " " arg $_F_PAR 1>&2 fi done if [ ${DEBUG:-0} -eq 1 ] ; then ( echo --With Added Arguments-echo " " $_F_QUERY_STRING ) 1>&2 fi # # if $PATH_INFO is not empty and contains definitions '=', append it as well. # but replace slashes by ampersands # if echo $PATH_INFO | grep = > /dev/null ; then _F_PATH_INFO="$PATH_INFO""//" if [ ${DEBUG:-0} -eq 1 ] ; then ( echo --Adding Path Info-echo " " $_F_PATH_INFO ) 1>&2
Wouter Weyne
92
fi while [ "$_F_PATH_INFO" != "" -a "$_F_PATH_INFO" != "/" ] ; do _F_QUERY_STRING="$_F_QUERY_STRING""`echo $_F_PATH_INFO | cut -d / -f 1`""&" _F_PATH_INFO=`echo $_F_PATH_INFO | cut -s -d / -f 2-` done fi # # append another '&' to fool some braindead cut implementations. Test yours: # echo 'i am braindead!' | cut -d '!' -f 2 # _F_QUERY_STRING="$_F_QUERY_STRING""&" # if [ ${DEBUG:-0} -eq 1 ] ; then ( echo --Final Query String-echo " " $_F_QUERY_STRING ) 1>&2 fi # while [ "$_F_QUERY_STRING" != "" -a "$_F_QUERY_STRING" != "&" ] ; do _F_VARDEF=`echo $_F_QUERY_STRING | cut -d \& -f 1` # _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-` _F_VAR=`echo $_F_VARDEF | cut -d = -f 1` _F_VAL=`echo "$_F_VARDEF""=" | cut -d = -f 2` # # Workaround for more braindead cut implementations that strip delimiters # at the end of the line (i.e. HP-UX 10) # if echo $_F_QUERY_STRING | grep -c \& > /dev/null ; then _F_QUERY_STRING=`echo $_F_QUERY_STRING | cut -d \& -f 2-` else _F_QUERY_STRING="" fi if [ ${DEBUG:-0} -eq 1 ] ; then ( echo --Got Variable-echo " " var=$_F_VAR echo " " val=$_F_VAL echo " " rem=$_F_QUERY_STRING ) 1>&2 fi if [ "$_F_VAR" = "" ] ; then continue fi # # replace '+' by spaces # _F_VAL="$_F_VAL""++" _F_TMP= while [ "$_F_VAL" != "" -a "$_F_VAL" != "+" -a "$_F_VAL" != "++" ] ; do _F_TMP="$_F_TMP""`echo $_F_VAL | cut -d + -f 1`" _F_VAL=`echo $_F_VAL | cut -s -d + -f 2-` if [ "$_F_VAL" != "" -a "$_F_VAL" != "+" ] ; then _F_TMP="$_F_TMP"" "
Wouter Weyne
93
fi done if [ ${DEBUG:-0} -eq 1 ] ; then echo " " vrs=$_F_TMP 1>&2 fi # # replace '%XX' by ascii character. the hex sequence MUST BE uppercase # _F_TMP="$_F_TMP""%%" _F_VAL= while [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; do _F_VAL="$_F_VAL""`echo $_F_TMP | cut -d % -f 1`" _F_TMP=`echo $_F_TMP | cut -s -d % -f 2-` if [ "$_F_TMP" != "" -a "$_F_TMP" != "%" ] ; then if [ ${DEBUG:-0} -eq 1 ] ; then echo " " got hex "%" $_F_TMP 1>&2 fi _F_HEX=`echo $_F_TMP | cut -c 1-2 | tr "abcdef" "ABCDEF"` _F_TMP=`echo $_F_TMP | cut -c 3-` # # can't handle newlines anyway. replace by space # # if [ "$_F_HEX" = "0A" ] ; then # _F_HEX="20" # fi _F_VAL="$_F_VAL""`/bin/echo '\0'\`echo "16i8o"$_F_HEX"p" | dc\``" fi done # # replace forward quotes to backward quotes, since we have trouble handling # the former ones. # _F_VAL=`echo $_F_VAL | tr "'" '\`'` # # if debug, send variables to stderr # if [ ${DEBUG:-0} -eq 1 ] ; then ( echo --Final Assignment-echo "FORM_$_F_VAR"=\'$_F_VAL\' ) 1>&2 fi #