<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://mediawiki.a-eskwadraat.nl/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://mediawiki.a-eskwadraat.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Timb</id>
		<title>A-Eskwiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://mediawiki.a-eskwadraat.nl/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Timb"/>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Special:Contributions/Timb"/>
		<updated>2026-08-10T10:14:57Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.2</generator>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten</id>
		<title>Kaartjes bij activiteiten</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten"/>
				<updated>2022-03-24T11:02:05Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* = Scannen met de app */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== QR-codes scannen ==&lt;br /&gt;
&lt;br /&gt;
Om een QR-code van kaartjes bij een activiteit te scannen, moet eerst de kaartsoort op &amp;quot;CODE&amp;quot; staan.&lt;br /&gt;
Op de site worden van kaartjes ook aangegeven of ze al gescand zijn.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moet je naar de activiteit pagina gaan.&lt;br /&gt;
Hier is een knop te vinden met &amp;quot;Scanbare kaartjes activeren&amp;quot;. Klik dit.&lt;br /&gt;
&lt;br /&gt;
Dit bevat de &amp;quot;master qr-code&amp;quot;, die belangrijk is om qr-codes te gaan scannen. Print deze dus 2x uit voor een activiteit begint en neem deze mee want deze is nodig om die van andere te scannen! &lt;br /&gt;
&lt;br /&gt;
Vervolgens zijn er 2 manieren om kaartjes te scannen. Succes ermee! Vraag webcie dingen als iets in de fik vliegt.&lt;br /&gt;
&lt;br /&gt;
=== Scannen met de app ===&lt;br /&gt;
&lt;br /&gt;
Daarna, moet je de scan-app gebruiken. Dit is een speciale app, die [https://home.a-eskwadraat.nl/~floriann/kaartjesscanner.apk hier] te downloaden is.&lt;br /&gt;
Als je hem niet kan installeren, verwijder de &amp;quot;A-Appkwadraat&amp;quot;, deze gebruikt hetzelfde certificaat. Als het nog niet werkt, moet je toestaan apps te installeren uit onbetrouwbare bron (zoek op internet, iets met USB debugging?).&lt;br /&gt;
&lt;br /&gt;
In de app, ga je naar de activiteit en in het menu ga je naar &amp;quot;Scan tickets&amp;quot;. Hier kun je nu kaartjes scannen.&lt;br /&gt;
&lt;br /&gt;
=== Scannen met de speciale site ===&lt;br /&gt;
&lt;br /&gt;
Ga met je mobiele browser (bij voorkeur Android + Firefox of Google Chrome, werkte in elk geval in 2019 nog niet op iPhones...) naar https://qr-scan.a-eskwadraat.nl/.&lt;br /&gt;
Zorg ervoor dat je de juiste activiteit ziet, anders moet de WebCie dit (op &amp;lt;code&amp;gt;vm-www2:/qr-scan/index.html&amp;lt;/code&amp;gt;) fixen.&lt;br /&gt;
&lt;br /&gt;
Gebruik nu je camera om de codes te scannen. Je kan ook de code overtypen in het tekstveldje bovenin.&lt;br /&gt;
&lt;br /&gt;
== QRCode opnieuw mailen ==&lt;br /&gt;
&lt;br /&gt;
Om de zoveel tijd krijgt de WebCie een mailtje van iemand dat de iDEAL-betaling voor een activiteitkaartje geslaagd was maar dat ze de aparte mail met kaartje niet hebben ontvangen. We weten nog niet precies waarom dit komt, maar we vermoeden dat een spamfilter te agressief de kaartjesmails opeet (al is het voorgekomen dat redelijk capabele gebruikers ze niet in de spamfolder tegenkwamen, dus het mysterie gaat door...)&lt;br /&gt;
&lt;br /&gt;
Wat je dan kunt doen is checken of de IDEALTransactie inderdaad succesvol was, zo ja de code(s) opzoeken tussen de iDealKaartjeCode &amp;lt;!-- Is dit alleen mogelijk in de database? Zo ja, is dit meteen een feature request. --&amp;gt; en een mailtje sturen naar de arme kaartjesloze persoon. Probeer zoiets te schrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Beste [PERSOON],&lt;br /&gt;
&lt;br /&gt;
Ik zie inderdaad een transactie op [DATUM], maar&lt;br /&gt;
[ die lijkt succesvol verstuurd te zijn | de mail is naar een ander e-mailadres verstuurd | de mail is compleet foutgegaan ]&lt;br /&gt;
(heb je al tussen de spam gekeken?).&lt;br /&gt;
De kaartjes die bij deze transactie horen, heb ik als attachment toegevoegd.&lt;br /&gt;
De geheime codes, voor het geval de plaatjes niet werken, zijn [B4N44N] en [W4TL3UKS].&lt;br /&gt;
Laat het ons weten als je nog problemen hebt.&lt;br /&gt;
&lt;br /&gt;
Met vriendelijke groeten,&lt;br /&gt;
&lt;br /&gt;
[AFZENDER]&lt;br /&gt;
namens de WebCie&lt;br /&gt;
[ATTACHMENTS MET QR-CODE VOOR KAARTJES]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De qr-codes kun je genereren met het scriptje &amp;lt;code&amp;gt;scripts/create-qr-kaartje.php&amp;lt;/code&amp;gt;, die je op de &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; kunt draaien. Het neemt twee command-line argumenten: geheime code van een ontbrekend kaartje en activiteitnummer. Op stdout verschijnt een PNG-bestand met je kaartje. Voorbeeldaanroep:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/wwwdebug/scripts$ ./create-qr-kaartje.php B4N44N 1337 &amp;gt; ~/troep/qr-kaartje-1.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zie ook [https://www.a-eskwadraat.nl/Service/Bugweb/6956/ bug #6956]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten</id>
		<title>Kaartjes bij activiteiten</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten"/>
				<updated>2022-03-24T11:01:55Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== QR-codes scannen ==&lt;br /&gt;
&lt;br /&gt;
Om een QR-code van kaartjes bij een activiteit te scannen, moet eerst de kaartsoort op &amp;quot;CODE&amp;quot; staan.&lt;br /&gt;
Op de site worden van kaartjes ook aangegeven of ze al gescand zijn.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moet je naar de activiteit pagina gaan.&lt;br /&gt;
Hier is een knop te vinden met &amp;quot;Scanbare kaartjes activeren&amp;quot;. Klik dit.&lt;br /&gt;
&lt;br /&gt;
Dit bevat de &amp;quot;master qr-code&amp;quot;, die belangrijk is om qr-codes te gaan scannen. Print deze dus 2x uit voor een activiteit begint en neem deze mee want deze is nodig om die van andere te scannen! &lt;br /&gt;
&lt;br /&gt;
Vervolgens zijn er 2 manieren om kaartjes te scannen. Succes ermee! Vraag webcie dingen als iets in de fik vliegt.&lt;br /&gt;
&lt;br /&gt;
=== Scannen met de app==&lt;br /&gt;
&lt;br /&gt;
Daarna, moet je de scan-app gebruiken. Dit is een speciale app, die [https://home.a-eskwadraat.nl/~floriann/kaartjesscanner.apk hier] te downloaden is.&lt;br /&gt;
Als je hem niet kan installeren, verwijder de &amp;quot;A-Appkwadraat&amp;quot;, deze gebruikt hetzelfde certificaat. Als het nog niet werkt, moet je toestaan apps te installeren uit onbetrouwbare bron (zoek op internet, iets met USB debugging?).&lt;br /&gt;
&lt;br /&gt;
In de app, ga je naar de activiteit en in het menu ga je naar &amp;quot;Scan tickets&amp;quot;. Hier kun je nu kaartjes scannen.&lt;br /&gt;
&lt;br /&gt;
=== Scannen met de speciale site ===&lt;br /&gt;
&lt;br /&gt;
Ga met je mobiele browser (bij voorkeur Android + Firefox of Google Chrome, werkte in elk geval in 2019 nog niet op iPhones...) naar https://qr-scan.a-eskwadraat.nl/.&lt;br /&gt;
Zorg ervoor dat je de juiste activiteit ziet, anders moet de WebCie dit (op &amp;lt;code&amp;gt;vm-www2:/qr-scan/index.html&amp;lt;/code&amp;gt;) fixen.&lt;br /&gt;
&lt;br /&gt;
Gebruik nu je camera om de codes te scannen. Je kan ook de code overtypen in het tekstveldje bovenin.&lt;br /&gt;
&lt;br /&gt;
== QRCode opnieuw mailen ==&lt;br /&gt;
&lt;br /&gt;
Om de zoveel tijd krijgt de WebCie een mailtje van iemand dat de iDEAL-betaling voor een activiteitkaartje geslaagd was maar dat ze de aparte mail met kaartje niet hebben ontvangen. We weten nog niet precies waarom dit komt, maar we vermoeden dat een spamfilter te agressief de kaartjesmails opeet (al is het voorgekomen dat redelijk capabele gebruikers ze niet in de spamfolder tegenkwamen, dus het mysterie gaat door...)&lt;br /&gt;
&lt;br /&gt;
Wat je dan kunt doen is checken of de IDEALTransactie inderdaad succesvol was, zo ja de code(s) opzoeken tussen de iDealKaartjeCode &amp;lt;!-- Is dit alleen mogelijk in de database? Zo ja, is dit meteen een feature request. --&amp;gt; en een mailtje sturen naar de arme kaartjesloze persoon. Probeer zoiets te schrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Beste [PERSOON],&lt;br /&gt;
&lt;br /&gt;
Ik zie inderdaad een transactie op [DATUM], maar&lt;br /&gt;
[ die lijkt succesvol verstuurd te zijn | de mail is naar een ander e-mailadres verstuurd | de mail is compleet foutgegaan ]&lt;br /&gt;
(heb je al tussen de spam gekeken?).&lt;br /&gt;
De kaartjes die bij deze transactie horen, heb ik als attachment toegevoegd.&lt;br /&gt;
De geheime codes, voor het geval de plaatjes niet werken, zijn [B4N44N] en [W4TL3UKS].&lt;br /&gt;
Laat het ons weten als je nog problemen hebt.&lt;br /&gt;
&lt;br /&gt;
Met vriendelijke groeten,&lt;br /&gt;
&lt;br /&gt;
[AFZENDER]&lt;br /&gt;
namens de WebCie&lt;br /&gt;
[ATTACHMENTS MET QR-CODE VOOR KAARTJES]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De qr-codes kun je genereren met het scriptje &amp;lt;code&amp;gt;scripts/create-qr-kaartje.php&amp;lt;/code&amp;gt;, die je op de &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; kunt draaien. Het neemt twee command-line argumenten: geheime code van een ontbrekend kaartje en activiteitnummer. Op stdout verschijnt een PNG-bestand met je kaartje. Voorbeeldaanroep:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/wwwdebug/scripts$ ./create-qr-kaartje.php B4N44N 1337 &amp;gt; ~/troep/qr-kaartje-1.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zie ook [https://www.a-eskwadraat.nl/Service/Bugweb/6956/ bug #6956]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten</id>
		<title>Kaartjes bij activiteiten</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Kaartjes_bij_activiteiten"/>
				<updated>2022-03-24T10:47:05Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== QR-codes scannen ==&lt;br /&gt;
&lt;br /&gt;
Om een QR-code van kaartjes bij een activiteit te scannen, moet eerst de kaartsoort op &amp;quot;CODE&amp;quot; staan.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moet je naar de activiteit pagina gaan.&lt;br /&gt;
Hier is een knop te vinden met &amp;quot;Scanbare kaartjes activeren&amp;quot;. Klik dit.&lt;br /&gt;
&lt;br /&gt;
Dit bevat de &amp;quot;master qr-code&amp;quot;, die belangrijk is om qr-codes te gaan scannen. Print deze dus 2x uit voor een activiteit begint en neem deze mee want deze is nodig om die van andere te scannen!&lt;br /&gt;
&lt;br /&gt;
Daarna, moet je de scan-app gebruiken. Dit is een speciale app, die [https://home.a-eskwadraat.nl/~floriann/kaartjesscanner.apk hier] te downloaden is.&lt;br /&gt;
Als je hem niet kan installeren, verwijder de &amp;quot;A-Appkwadraat&amp;quot;, deze gebruikt hetzelfde certificaat. Als het nog niet werkt, moet je toestaan apps te installeren uit onbetrouwbare bron (zoek op internet, iets met USB debugging?).&lt;br /&gt;
&lt;br /&gt;
In de app, ga je naar de activiteit en in het menu ga je naar &amp;quot;Scan tickets&amp;quot;. Hier kun je nu kaartjes scannen.&lt;br /&gt;
&lt;br /&gt;
Op de site worden van kaartjes ook aangegeven of ze al gescand zijn.&lt;br /&gt;
Succes ermee!&lt;br /&gt;
&lt;br /&gt;
Vraag webcie dingen als iets in de fik vliegt.&lt;br /&gt;
&lt;br /&gt;
== QRCode opnieuw mailen ==&lt;br /&gt;
&lt;br /&gt;
Om de zoveel tijd krijgt de WebCie een mailtje van iemand dat de iDEAL-betaling voor een activiteitkaartje geslaagd was maar dat ze de aparte mail met kaartje niet hebben ontvangen. We weten nog niet precies waarom dit komt, maar we vermoeden dat een spamfilter te agressief de kaartjesmails opeet (al is het voorgekomen dat redelijk capabele gebruikers ze niet in de spamfolder tegenkwamen, dus het mysterie gaat door...)&lt;br /&gt;
&lt;br /&gt;
Wat je dan kunt doen is checken of de IDEALTransactie inderdaad succesvol was, zo ja de code(s) opzoeken tussen de iDealKaartjeCode &amp;lt;!-- Is dit alleen mogelijk in de database? Zo ja, is dit meteen een feature request. --&amp;gt; en een mailtje sturen naar de arme kaartjesloze persoon. Probeer zoiets te schrijven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Beste [PERSOON],&lt;br /&gt;
&lt;br /&gt;
Ik zie inderdaad een transactie op [DATUM], maar&lt;br /&gt;
[ die lijkt succesvol verstuurd te zijn | de mail is naar een ander e-mailadres verstuurd | de mail is compleet foutgegaan ]&lt;br /&gt;
(heb je al tussen de spam gekeken?).&lt;br /&gt;
De kaartjes die bij deze transactie horen, heb ik als attachment toegevoegd.&lt;br /&gt;
De geheime codes, voor het geval de plaatjes niet werken, zijn [B4N44N] en [W4TL3UKS].&lt;br /&gt;
Laat het ons weten als je nog problemen hebt.&lt;br /&gt;
&lt;br /&gt;
Met vriendelijke groeten,&lt;br /&gt;
&lt;br /&gt;
[AFZENDER]&lt;br /&gt;
namens de WebCie&lt;br /&gt;
[ATTACHMENTS MET QR-CODE VOOR KAARTJES]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De qr-codes kun je genereren met het scriptje &amp;lt;code&amp;gt;scripts/create-qr-kaartje.php&amp;lt;/code&amp;gt;, die je op de &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; kunt draaien. Het neemt twee command-line argumenten: geheime code van een ontbrekend kaartje en activiteitnummer. Op stdout verschijnt een PNG-bestand met je kaartje. Voorbeeldaanroep:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/wwwdebug/scripts$ ./create-qr-kaartje.php B4N44N 1337 &amp;gt; ~/troep/qr-kaartje-1.png&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zie ook [https://www.a-eskwadraat.nl/Service/Bugweb/6956/ bug #6956]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Pasfoto%27s_uploaden</id>
		<title>Pasfoto's uploaden</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Pasfoto%27s_uploaden"/>
				<updated>2019-11-12T20:55:31Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Het script &amp;lt;code&amp;gt;/scripts/pasfotos.php&amp;lt;/code&amp;gt; stelt je in staat een batch pasfoto's te uploaden, handig voor na de intro als er veel nieuwe leden bijkomen.&lt;br /&gt;
&lt;br /&gt;
== Voor het uploaden ==&lt;br /&gt;
&lt;br /&gt;
Vraag de fotografen of ze de koppeling foto -&amp;gt; lid kunnen doen door bestandnaam en studentnummer als kolommen in een CSV-bestandje kunnen opslaan. Het script ondersteunt ook lidnummer (maar veel eerstejaars kennen die nog niet) en doet een slag ernaar om volledige naam te ondersteunen (maar dit is niet in bijectief verband met leden).&lt;br /&gt;
&lt;br /&gt;
Vraag de fotografen om alle foto's ofwel in de map &amp;lt;code&amp;gt;/scratch/pasfotos&amp;lt;/code&amp;gt; op het systeem kunnen zetten (zie ook [[Scratch]]), ofwel op de een of andere manier als archief (zipje/USB-stick/...) aan de WebCie kunnen overhandigen.&lt;br /&gt;
&lt;br /&gt;
== Bij het uploaden ==&lt;br /&gt;
&lt;br /&gt;
Maak een csv-bestand met de eerste regel &amp;lt;code&amp;gt;fotonr,lidnr,studentnr&amp;lt;/code&amp;gt;. Let op: dit moet unix-line-endings hebben (gebruik in de shell &amp;lt;code&amp;gt;dos2unix&amp;lt;/code&amp;gt; om dit te fixen) en geen BOM hebben (gebruik in Vim &amp;lt;code&amp;gt;:set nobomb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;:w&amp;lt;/code&amp;gt; om dit te fixen).&lt;br /&gt;
De volgende regels hebben het fotonummer en studentnummer per foto (lidnummer kunnen we later toevoegen om ambiguïteit te fixen).&lt;br /&gt;
&lt;br /&gt;
Voorbeeld fotonummer: &amp;lt;code&amp;gt;IMG_1337.jpg&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;1337&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;1337.jpg&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;1337&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Maak nu de foto's beschikbaar voor het script. Het makkelijkst is om ze in &amp;lt;code&amp;gt;/scratch/pasfotos&amp;lt;/code&amp;gt; te zetten, deze is namelijk beschikbaar vanuit alle vm's. Je eigen homedir kan misschien ook werken. Ze moeten allemaal dezelfde prefix hebben voor de fotonummers, bijvoorbeeld &amp;lt;code&amp;gt;/scratch/pasfotos/IMG_&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We gaan eerst het script op de vm-www-debug uitvoeren. De foto's worden niet toegevoegd aan de DB, maar de inhoud wordt wel gecontroleerd.&lt;br /&gt;
Start het script met het CSV-bestand als eerste argument: &amp;lt;code&amp;gt;./pasfotos.php /scratch/pasfotos/koppeling.csv&amp;lt;/code&amp;gt; bijvoorbeeld. Het zal nu vragen om een paar gegevens. Vul deze in (zonder quootjes!) en druk op enter. Het script geeft een rijtje errors, fix deze. Is een studentnummer niet uniek? Vul dan het juiste lidnummer in in de desbetreffende kolom. Run het script opnieuw om de fixes te testen.&lt;br /&gt;
&lt;br /&gt;
Lukt alles? Draai het script dan op de vm-www op dezelfde manier. De foto's worden dan geüpload en je hebt waarschijnlijk een heleboel achievements omdat je allemaal foto's hebt geüpload.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]] [[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Pasfoto%27s_uploaden</id>
		<title>Pasfoto's uploaden</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Pasfoto%27s_uploaden"/>
				<updated>2019-11-12T20:24:56Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Created page with &amp;quot;Het script &amp;lt;code&amp;gt;/scripts/pasfotos.php&amp;lt;/code&amp;gt; stelt je in staat een batch pasfoto's te uploaden, handig voor na de intro als er veel nieuwe leden bijkomen.  == Voor het upload...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Het script &amp;lt;code&amp;gt;/scripts/pasfotos.php&amp;lt;/code&amp;gt; stelt je in staat een batch pasfoto's te uploaden, handig voor na de intro als er veel nieuwe leden bijkomen.&lt;br /&gt;
&lt;br /&gt;
== Voor het uploaden ==&lt;br /&gt;
&lt;br /&gt;
Vraag de fotografen of ze de koppeling foto -&amp;gt; lid kunnen doen door bestandnaam en studentnummer als kolommen in een CSV-bestandje kunnen opslaan. Het script ondersteunt ook lidnummer (maar veel eerstejaars kennen die nog niet) en doet een slag ernaar om volledige naam te ondersteunen (maar dit is niet in bijectief verband met leden).&lt;br /&gt;
&lt;br /&gt;
Vraag de fotografen om alle foto's ofwel in de map &amp;lt;code&amp;gt;/scratch/pasfotos&amp;lt;/code&amp;gt; op het systeem kunnen zetten (zie ook [[Scratch]]), ofwel op de een of andere manier als archief (zipje/USB-stick/...) aan de WebCie kunnen overhandigen.&lt;br /&gt;
&lt;br /&gt;
== Bij het uploaden ==&lt;br /&gt;
&lt;br /&gt;
Maak een csv-bestand met de eerste regel &amp;lt;code&amp;gt;fotonr,lidnr,studentnr&amp;lt;/code&amp;gt;. Let op: dit moet unix-line-endings hebben (gebruik in de shell &amp;lt;code&amp;gt;dos2unix&amp;lt;/code&amp;gt; om dit te fixen) en geen BOM hebben (gebruik in Vim &amp;lt;code&amp;gt;:set nobomb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;:w&amp;lt;/code&amp;gt; om dit te fixen).&lt;br /&gt;
De volgende regels hebben het fotonummer en studentnummer per foto (lidnummer kunnen we later toevoegen om ambiguïteit te fixen).&lt;br /&gt;
&lt;br /&gt;
Voorbeeld fotonummer: &amp;lt;code&amp;gt;IMG_1337.jpg&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;1337&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;1337.jpg&amp;lt;/code&amp;gt; -&amp;gt; &amp;lt;code&amp;gt;1337&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Maak nu de foto's beschikbaar voor het script. Het makkelijkst is om ze in &amp;lt;code&amp;gt;/scratch/pasfotos&amp;lt;/code&amp;gt; te zetten, deze is namelijk beschikbaar vanuit alle vm's. Je eigen homedir kan misschien ook werken. Ze moeten allemaal dezelfde prefix hebben voor de fotonummers, bijvoorbeeld &amp;lt;code&amp;gt;/scratch/pasfotos/IMG_&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
We gaan eerst het script op de vm-www-debug uitvoeren. De foto's worden niet toegevoegd aan de DB, maar de inhoud wordt wel gecontroleerd.&lt;br /&gt;
Start het script met het CSV-bestand als eerste argument: &amp;lt;code&amp;gt;./pasfotos.php /scratch/pasfotos/koppeling.csv&amp;lt;/code&amp;gt; bijvoorbeeld. Het zal nu vragen om een paar gegevens. Vul deze in (zonder quootjes!) en druk op enter. Het script geeft een rijtje errors, fix deze. Is een studentnummer niet uniek? Vul dan het juiste lidnummer in in de desbetreffende kolom. Run het script opnieuw om de fixes te testen.&lt;br /&gt;
&lt;br /&gt;
Lukt alles? Draai het script dan op de vm-www op dezelfde manier. De foto's worden dan geüpload en je hebt waarschijnlijk een heleboel achievements omdat je allemaal foto's hebt geüpload.&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Eten_bestellen</id>
		<title>Eten bestellen</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Eten_bestellen"/>
				<updated>2019-08-29T15:30:10Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Created page with &amp;quot;Een paar tips voor het bestellen van eten:  Bij Wok To Go is de canonieke keuze Teriyaki Chicken met noodles. Ga naar [https://woktogoutrecht.foodticket.nl de niet-Thuisbezorg...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Een paar tips voor het bestellen van eten:&lt;br /&gt;
&lt;br /&gt;
Bij Wok To Go is de canonieke keuze Teriyaki Chicken met noodles. Ga naar [https://woktogoutrecht.foodticket.nl de niet-Thuisbezorgdsite] en gebruik de code &amp;lt;code&amp;gt;woktogo2054&amp;lt;/code&amp;gt; voor gratis tsjak.&lt;br /&gt;
&lt;br /&gt;
Bij de Dönerbunker krijg je een gratis fles Poolse cola. Pas op bij de kapsalons: de pepers zijn verschrikkelijk heet, heter dan gewone Jalapeños.&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained</id>
		<title>Project Unchained</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained"/>
				<updated>2019-08-29T12:53:25Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Installatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchained.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We gebruiken Pipenv om de packages bij te houden: &amp;lt;code&amp;gt;pip3 install --user pipenv&amp;lt;/code&amp;gt;. Ga naar de juiste folder en run &amp;lt;code&amp;gt;pipenv sync&amp;lt;/code&amp;gt;. Om commando's te runnen, kun je &amp;lt;code&amp;gt;pipenv run&amp;lt;/code&amp;gt; voor elk commando stoppen, of één keer het commando &amp;lt;code&amp;gt;pipenv shell&amp;lt;/code&amp;gt; uitvoeren om Pipenv voor al je komende commando's te gebruiken.&lt;br /&gt;
&lt;br /&gt;
Volg de [https://www.djangoproject.com/start/ instructies van Django] om alles te installeren. Je kan de instructies van het aanmaken van een project overslaan. Doe je &amp;lt;code&amp;gt;./manage.py runserver&amp;lt;/code&amp;gt;, dan krijg je eerst een waarschuwing dat je migraties moet toepassen met &amp;lt;code&amp;gt;./manage.py migrate&amp;lt;/code&amp;gt; (doe dat dus!).&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained</id>
		<title>Project Unchained</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained"/>
				<updated>2019-08-29T12:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Installatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchained.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We gebruiken Pipenv om de packages bij te houden: &amp;lt;code&amp;gt;pip3 install --user pipenv&amp;lt;/code&amp;gt;. Ga naar de juiste folder en run &amp;lt;code&amp;gt;pipenv sync&amp;lt;/code&amp;gt;. Om commando's te runnen, kun je &amp;lt;code&amp;gt;pipenv run&amp;lt;/code&amp;gt; voor elk commando stoppen, of één keer het commando &amp;lt;code&amp;gt;pipenv shell&amp;lt;/code&amp;gt; uitvoeren om Pipenv voor al je komende commando's te gebruiken.&lt;br /&gt;
&lt;br /&gt;
Volg de [https://www.djangoproject.com/start/ instructies van Django] om alles te installeren. Je kan de instructies van het aanmaken van een project overslaan.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained</id>
		<title>Project Unchained</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained"/>
				<updated>2019-08-29T12:49:22Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchained.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We gebruiken Pipenv om de packages bij te houden: &amp;lt;code&amp;gt;pip3 install --user pipenv&amp;lt;/code&amp;gt;. Ga naar de juiste folder en run &amp;lt;code&amp;gt;pipenv sync&amp;lt;/code&amp;gt;. Om commando's te runnen, kun je &amp;lt;code&amp;gt;pipenv run&amp;lt;/code&amp;gt; voor elk commando stoppen, of één keer het commando &amp;lt;code&amp;gt;pipenv shell&amp;lt;/code&amp;gt; uitvoeren om Pipenv voor al je komende commando's te gebruiken.&lt;br /&gt;
&lt;br /&gt;
Volg de [https://www.djangoproject.com/start/ instructies van Django] om alles te installeren.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained</id>
		<title>Project Unchained</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained"/>
				<updated>2019-08-29T12:48:45Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchained.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We gebruiken Pipenv om de packages bij te houden: &amp;lt;code&amp;gt;pip3 install --user pipenv&amp;lt;/code&amp;gt;. Ga naar de juiste folder en run &amp;lt;code&amp;gt;pipenv install&amp;lt;/code&amp;gt;. Om commando's te runnen, kun je &amp;lt;code&amp;gt;pipenv run&amp;lt;/code&amp;gt; voor elk commando stoppen, of één keer het commando &amp;lt;code&amp;gt;pipenv shell&amp;lt;/code&amp;gt; uitvoeren om Pipenv voor al je komende commando's te gebruiken.&lt;br /&gt;
&lt;br /&gt;
Volg de [https://www.djangoproject.com/start/ instructies van Django] om alles te installeren.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained</id>
		<title>Project Unchained</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained"/>
				<updated>2019-08-29T12:46:52Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchained.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We gebruiken Pipenv om de packages bij te houden: &amp;lt;code&amp;gt;pip3 install --user pipenv&amp;lt;/code&amp;gt;. Om commando's te runnen, kun je &amp;lt;code&amp;gt;pipenv run&amp;lt;/code&amp;gt; voor elk commando stoppen, of één keer het commando &amp;lt;code&amp;gt;pipenv shell&amp;lt;/code&amp;gt; uitvoeren om Pipenv voor al je komende commando's te gebruiken.&lt;br /&gt;
&lt;br /&gt;
Volg de [https://www.djangoproject.com/start/ instructies van Django] om alles te installeren.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained</id>
		<title>Project Unchained</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Project_Unchained"/>
				<updated>2019-08-29T12:42:34Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Created page with &amp;quot;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.  == Installatie ==  Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchain...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Unchained''' is de nieuwe editie van de website. We maken gebruik van Django.&lt;br /&gt;
&lt;br /&gt;
== Installatie ==&lt;br /&gt;
&lt;br /&gt;
Clone de repository: &amp;lt;code&amp;gt;git clone git@gitlab.com:iba-aes/webcie/unchained.git&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volg de [https://www.djangoproject.com/start/ instructies van Django] om alles te installeren.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Wishlist</id>
		<title>Wishlist</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Wishlist"/>
				<updated>2019-08-03T20:05:42Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Timb */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hier kan je dingen neerzetten die je graag zou zien in, of doen met, de code of website. Dit kunnen dan een soort persoonlijke TODO's of ideëen zijn, of iets wat meer is van het niveau &amp;quot;herschrijf alles in Idris&amp;quot;, i.e. lulz.&lt;br /&gt;
&lt;br /&gt;
= [[User:Daanr|Daan]] =&lt;br /&gt;
&lt;br /&gt;
Ongeveer op lexicografische volgorde van 'realistisch, belangrijk' naar 'P = NP, niet zo belangrijk'.&lt;br /&gt;
&lt;br /&gt;
* Test meer dingen. (Wordt aan gewerkt.)&lt;br /&gt;
* Zorg dat de PromoCie weer toegang heeft tot de vertaalstrings op de een of andere manier&lt;br /&gt;
* Upgrade naar PHP 7.&lt;br /&gt;
* Upgrade naar PostgreSQL.&lt;br /&gt;
* Maak de dia2php netter, i.e. minder met teringlange strings met allemaal tabs erin. Iets met een expliciete AST en quasiquoting ofzo.&lt;br /&gt;
* Gebruik Dia niet meer als model-definitie format, want het is echt niet chill voor version control.&lt;br /&gt;
* Gooi FotoWeb weg ofzo.&lt;br /&gt;
* Maak Benamite/WhosWho4 chiller om te gebruiken. Vooral op het gebied van routing. Bijvoorbeeld dat je expliciet in een controllerfunctie kan zeggen wat voor parameters erin je parameters moeten. Zie: Flask.&lt;br /&gt;
* Test controllerfuncties á la QuickCheck. Dus dan moet je een manier vinden om URL parameters te... parameteriseren. En geen idee of een QuickCheck-achtige library voor PHP bestaat, en zo nee, hoe die eruit zou moeten zien.&lt;br /&gt;
* Meer DevOps dingen, makkelijker je eigen developer env en de production env draaien.&lt;br /&gt;
* Maak alles een tikje meer microservice-achtig, door ledenbeheer e.d. in een kern-API te stoppen, en dan 'apps' op basis van die (REST) API te implementeren. Gevolg hiervan is dat je dan ook andere talen dan PHP kan gebruiken, zonder dat je alles hoeft te herschrijven!&lt;br /&gt;
* Waarschijnlijk samen met bovenstaand item: doe leuke &amp;amp; fijne frontend dingen met Elm/PureScript/TypeScript/WebAssembly.&lt;br /&gt;
* C O N T A I N E R I Z A T I O N want dat is ''web scale''&lt;br /&gt;
* Herschrijf de website in de toffe Haskell-en-Python-hadden-een-baby taal die [[User:Timb|Tim]] ooit gaat maken.&lt;br /&gt;
* Bewijs dat P = NP.&lt;br /&gt;
* Verander PHP in een goede taal.&lt;br /&gt;
&lt;br /&gt;
= [[User:Timb|Timb]] =&lt;br /&gt;
&lt;br /&gt;
* Doe compositie ipv inheritance: in plaats van een Lid-object dat inherit van Persoon dat inherit van Contact, behouden we alleen de &amp;lt;code&amp;gt;Persoon&amp;lt;/code&amp;gt;, die $n$ &amp;lt;code&amp;gt;Lidmaatschap&amp;lt;/code&amp;gt;pen kan hebben, en hebben we (indien echt nodig!) koppeling van Persoon naar Adres en Organisatie naar Adres etc.&lt;br /&gt;
* Upgrade naar PostgreSQL.&lt;br /&gt;
* De meeste functies zijn zo goed als puur, en de functies die niet puur zijn komen niet in een View voor.&lt;br /&gt;
* 100 % code coverage.&lt;br /&gt;
* Decorator-achtige constructies voor requireAuth enzo.&lt;br /&gt;
* dia2php poept volautomatisch een hele CRUD-app uit.&lt;br /&gt;
* Herschrijf de website in Swail, de toffe Haskell-en-Python-hadden-een-baby programmeertaal die je helpt te zeggen wat je bedoelt (en die syntactische whitespace heeft!).&lt;br /&gt;
* Volledig automatisch je testomgeving maken.&lt;br /&gt;
* Een formeel bewijs dat de website featurecompleet is.&lt;br /&gt;
* Onze eis is niets meer, maar kan ook niets minder zijn, dan het Goede Leven voor elk persoon.&lt;br /&gt;
* Bewijs dat P =/= NP.&lt;br /&gt;
&lt;br /&gt;
= [[User:Ludop|Ludop]] =&lt;br /&gt;
&lt;br /&gt;
* Een huisje op de bahama's.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Jargon_WebCie</id>
		<title>Jargon WebCie</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Jargon_WebCie"/>
				<updated>2019-07-22T15:55:39Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* B */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
Omdat de WebCie al een paar tientallen jaren meedraait, is er een enorme hoeveelheid jargon ontstaan. Vaak is dit een woord wat vroeger zinnig was, maar nu alleen maar uit traditie nog gebruikt wordt. Tevens een mooie geschiedenispagina.&lt;br /&gt;
&lt;br /&gt;
== B ==&lt;br /&gt;
&lt;br /&gt;
* bookweb (het oude ~) /'bok.ʋeb/: Het boekverkoopsysteem van A–Eskwadraat, wat nog niet op basis van het WhosWho4-framework werkt.&lt;br /&gt;
* boekenweb (het nieuwe ~ 2.0) /'bu.kən.ʋɛb/: De opvolger van bookweb, die op basis van het WhosWho4-framework werkt. Is nog steeds niet af, omdat het een rotklus is en bovendien de code van al mijn voorgangers slecht is :P&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
&lt;br /&gt;
* ChopChop: Een wokrestaurant waar de WebCie rond 2012 veel eten bestelde. Codenaam voor WhosWho4.&lt;br /&gt;
* Colaproduct: De dingen die [[DiBS]] verkoopt, zoals fris en snoep.&lt;br /&gt;
&lt;br /&gt;
== D ==&lt;br /&gt;
&lt;br /&gt;
* debugrootdir: ook wel bekend als de &amp;lt;code&amp;gt;wwwdebug&amp;lt;/code&amp;gt;-map: de directory waar de hele checkout instaat, waaronder &amp;lt;code&amp;gt;docs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;gettext&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;www&amp;lt;/code&amp;gt;.&lt;br /&gt;
* DiBS: Het Digitaal BetaalSysteem van A–Eskwadraat, wat eerst door de DibsCie werd gebouwd en nu door de WebCie (interface en backend) en Sysop (hardware) wordt gerund.&lt;br /&gt;
* DiBSproduct: BoekWeb2-artikels waarmee je kudo's kan kopen. In de praktijk is er een uniek artikel: Kudo, die 1 kudo per eurocent geeft.&lt;br /&gt;
* DiLI: De Digitale LedenInschrijving van A–Eskwadraat, wat bijnaleden (die zich hebben aangemeld voor de intro) om hun lidgegevens vraagt, eventueel betalingen wil, en vervolgens tot ingeschreven promoveert (opdat de secretaris nog een check erop uitvoert). Zie ook: Introsmurf.&lt;br /&gt;
&lt;br /&gt;
== I ==&lt;br /&gt;
&lt;br /&gt;
* Introsmurf: Het websiteonderdeel dat gegevens van mentorgroepjes en introdeelnemers enzo bijhoudt. Heeft jaarlijks wat onderhoud nodig (zie de respectievelijke pagina's voor meer info).&lt;br /&gt;
&lt;br /&gt;
== L ==&lt;br /&gt;
&lt;br /&gt;
* layout, nieuwe: Bootstrap-gebaseerde layout voor WhosWho4 die de pastelkleurtjeslayout [https://www.a-eskwadraat.nl/Vereniging/Nieuws/854/ verving in 2014]. Gebruikt ook nog verschillende kleurtjes voor de verschillende site-onderdelen.&lt;br /&gt;
* layout, nieuwe nieuwe: Bootstrap-gebaseerde layout voor WhosWho4 die de nieuwe layout [https://www.a-eskwadraat.nl/Vereniging/Nieuws/932/ verving in 2017].&lt;br /&gt;
* layout, pastelkleurtjes-: Layout voor WhosWho4 die voor elk site-onderdeel een ander pastelkleurtje gebruikte.&lt;br /&gt;
&lt;br /&gt;
== S ==&lt;br /&gt;
&lt;br /&gt;
* space: De infrastructuur van de website. Vroeger had je verschillende siteonderdelen als WhosWho en Bookweb, en space diende om ze in een samenhangend geheel te duwen. Tegenwoordig bevat space vooral alle functionaliteit die voor websites in het algemeen nodig zijn, en is WhosWho4 het framework voor onze objecten en Model-View-Controllerstructuur.&lt;br /&gt;
* square: Een server met een database enzo (oftewel [[vm-www]] en [[vm-www-debug]], en misschien [[Inwerking|vm-www-inwerking]]). Was oorspronkelijk het equivalent van de [[vm-www]]. Krijg je bij scripts runnen een error die klaagt dat je niet op space zit, SSH dan eerst naar een vm-www-*.&lt;br /&gt;
&lt;br /&gt;
== V ==&lt;br /&gt;
&lt;br /&gt;
* variabele entry: [[Benamite]]-entry die werkt als een map, maar waarvan de naam varieert. Zorgt bijvoorbeeld dat &amp;lt;code&amp;gt;/Leden/8566&amp;lt;/code&amp;gt; wijst naar de ledenpagina van Joe'p.&lt;br /&gt;
&lt;br /&gt;
== W ==&lt;br /&gt;
&lt;br /&gt;
* WhosWho: Het ledenzoeksysteem van A–Eskwadraat. Is tegenwoordig, in de vorm van WhosWho4, een combinatie van ORM&amp;amp;MVC-framework en leden-commissie-activiteitenzoeksysteem.&lt;br /&gt;
* WhosWho4: Een combinatie van ORM&amp;amp;MVC-framework en leden-commissie-activiteitenzoeksysteem. [https://git.a-eskwadraat.nl/webcie/website/commit/a9f6b58734dcd89c816fd906ecab98f0215c85eb In 2012] gemaakt ter vervanging van WhosWho3.&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2019-07-22T15:45:19Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Stel logrotate in bij aanmaken nieuwe VM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''LET OP!''' Replicatie gaat niet helemaal goed samen met de [[Backup#Backup_van_binaire_logs|backup van de binaire logs]], zorg er eerst voor dat dat gefixt is, voordat je deze handleiding verder leest.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installeer WhosWhoPy ===&lt;br /&gt;
&lt;br /&gt;
Volg hiervoor de stappen in [[WhosWhoPy op een webcie-vm]].&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
Zorg er wel voor dat de &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt;-user toegang heeft tot de databases! Kopieer de &amp;lt;code&amp;gt;.my.cnf&amp;lt;/code&amp;gt; van de webcie-user naar de homedir van apache (&amp;lt;code&amp;gt;/usr/share/httpd/.my.cnf&amp;lt;/code&amp;gt;). (En check misschien ook dat daar een user en password ingesteld staan.)&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ipa-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor autologin:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install mod_auth_kerb mod_authnz_pam mod_lookup_ident sssd-dbus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor autologin op de site:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/www-auth.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stel de volgende gegevens in in &amp;lt;code&amp;gt;/etc/sssd/sssd.conf&amp;lt;/code&amp;gt; voor zover deze nog niet bestaat.&lt;br /&gt;
&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[domain/a-eskwadraat.nl]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;ldap_user_extra_attrs = mail,memberId,email:mail&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[sssd]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;services = nss, sudo, pam, ssh, ifp&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[ifp]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
allowed_uids = apache, root&lt;br /&gt;
user_attributes = +memberId&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ffmpeg git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
== Configuratie op lagere prioriteit ==&lt;br /&gt;
&lt;br /&gt;
Nadat alles werkt, moet je nog wat andere dingen configureren die het geheel draaiende houden.&lt;br /&gt;
&lt;br /&gt;
[[Logrotate]] zorgt ervoor dat je schijf niet overvol raakt met enorme logbestanden,&lt;br /&gt;
door oude logbestanden om de zoveel tijd weg te halen.&lt;br /&gt;
De site logt verscheidene dingen naar &amp;lt;code&amp;gt;/var/log/www/&amp;lt;/code&amp;gt;, dus we gaan de inhoud van die map roteren.&lt;br /&gt;
Zet in &amp;lt;code&amp;gt;/etc/logrotate.d/webcie&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/var/log/www/*log {&lt;br /&gt;
    rotate 4&lt;br /&gt;
    compress&lt;br /&gt;
    missingok&lt;br /&gt;
    notifempty&lt;br /&gt;
    sharedscripts&lt;br /&gt;
    delaycompress&lt;br /&gt;
    postrotate&lt;br /&gt;
        /bin/systemctl reload httpd.service &amp;gt; /dev/null 2&amp;gt;/dev/null || true&lt;br /&gt;
        /bin/kill -SIGUSR1 `cat /run/php-fpm/php-fpm.pid 2&amp;gt;/dev/null` 2&amp;gt;/dev/null || true&lt;br /&gt;
    endscript&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2019-05-01T21:44:53Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Webcie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== Webcie ==&lt;br /&gt;
&lt;br /&gt;
Ga naar de [[vm-www-debug]] en log in als user webcie:&lt;br /&gt;
 ssh vm-www-debug&lt;br /&gt;
 sudo -i -u webcie&lt;br /&gt;
&lt;br /&gt;
Toevoegen aan de htpasswd:&lt;br /&gt;
 htpasswd /srv/htpasswd $USER&lt;br /&gt;
Toevoegen aan de htgroups (let op dat alles na &amp;lt;code&amp;gt;www:&amp;lt;/code&amp;gt; op een regel hoort te komen!)&lt;br /&gt;
 vim /srv/config/vm-www-debug/httpd/conf.d/htgroups&lt;br /&gt;
 vim /srv/config/vm-www/httpd/conf.d/htgroups&lt;br /&gt;
Toevoegen aan de &amp;lt;code&amp;gt;wwwdebug.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
 cd /srv/http/www/git&lt;br /&gt;
 vim config.yaml&lt;br /&gt;
Op dit punt moet je even een WebCie'er laten weten dat je jezelf een debug aan het geven bent. Die zal jou vertellen wat er ingevuld moet worden om jouw eigen debugomgeving op te zetten.&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 ./scripts/debugconfig.py&lt;br /&gt;
 git add -p&lt;br /&gt;
 git commit&lt;br /&gt;
 git push&lt;br /&gt;
 sudo service httpd restart&lt;br /&gt;
Toevoegen aan de git repo&lt;br /&gt;
 Vraag aan een momenteel webcie lid om dit te doen&lt;br /&gt;
&lt;br /&gt;
== Nieuw lid ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je de code van de website binnenhalen en je eigen debugomgeving aanmaken. Dit doe je door de volgende commando's in een terminal te draaien:&lt;br /&gt;
&lt;br /&gt;
(Weet je niet hoe je een 'terminal' moet openen? Vraag een medewebcieër!)&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug2&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 git clone https://gitlab.com/iba-aes/webcie/website.git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=DEBUGNAAM-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug2/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
(Hier moet je &amp;lt;code&amp;gt;DEBUGNAAM&amp;lt;/code&amp;gt; vervangen met de naam van je debugomgeving, bijvoorbeeld 'pepernoot' of 'comint'.)&lt;br /&gt;
&lt;br /&gt;
Dit zorgt ervoor dat de code die in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt; staat wordt uitgevoerd wanneer je naar &amp;lt;code&amp;gt;DEBUGNAAM-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt; gaat in je browser.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases</id>
		<title>WebCie Databases</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases"/>
				<updated>2019-04-17T13:30:06Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Voorbeeld: een veld toevoegen aan een tabel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De WebCie runt een paar databases waarin alle websitedata (dus ook ledendata, en transactiedata) staat. Op de [[vm-www]], [[vm-www-debug]] en de [[vm-www-inwerking]] draaien allemaal een databaseserver en dezelfde databasestructuur (modulo updatevolgorde).&lt;br /&gt;
&lt;br /&gt;
== Gebruik in de code ==&lt;br /&gt;
&lt;br /&gt;
De beste manier om kwerries op de databaas te doen is met [[QueryBuilder]]. Dit is een manier om volautomatisch SQL te genereren vanuit object-georienteerde code, zonder dat je bang hoeft te zijn voor injectie enzo.&lt;br /&gt;
&lt;br /&gt;
De belangrijkste database is &amp;lt;code&amp;gt;whoswho4&amp;lt;/code&amp;gt;, waar alle [[WhosWho4]]-objecten in staan. Dan zijn er nog &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; voor [[Benamite]] en &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt; voor [[Bookweb]].&lt;br /&gt;
&lt;br /&gt;
=== Hoe een db-connectie opgezet wordt ===&lt;br /&gt;
&lt;br /&gt;
In principe zouden dingen als databaseconnectie enzo al geregeld moeten zijn als je controllerfunctie aangeroepen wordt, maak hier dus alleen zorgen over als je ergens in [[space]] bezig bent.&lt;br /&gt;
&lt;br /&gt;
Eerst wordt door [[space]] het bestand [[secret.php]] geladen, waarin gebruikersnaam en wachtwoord voor alle databaseusers staan. Op basis van de functie &amp;lt;code&amp;gt;getLevel&amp;lt;/code&amp;gt; worden drie globalen &amp;lt;code&amp;gt;$WSW4DB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$BWDB&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;$BMDB&amp;lt;/code&amp;gt; gemaakt door middel van [https://doxygen-www.a-eskwadraat.nl/classdbpdo.html dbpdo]. Hun memberfunctie &amp;lt;code&amp;gt;q(...)&amp;lt;/code&amp;gt; verstuurt een kwerrie naar de desbetreffende databaas.&lt;br /&gt;
&lt;br /&gt;
Dit zorgt er ook voor dat inloggen en uitloggen (en eigenlijk alles wat de auth van de gebruiker aanpast) een refresh vereist voordat alles goed weergegeven kan worden!&lt;br /&gt;
&lt;br /&gt;
== Debugdatabase ==&lt;br /&gt;
&lt;br /&gt;
Op de [[vm-www-debug]] wordt elke nacht een kopietje gemaakt van de livedatabases om op te kunnen debuggen. Deze db's heten &amp;lt;code&amp;gt;test_$BLA&amp;lt;/code&amp;gt; waar &amp;lt;code&amp;gt;$BLA&amp;lt;/code&amp;gt; staat voor de naam van de originele database.&lt;br /&gt;
&lt;br /&gt;
Om precies te zijn, elke dag wordt &amp;lt;code&amp;gt;scripts/cron/copy_db_to_test_db.sh boeken whoswho4&amp;lt;/code&amp;gt; aangeroepen op de live-server (zolang bookweb nog wordt gebruikt met &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt;).&lt;br /&gt;
Elke maandag ochtend wordt de tabel &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; gekopieerd naar de debug database.&lt;br /&gt;
Dit valt terug te vinden in de crontab onder &amp;lt;code&amp;gt;scripts/cron&amp;lt;/code&amp;gt;.&lt;br /&gt;
De aanroep is &amp;lt;code&amp;gt;ssh root@vm-www-debug -i ~/.ssh/debug test_$db&amp;lt;/code&amp;gt;. Zoals je misschien vermoedt, is er geen commando genaamd &amp;lt;code&amp;gt;test_$db&amp;lt;/code&amp;gt; op de vm-www-debug. In plaats daarvan staat in &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt; van root@vm-www-debug ingesteld dat bij ssh'en het commando &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; aangeroepen wordt in plaats van wat je van plan bent. Bij navraag bij degene die deze soepmes begaan heeft, antwoordde die: &amp;quot;zo is natoer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Nieuwe database aanmaken ==&lt;br /&gt;
&lt;br /&gt;
(De bedoeling is dat we het bij de huidige db's houden, maar misschien is er in de toekomst een goede reden!)&lt;br /&gt;
&lt;br /&gt;
Als je een nieuwe WebCie-database wilt aanmaken, moet je ook het [[Backup|backupscript]] aanpassen. Daarin staan namelijk alle databases die gebackupt worden. Vergeet ook niet verbindingen te openen met de nieuwe db in [[space]].&lt;br /&gt;
&lt;br /&gt;
== Databasestructuur aanpassen ==&lt;br /&gt;
&lt;br /&gt;
De databasestructuur wordt in de repository opgeslagen door middel van [http://alembic.zzzcomputing.com/en/latest/index.html Alembic]. Deze bewaart de geschiedenis in de vorm van een gerichte graaf van revisie, een soort git maar dan voor databasestructuur.&lt;br /&gt;
In tegenstelling tot git, begin je met de revisie een naam geven, en pas je daarna een bestand aan.&lt;br /&gt;
&lt;br /&gt;
=== Voorbeeld: een veld toevoegen aan een tabel ===&lt;br /&gt;
&lt;br /&gt;
Stel dat je in het Persoon-object een veld 'naamHuisdier' wilt toevoegen.&lt;br /&gt;
De makkelijkste manier is om [[Dia en generated code|de dia aan te passen]] en dan in je terminal uit te voeren: &amp;lt;code&amp;gt;manage revision 'veld naamHuisdier toevoegen in Persoon'&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dit zou volautomatisch een databaserevisie moeten maken en openen in je favoriete editor. ('''PRO-TIP''': opent niet je favoriete editor? Stel &amp;lt;code&amp;gt;$EDITOR&amp;lt;/code&amp;gt; in!)&lt;br /&gt;
Vervolgens kun je de migratie naar hartelust aanpassen.&lt;br /&gt;
&lt;br /&gt;
Ben je tevreden met de wijzigingen, dan sla je het bestand op,&lt;br /&gt;
en doe je op de command line &amp;lt;code&amp;gt;alembic upgrade head&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dit past je wijzigingen toe op de debugdatabase.&lt;br /&gt;
Nu kun je de nieuwe databasestructuur gaan testen.&lt;br /&gt;
'''LET OP''': als je je revisie aan wil passen, doe eerst &amp;lt;code&amp;gt;alembic downgrade -1&amp;lt;/code&amp;gt; om die ongedaan te maken.&lt;br /&gt;
&lt;br /&gt;
Na verloop van tijd is je feature hopelijk naar de livesite gemerged.&lt;br /&gt;
Het livezetten gaat hetzelfde: doe op de [[vm-www]] weer &amp;lt;code&amp;gt;alembic upgrade head&amp;lt;/code&amp;gt; (vergeet niet eerst &amp;lt;code&amp;gt;source venv/bin/activate&amp;lt;/code&amp;gt; te doen om de commando's beschikbaar te maken!)&lt;br /&gt;
en alle wijzigingen worden automatisch doorgevoerd.&lt;br /&gt;
Als je wijzigingen op de livesite doorgevoerd hebt, moet je de [[Databasestructuur committen]].&lt;br /&gt;
&lt;br /&gt;
==== Hetzelfde, maar dan handmatig ====&lt;br /&gt;
&lt;br /&gt;
In het handmatige geval doe je als eerste stap in de command line &amp;lt;code&amp;gt;alembic revision -m 'veld naamHuisdier toevoegen in Persoon'&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alembic maakt dan een bestand aan in &amp;lt;code&amp;gt;alembic/versions/&amp;lt;/code&amp;gt; met een of andere naam.&lt;br /&gt;
Open dat bestand in je favoriete teksteditor ('''PRO-TIP''': stel &amp;lt;code&amp;gt;$EDITOR&amp;lt;/code&amp;gt; in en doe &amp;lt;code&amp;gt;alembic edit head&amp;lt;/code&amp;gt;).&lt;br /&gt;
Nu kun je in het bestand operaties gaan toevoegen, zodat je bestand er ongeveer uitziet als:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ... metadata voor Alembic&lt;br /&gt;
&lt;br /&gt;
from alembic import op&lt;br /&gt;
import sqlalchemy as sa&lt;br /&gt;
&lt;br /&gt;
def upgrade():&lt;br /&gt;
    op.add_column('Persoon', sa.Column('naamHuisdier', sa.String))&lt;br /&gt;
&lt;br /&gt;
def downgrade():&lt;br /&gt;
    op.drop_column('Persoon', 'naamHuisdier')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Het is belangrijk om upgrade en downgrade elkaars inverses te maken (op de structuur, want data kun je misschien wel kwijtraken),&lt;br /&gt;
zodat het schakelen tussen branches goedgaat.&lt;br /&gt;
&lt;br /&gt;
Het verdere verloop is net als bij automatische migraties.&lt;br /&gt;
&lt;br /&gt;
== In de database graven ==&lt;br /&gt;
&lt;br /&gt;
Wil je iets in de database doen dat niet kan met de site? Dan kun je op [https://pgadmin-debug.a-eskwadraat.nl] (of als je echt PHPMyAdmin nodig hebt [https://admin-debug.a-eskwadraat.nl]) (debugdb) en [https://admin.a-eskwadraat.nl] (livedb) inloggen op localhost met gebruikersnaam root en het databasewachtwoord. Dit wachtwoord vind je in het bestand &amp;lt;code&amp;gt;.my.cnf&amp;lt;/code&amp;gt; in de homedir van gebruiker &amp;lt;code&amp;gt;webcie&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Migratie naar PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
MySQL is stiekem best wel slecht, dus we willen graag in plaats daarvan PostgreSQL gebruiken. De migratie gaat ongeveer als volgt.&lt;br /&gt;
&lt;br /&gt;
SSH naar de VM waar de oorspronkelijke database opstaat. Dan doe je ongeveer de volgende stappen (dit is voor de vm-www-debug).&lt;br /&gt;
Eerst installeren we Postgres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
rpm -Uvh pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
sudo yum update                                                                &lt;br /&gt;
sudo yum install postgresql96-server postgresql96-contrib                      &lt;br /&gt;
sudo service postgresql-9.6 initdb                                             &lt;br /&gt;
sudo service postgresql-9.6 start                                              &lt;br /&gt;
sudo chkconfig postgresql-9.6 on                                               &lt;br /&gt;
sudo -i                                                                        &lt;br /&gt;
su postgres                                                                    &lt;br /&gt;
psql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doe nu &amp;lt;code&amp;gt;CREATE USER&amp;lt;/code&amp;gt; voor alle users in je [[secret.php]].&lt;br /&gt;
&lt;br /&gt;
Dan zijn we klaar om de koppeling met PHP te maken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install php-pgsql                                                        &lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
                                                        &lt;br /&gt;
Pas &amp;lt;code&amp;gt;/var/lib/pgsql/9.6/data/pg_hba.conf&amp;lt;/code&amp;gt; aan zodat je auth method md5 gebruikt.&lt;br /&gt;
(De bestanden &amp;lt;code&amp;gt;/usr/pgsql/*&amp;lt;/code&amp;gt; slaan nergens op, negeer deze.)                                                &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service postgresql-9.6 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
                                             &lt;br /&gt;
Je zou nu moeten kunnen inloggen met &amp;lt;code&amp;gt;psql --user $BLA -d postgres&amp;lt;/code&amp;gt;              &lt;br /&gt;
en ook op adminer (maar let op dat je een database kiest die bestaat).             &lt;br /&gt;
&lt;br /&gt;
=== Data migreren ===                                                                                  &lt;br /&gt;
Ruim eerst je DB een beetje op!                                                   &lt;br /&gt;
(oftewel zorg dat je foreign keys kloppen, dat er geen datums zijn met jaar 0000, maand 00 of dag 00 enzo)&lt;br /&gt;
&lt;br /&gt;
Dit is een volledige migratie, inclusief dbstructuur. Gebruik andere opties voor &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; om alleen data te verhuizen.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mysqldump --compatible=postgresql --user=root --password --default-character-set=utf8 test_whoswho4 &amp;gt; export.sql&lt;br /&gt;
python2.7 docs/db_converter.py export.sql pg-export.sql                    &lt;br /&gt;
psql -d test_whoswho4 -U root -f pg-export.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PRO-TIP: pas de relaties eerst handmatig aan, want die zijn niet echt goed over te zetten.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moeten we handmatig alle tabellen die in MySQL een autoincrement hadden, maar waar die kolom niet &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; heet, in PostgreSQL een sequencenummer geven. Dat ziet er ongeveer zo uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE SEQUENCE IOUBon_bonID_seq;&lt;br /&gt;
SELECT setval('IOUBon_bonID_seq', max(&amp;quot;bonID&amp;quot;)) FROM &amp;quot;IOUBon&amp;quot;;&lt;br /&gt;
ALTER TABLE &amp;quot;IOUBon&amp;quot; ALTER COLUMN &amp;quot;bonID&amp;quot; SET DEFAULT nextval('IOUBon_bonID_seq');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Heb je dat allemaal gedaan, dan moet je ook voor alle databaseusers rechten geven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO god;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ingelogd;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO dibstablet;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO mollie;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO gast;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we ook nog de rechten overnemen. In MySQL doe je &amp;lt;code&amp;gt;SHOW GRANTS FOR '$USER'@'localhost'&amp;lt;/code&amp;gt; voor alle users in de db-wachtwoorden, pas de output hiervan aan tot PostgreSQL-syntax en voer die uit. (Dit is een hoop werk!)&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken</id>
		<title>Uitgebreid Zoeken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken"/>
				<updated>2019-03-20T20:22:01Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Itemsoorten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
In het nieuwe Uitgebreid Zoeken kunnen gebruikers hun eigen kwerries samenstellen door sleuren en pleuren. Dit wordt dan op de server omgezet tot een SQL-query, die op de database uitgevoerd wordt, en waarvoor vervolgens de juiste weergave gekozen wordt. De zoekkwerrie wordt overgestuurd als een JSON-object, als een soort fancy s-expressie.&lt;br /&gt;
&lt;br /&gt;
== Front-end: sleuren en pleuren ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de Javascriptlibrary [https://github.com/stevendwood/html5-dropzone HTML5 Dropzone], die een fijne wrapper geeft om de sleur-en-pleurfunctionaliteit in HTML5. Je hebt hier een niet al te antieke browser voor nodig dus.&lt;br /&gt;
Voor elk soort item die de gebruiker in de query kan doen, maken we een template aan (iets met class &amp;quot;zoek-item&amp;quot;), die de gebruiker kan kopiëren naar gaten (iets met class &amp;quot;zoek-gat&amp;quot;) in de query. Deze gaten worden dan gevuld met (maar niet vervangen door) kopietjes van dit item. In dit item mogen ook weer gaten voorkomen, bijvoorbeeld voor de &amp;quot;EN&amp;quot;- en &amp;quot;OF&amp;quot;-operatoren.&lt;br /&gt;
Omdat we gaten niet vervangen, hebben we ook replacement-functionaliteit: wil je een item vervangen met een ander item, dan pleur je het nieuwe item over het andere item heen. De eventhandlers van het gat zorgen ervoor dat de vervanging goedgaat.&lt;br /&gt;
De hele state van de query wordt in de structuur van de html-elementen opgeslagen, zodat er niets gedesynct wordt. Een nadeel is dat je niet al te veel fancy's kunt doen met de opmaak, want we gaan ervan uit dat de kwerrie eruit ziet als een &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-element met als (direct) kind precies 1 &amp;lt;code&amp;gt;.zoek-root&amp;lt;/code&amp;gt;-element, met als (direct) kind een aantal &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-elementen, etc. In feite is de hele structuur niets meer dan een s-expressie met pretentie.&lt;br /&gt;
&lt;br /&gt;
De notatie die we nu gaan aanhouden: als je een item hebt met een paar (oningevulde) gaten, schrijven we die op als &amp;lt;code&amp;gt;(zoektype ? ? ... ?)&amp;lt;/code&amp;gt;, en als er een paar gaten zijn ingevuld, wordt het bijvoorbeeld  &amp;lt;code&amp;gt;(en (of (vakid) ?) (niet (actief)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Op dit moment werkt het verplaatsen van al geplaatste items nog niet heel netjes: bij het pleuren wordt namelijk alleen een nieuw item gemaakt van de wortel van hetgeen wat je sleept. Een kopie van &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt; ziet er dus uit als &amp;lt;code&amp;gt;(en ? ?)&amp;lt;/code&amp;gt;, niet &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Om formvelden binnen items te ondersteunen (denk aan &amp;quot;lid sinds &amp;lt;datum&amp;gt;&amp;quot;), kunnen items ook een dict attrs van extra waarden, naast de invulling van gaten, meedragen. In de HTML worden deze weergegeven als attributen van de vorm &amp;lt;code&amp;gt;data-zoek-*&amp;lt;/code&amp;gt;, zodat &amp;lt;code&amp;gt;data-zoek-bla&amp;lt;/code&amp;gt; overeenkomt met een key &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; in de attrs. Je moet in Javascript ervoor zorgen dat deze bij elke update van het formveld dit in de attributen geupdate wordt.&lt;br /&gt;
&lt;br /&gt;
== Serialisatie ==&lt;br /&gt;
&lt;br /&gt;
Als de gebruiker vervolgens op de zoekknop drukt, wordt een geserialiseerde kwerrie opgestuurd. Op basis van de HTML wordt een JSON-object gemaakt dat de zoekkwerrie encodeert. Omdat de structuur om en om bestaat uit gat met misschien een item, en item met een lijst gaten, doen we ook twee serialisatiestappen in mutuele recursie. Een gat serialiseert tot ofwel de serialisatie van het item dat erinzit, ofwel &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. Een item serialiseert tot een JSON-object van de vorm &amp;lt;code&amp;gt;{'head': ... , 'tail': ... , 'attrs': ...}&amp;lt;/code&amp;gt;. De head is het zoektype van dit item (&amp;lt;code&amp;gt;'en'&amp;lt;/code&amp;gt; voor de logische conjunctieoperator, &amp;lt;code&amp;gt;'vakid'&amp;lt;/code&amp;gt;, etc.), de tail is een lijst van alle (geserialiseerde) gaten van dit item (inclusief &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; voor oningevulde!), en de attrs zijn een dict met strings, de extra attributen (zoals de waarden van inputs in dit zoekitem).&lt;br /&gt;
&lt;br /&gt;
Zo wordt bijvoorbeeld de s-expressie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;(of (vakid) (en (actiefCie) (niet (actiefAlles))))&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geserialiseerd naar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&amp;quot;head&amp;quot;:&amp;quot;of&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;vakid&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}},{&amp;quot;head&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;actiefCie&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}},{&amp;quot;head&amp;quot;:&amp;quot;niet&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;actiefAlles&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: voorbeeld met attributen&lt;br /&gt;
&lt;br /&gt;
== Itemsoorten ==&lt;br /&gt;
&lt;br /&gt;
De volgende itemsoorten worden ondersteund:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Zoektype !! Gaten !! Attributen !! Betekenis&lt;br /&gt;
|-&lt;br /&gt;
| en || 2 || {} || conjunctie: ('''en''' ''l'' ''r'') bestaat uit de doorsnede van iedereen in ''l'' en iedereen in ''r''&lt;br /&gt;
|-&lt;br /&gt;
| of || 2 || {} || disjunctie: ('''of''' ''l'' ''r'') bestaat uit de vereniging van iedereen in ''l'' met iedereen in ''r''&lt;br /&gt;
|-&lt;br /&gt;
| niet || 1 || {} || negatie: ('''niet''' ''q'') bestaat uit iedereen die niet in ''q'' zit&lt;br /&gt;
|-&lt;br /&gt;
| lidtoestand || 0 || {'lidtoestand': ...} || lidtoestand komt overeen met &amp;lt;code&amp;gt;attrs.lidtoestand&amp;lt;/code&amp;gt;: 'lid': &amp;quot;gewoon&amp;quot; huidig lid of BAL; 'oudlid': vroeger, maar niet meer, lid; 'bijnalid': heeft zich ingeschreven voor de intro maar is nog niet lid geworden; 'bal': Bijzonder Actief Lid (staat bij huidige leden, niet bij oudleden); 'erelid': erelid (staat niet bij huidige leden); 'verdienste': lid van verdienste (staat niet bij huidige leden).&lt;br /&gt;
|-&lt;br /&gt;
| studeert || 0 || {'studie': ...} || doet op dit moment de gegeven studie. &amp;lt;code&amp;gt;attrs.studie&amp;lt;/code&amp;gt; is het ID van een Studie-object in de database.&lt;br /&gt;
|-&lt;br /&gt;
| studeerde || 0 || {'studie': ...} || studeerde vroeger, niet meer, de gegeven studie. Zie '''studeert''' voor info over &amp;lt;code&amp;gt;attrs.studie&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| studieOnbekend || 0 || {} || geen studiegegevens bekend&lt;br /&gt;
|-&lt;br /&gt;
| vakidPost || 0 || {} || heeft aangegeven de Vakidioot per post te willen ontvangen&lt;br /&gt;
|-&lt;br /&gt;
| aesRoots || 0 || {} || heeft aangegeven de A–Eskwadraat√roots te willen ontvangen&lt;br /&gt;
|-&lt;br /&gt;
| actiefCie || 0 || {} || is actief in een commissie&lt;br /&gt;
|-&lt;br /&gt;
| actiefAlles || 0 || {} || is actief in een commissie, groep of dispuut&lt;br /&gt;
|-&lt;br /&gt;
| actiefRecent || 0 || {} || is, of was afgelopen jaar, actief in een commissie, groep of dispuut&lt;br /&gt;
|-&lt;br /&gt;
| deelnemer || 0 || {} || staat bij de deelnemers voor een activiteit afgelopen jaar&lt;br /&gt;
|-&lt;br /&gt;
| adresBekend || 0 || {} || adres bekend in de database&lt;br /&gt;
|-&lt;br /&gt;
| emailBekend || 0 || {} || email bekend in de database&lt;br /&gt;
|-&lt;br /&gt;
| donateur || 0 || {} || is op dit moment donateur&lt;br /&gt;
|-&lt;br /&gt;
| donateurGeweest || 0 || {} || was donateur maar nu niet meer&lt;br /&gt;
|-&lt;br /&gt;
| afgestudeerd || 0 || {'coljaar': ...} || afgestudeerd in &amp;lt;code&amp;gt;attrs.coljaar&amp;lt;/code&amp;gt;. Collegejaren worden gegeven als string van het jaar waarin ze beginnen, dus '2017' is 3 sept 2017 - 3 sept 2018.&lt;br /&gt;
|-&lt;br /&gt;
| almaOK || 0 || {} || willen opgenomen worden in de almanak&lt;br /&gt;
|-&lt;br /&gt;
| geluksvogel || 0 || {} || jonger dan 18 jaar&lt;br /&gt;
|-&lt;br /&gt;
| kart || 0 || {} || zit in de kart van de gebruiker&lt;br /&gt;
|-&lt;br /&gt;
| lidVan || 0 || {'coljaar': ...} || lid geworden in &amp;lt;code&amp;gt;attrs.coljaar&amp;lt;/code&amp;gt;. Collegejaren worden gegeven als string van het jaar waarin ze beginnen, dus '2017' is 3 sept 2017 - 3 sept 2018.&lt;br /&gt;
|-&lt;br /&gt;
| lidTot || 0 || {'coljaar': ...} || lid-af in &amp;lt;code&amp;gt;attrs.coljaar&amp;lt;/code&amp;gt;. Collegejaren worden gegeven als string van het jaar waarin ze beginnen, dus '2017' is 3 sept 2017 - 3 sept 2018.&lt;br /&gt;
|-&lt;br /&gt;
| voornaamwoord || 0 || {'voornaamwoordID': ...} || gebruikt persoonlijk voornaamwoord met ID &amp;lt;code&amp;gt;attrs.voornaamwoordID&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| bounces || 0 || {} || heeft bounces: e-mails die door de site zijn verstuurd maar niet zijn aangekomen&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy</id>
		<title>WhosWhoPy</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy"/>
				<updated>2019-03-13T21:40:52Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WhosWhoPy''' is bedoeld als equivalent van [[WhosWho4]], maar dan in Python. Het is oorspronkelijk gebouwd voor [[WebCie Databases|databasemigraties]].&lt;br /&gt;
&lt;br /&gt;
== Aan de slag met Python ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy vereist een redelijk recente editie van Python 3 en pip. Als je &amp;lt;code&amp;gt;[[manage]] build&amp;lt;/code&amp;gt; uitvoert, worden de rest van de benodigdheden geïnstalleerd in een [https://virtualenv.pypa.io/en/stable/ virtuele omgeving]. Het idee van deze virtuele omgeving is dat we hierin al onze dependencies installeren zonder dat dit systeembreed is of conflicten geeft met projecten met andere dependencies. Het volgende is dus '''belangrijk''': voordat je een python-commando uitvoert, run &amp;lt;code&amp;gt;source venv/bin/activate&amp;lt;/code&amp;gt; in de [[debugrootdir]]. (Alle pythoncommando's gaan ervan uit dat dit gebeurd is, en je in de debugrootdir zit.)&lt;br /&gt;
&lt;br /&gt;
Zie ook [[WhosWhoPy op een webcie-vm]].&lt;br /&gt;
&lt;br /&gt;
== Architectuur ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy heeft als kern een hoop modelklassen (de (klein)kindklassen van &amp;lt;code&amp;gt;Entiteit&amp;lt;/code&amp;gt;) die gegenereerd worden op basis van een klassediagram. Daarnaast hebben we wat hulpfuncties om de klassen op elkaar te laten werken, en een paar scripts die die hulpfuncties aanroepen. Specifiekere onderdelen worden hieronder toegelicht.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.app ===&lt;br /&gt;
&lt;br /&gt;
Zet de Flask-app op die de uiteindelijke pagina's produceert. Maakt gebruik van de andere modules om dit voor elkaar te krijgen.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.auth ===&lt;br /&gt;
&lt;br /&gt;
Authorisatie werkt op basis van de &amp;lt;code&amp;gt;Auth&amp;lt;/code&amp;gt;-klasse, die bijhoudt welke db-user wordt gebruikt voor de huidige request, en die bepaalt welke rechten (waarden in de enum &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt;) de huidige gebruiker heeft.&lt;br /&gt;
&lt;br /&gt;
Een waarde in &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt; staat voor een extra privilege bovenop wat een niet-ingelogde gast mag doen. Merk op dat we dus in de Auth-klasse bepalen welk recht bij welke soort user hoort, in tegenstelling tot de PHP-architectuur waar we voor het aanroepen van de Auth-klasse al bepalen of het gaat om tbc/vakidioot/spocie/etc.-rechten.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.config ===&lt;br /&gt;
&lt;br /&gt;
Module om configuratiewaarden uit te lezen. Bij het importeren van deze module worden de configuratiewaarden ingelezen. Er zijn generieke functies &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;geef_verplicht&amp;lt;/code&amp;gt; voor stringvormige configuratiewaarden, en waardespecifieke functies zoals &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; die waarden parsen en andere types geven (zoals hier een bool).&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.database ===&lt;br /&gt;
&lt;br /&gt;
Module om databaseverbinding te maken. Bij het importeren wordt deze verbinding gemaakt en in de variabele &amp;lt;code&amp;gt;wsw4db&amp;lt;/code&amp;gt; (van type [http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session sqlalchemy.Session]) gezet.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.gen ===&lt;br /&gt;
&lt;br /&gt;
Bevat de gegenereerde code van &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt;, zie verderop.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.php ===&lt;br /&gt;
&lt;br /&gt;
Verscheidene modules om integratie met PHP in het algemeen, en Space/WhosWho4 in het bijzonder, mogelijk te maken. Aan de basis ligt &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie&amp;lt;/code&amp;gt;, die een wrapper geeft om PHP-functies, zodat ze vanuit Python aangeroepen kunnen worden.&lt;br /&gt;
&lt;br /&gt;
== Hoe requests werken ==&lt;br /&gt;
&lt;br /&gt;
Als een request naar WhosWhoPy binnenkomt in Apache, gebeuren er een paar dingen.&lt;br /&gt;
&lt;br /&gt;
Ten eerste geeft Apache door middel van [http://flask.pocoo.org/docs/1.0/deploying/mod_wsgi/ mod_wsgi] de request door aan de Flask-applicatie. Flask zorgt voor routing, die je bijvoorbeeld ziet als &amp;lt;code&amp;gt;@app.route('/dingweb/een/of/ander/bestand')&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;whoswhopy.app&amp;lt;/code&amp;gt;. In het normale geval komt de route uit bij een Pythonfunctie die gewoon werkt als een normale Flask-endpoint. Misschien is er nog iets nodig als een databaseverbinding, wat we doen door middel van een decorator die de &amp;lt;code&amp;gt;WhosWhoPy&amp;lt;/code&amp;gt;-klasse ondersteunt.&lt;br /&gt;
&lt;br /&gt;
In een iets ingewikkelder geval, moeten we gebruik maken van oude PHP-code om de request af te handelen. Dit is qua programmeren niet veel anders dan een normale request, alleen wordt er een &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie.VreemdeFunctie&amp;lt;/code&amp;gt; aangeroepen, en daarvoor dus snel een PHP-proces opgestart om de functie af te handelen.&lt;br /&gt;
&lt;br /&gt;
Als we de hele endpoint nog in PHP hebben staan, wordt de &amp;lt;code&amp;gt;whoswhopy.php.entry.Entry&amp;lt;/code&amp;gt;-klasse gebruikt. Die zorgt ervoor dat PHP in CGI-modus wordt opgestart en een gegeven functie de request afhandelt. Het resultaat, de response, wordt dan letterlijk doorgegeven. In feite werkt Python dan als een soort webserver die een CGI-script aanroept.&lt;br /&gt;
&lt;br /&gt;
Als de endpoint niet in Python gedefinieerd is, gebruiken we de fallback: deze werkt net als de PHP-entry door middel van CGI maar gooit de hele request, inclusief URL, door Benamite. Vervolgens wordt weer de bijbehorende functie aangeroepen en de response doorgestuurd.&lt;br /&gt;
&lt;br /&gt;
== Codestijl ==&lt;br /&gt;
&lt;br /&gt;
We houden de canonieke stijl van [https://www.python.org/dev/peps/pep-0008/ PEP-8] aan, dus indentatie is 4 spaties en geen alignment alsjeblieft dankjewel.&lt;br /&gt;
&lt;br /&gt;
== Programmeertools ==&lt;br /&gt;
&lt;br /&gt;
Voor codekwaliteit hebben we ook wat tools:&lt;br /&gt;
&lt;br /&gt;
* [https://docs.pytest.org pytest] en [hypothesis https://virtualenv.pypa.io/en/stable/]: een fijn unittestframework en volautomatische testcasegeneratie. Je kan &amp;lt;code&amp;gt;pytest&amp;lt;/code&amp;gt; aanroepen in de debugrootdir om tests te runnen.&lt;br /&gt;
* [https://www.pylint.org/ pylint] om je te wijzen op code smells/lelijke codestijl (moet misschien nog een beetje getweakt worden).&lt;br /&gt;
&lt;br /&gt;
== Generated code ==&lt;br /&gt;
&lt;br /&gt;
Zie ook: [[Dia en generated code]].&lt;br /&gt;
&lt;br /&gt;
Het script &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt; zet een gegeven klassediagram, in de vorm van een &amp;lt;code&amp;gt;.dia&amp;lt;/code&amp;gt;-bestand, om in Pythonklassen. Je kan de resulterende klassen importeren als &amp;lt;code&amp;gt;from whoswhopy.gen.Bla import Bla&amp;lt;/code&amp;gt; (of &amp;lt;code&amp;gt;from whoswhopy.gen.Intro.Bla import Bla&amp;lt;/code&amp;gt; als de code in een package zit). Deze klassen zijn [http://docs.sqlalchemy.org/en/latest/orm/tutorial.html SQLAlchemy ORM]-gebaseerde klassen, en je kan ermee werken zoals je van SQLAlchemy gewend bent.&lt;br /&gt;
&lt;br /&gt;
Mocht je alle klassen willen gebruiken, dan kun je doen &amp;lt;code&amp;gt;import whoswhopy.gen.alles as alles&amp;lt;/code&amp;gt;. Deze functionaliteit is bijvoorbeeld nodig om alle klassen aan de migratiegenerator door te geven.&lt;br /&gt;
&lt;br /&gt;
== Reloaden na wijzigingen ==&lt;br /&gt;
&lt;br /&gt;
Apache herstart de daemon, en past dus eventuele wijzigingen toe, zodra je de modificatietijd van &amp;lt;code&amp;gt;whoswhopy.wsgi&amp;lt;/code&amp;gt; aanpast. Oftewel je kan je wijzigingen op je debug toepassen door te doen: &amp;lt;code&amp;gt;touch whoswhopy.wsgi&amp;lt;/code&amp;gt;. Zie ook https://modwsgi.readthedocs.io/en/develop/user-guides/reloading-source-code.html&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2019-03-08T12:03:13Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Cron instellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''LET OP!''' Replicatie gaat niet helemaal goed samen met de [[Backup#Backup_van_binaire_logs|backup van de binaire logs]], zorg er eerst voor dat dat gefixt is, voordat je deze handleiding verder leest.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installeer WhosWhoPy ===&lt;br /&gt;
&lt;br /&gt;
Volg hiervoor de stappen in [[WhosWhoPy op een webcie-vm]].&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
Zorg er wel voor dat de &amp;lt;code&amp;gt;apache&amp;lt;/code&amp;gt;-user toegang heeft tot de databases! Kopieer de &amp;lt;code&amp;gt;.my.cnf&amp;lt;/code&amp;gt; van de webcie-user naar de homedir van apache (&amp;lt;code&amp;gt;/usr/share/httpd/.my.cnf&amp;lt;/code&amp;gt;). (En check misschien ook dat daar een user en password ingesteld staan.)&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ipa-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor autologin:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install mod_auth_kerb mod_authnz_pam mod_lookup_ident sssd-dbus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor autologin op de site:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/www-auth.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stel de volgende gegevens in in &amp;lt;code&amp;gt;/etc/sssd/sssd.conf&amp;lt;/code&amp;gt; voor zover deze nog niet bestaat.&lt;br /&gt;
&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[domain/a-eskwadraat.nl]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;ldap_user_extra_attrs = mail,memberId,email:mail&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[sssd]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;services = nss, sudo, pam, ssh, ifp&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[ifp]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
allowed_uids = apache, root&lt;br /&gt;
user_attributes = +memberId&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ffmpeg git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm</id>
		<title>WhosWhoPy op een webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm"/>
				<updated>2019-03-06T16:13:27Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Troubleshooting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]] [[Category:HowTo]] [[Category:WhosWhoPy]]&lt;br /&gt;
&lt;br /&gt;
[[WhosWhoPy]] wordt op de WebCie-VM's gehost door middel van Apache en mod_wsgi.&lt;br /&gt;
&lt;br /&gt;
Om WhosWhoPy op een WebCie-VM te installeren, volg je de volgende stappen. We gaan er al vanuit dat je Apache en PHP hebt geïnstalleerd. (Zie ook [[Webcie VM]] voor instructies daarvoor.)&lt;br /&gt;
&lt;br /&gt;
== Installeer Python ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste hebben we een recente (minstens Python 3 uiteraard!) versie van Python nodig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install python36 python36-virtualenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installeer mod_wsgi ==&lt;br /&gt;
&lt;br /&gt;
mod_wsgi geeft de request uit Apache door naar Python. Je moet opletten dat je een recente mod_wsgi gebruikt, anders krijg je problemen met oude Pythonversies. In ons geval (de vm-www-debug) moeten we Pip gebruiken om een recente mod_wsgi te bekomen. Daarvoor installeren we eerst de Python-developmentheaders:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install python36u-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en dan mod_wsgi zelf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo pip3.6 install mod_wsgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel Apache in zodat die mod_wsgi laadt, door &amp;lt;code&amp;gt;/etc/httpd/conf/httpd.conf&amp;lt;/code&amp;gt; aan te passen en de mod_wsgi-module in te laden (check ook even of dit het juiste pad is ernaartoe):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache om instabiliteit te voorkomen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Maak een (lege) virtualenv aan ==&lt;br /&gt;
&lt;br /&gt;
Hoewel elke (debug)website hun eigen virtualenv heeft, kan &amp;lt;code&amp;gt;mod_wsgi&amp;lt;/code&amp;gt; dat eigenlijk niet aan. Dit fixen we door een lege virtualenv aan te maken voor de daemon, en vervolgens in het daadwerkelijke Pythonscript die te vervangen met de juiste virtualenv.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo python3 -m virtualenv /usr/local/venvs/empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stel in dat requests worden doorgegeven ==&lt;br /&gt;
&lt;br /&gt;
Pas de configuratie van Apache aan, en zet daar het equivalent van het volgende neer, afhankelijk van de hostnaam en installatielocatie enzo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WSGISocketPrefix /var/run/wsgi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;
    ServerName boom-debug.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
    WSGIDaemonProcess whoswhopy user=apache group=apache threads=5 python-home=/usr/local/venvs/empty&lt;br /&gt;
    WSGIScriptAlias / /mnt/wwwdebug2/lidanoniem/wwwdebug/whoswhopy.wsgi&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;Directory /mnt/wwwdebug2/lidanoniem/wwwdebug&amp;gt;&lt;br /&gt;
        WSGIProcessGroup whoswhopy&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache nogmaals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En nu zou het moeten werken :D&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
Krijg je een error 503 en zegt de log &amp;lt;code&amp;gt;Permission denied: mod_wsgi (pid=16690): Couldn't bind unix domain socket '/etc/httpd/logs/wsgi.16690.0.1.sock'.&amp;lt;/code&amp;gt;? Dan zou je ofwel de rechten van die directory moeten aanpassen, ofwel een andere directory kunnen gebruiken (pas dan &amp;lt;code&amp;gt;WSGISocketPrefix&amp;lt;/code&amp;gt; in de configuratie aan).&lt;br /&gt;
&lt;br /&gt;
Blijft het laden van de pagina steken en zegt de log &amp;lt;code&amp;gt;Fatal Python error: Py_Initialize: Unable to get the locale encoding ModuleNotFoundError: No module named 'encodings'&amp;lt;/code&amp;gt;? Zorg er dan voor dat je wel dezelfde Pythonversie in mod_wsgi en de virtualenv gebruikt.&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm</id>
		<title>WhosWhoPy op een webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm"/>
				<updated>2019-03-06T15:44:22Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Stel in dat requests worden doorgegeven */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]] [[Category:HowTo]] [[Category:WhosWhoPy]]&lt;br /&gt;
&lt;br /&gt;
[[WhosWhoPy]] wordt op de WebCie-VM's gehost door middel van Apache en mod_wsgi.&lt;br /&gt;
&lt;br /&gt;
Om WhosWhoPy op een WebCie-VM te installeren, volg je de volgende stappen. We gaan er al vanuit dat je Apache en PHP hebt geïnstalleerd. (Zie ook [[Webcie VM]] voor instructies daarvoor.)&lt;br /&gt;
&lt;br /&gt;
== Installeer Python ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste hebben we een recente (minstens Python 3 uiteraard!) versie van Python nodig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install python36 python36-virtualenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installeer mod_wsgi ==&lt;br /&gt;
&lt;br /&gt;
mod_wsgi geeft de request uit Apache door naar Python. Je moet opletten dat je een recente mod_wsgi gebruikt, anders krijg je problemen met oude Pythonversies. In ons geval (de vm-www-debug) moeten we Pip gebruiken om een recente mod_wsgi te bekomen. Daarvoor installeren we eerst de Python-developmentheaders:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install python36u-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en dan mod_wsgi zelf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo pip3.6 install mod_wsgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel Apache in zodat die mod_wsgi laadt, door &amp;lt;code&amp;gt;/etc/httpd/conf/httpd.conf&amp;lt;/code&amp;gt; aan te passen en de mod_wsgi-module in te laden (check ook even of dit het juiste pad is ernaartoe):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache om instabiliteit te voorkomen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Maak een (lege) virtualenv aan ==&lt;br /&gt;
&lt;br /&gt;
Hoewel elke (debug)website hun eigen virtualenv heeft, kan &amp;lt;code&amp;gt;mod_wsgi&amp;lt;/code&amp;gt; dat eigenlijk niet aan. Dit fixen we door een lege virtualenv aan te maken voor de daemon, en vervolgens in het daadwerkelijke Pythonscript die te vervangen met de juiste virtualenv.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo python3 -m virtualenv /usr/local/venvs/empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stel in dat requests worden doorgegeven ==&lt;br /&gt;
&lt;br /&gt;
Pas de configuratie van Apache aan, en zet daar het equivalent van het volgende neer, afhankelijk van de hostnaam en installatielocatie enzo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WSGISocketPrefix /var/run/wsgi&lt;br /&gt;
&lt;br /&gt;
&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;
    ServerName boom-debug.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
    WSGIDaemonProcess whoswhopy user=apache group=apache threads=5 python-home=/usr/local/venvs/empty&lt;br /&gt;
    WSGIScriptAlias / /mnt/wwwdebug2/lidanoniem/wwwdebug/whoswhopy.wsgi&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;Directory /mnt/wwwdebug2/lidanoniem/wwwdebug&amp;gt;&lt;br /&gt;
        WSGIProcessGroup whoswhopy&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache nogmaals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En nu zou het moeten werken :D&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
Krijg je een error 503 en zegt de log &amp;lt;code&amp;gt;Permission denied: mod_wsgi (pid=16690): Couldn't bind unix domain socket '/etc/httpd/logs/wsgi.16690.0.1.sock'.&amp;lt;/code&amp;gt;? Dan zou je ofwel de rechten van die directory moeten aanpassen, ofwel een andere directory kunnen gebruiken (pas dan &amp;lt;code&amp;gt;WSGISocketPrefix&amp;lt;/code&amp;gt; in de configuratie aan).&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm</id>
		<title>WhosWhoPy op een webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm"/>
				<updated>2019-03-06T15:43:46Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]] [[Category:HowTo]] [[Category:WhosWhoPy]]&lt;br /&gt;
&lt;br /&gt;
[[WhosWhoPy]] wordt op de WebCie-VM's gehost door middel van Apache en mod_wsgi.&lt;br /&gt;
&lt;br /&gt;
Om WhosWhoPy op een WebCie-VM te installeren, volg je de volgende stappen. We gaan er al vanuit dat je Apache en PHP hebt geïnstalleerd. (Zie ook [[Webcie VM]] voor instructies daarvoor.)&lt;br /&gt;
&lt;br /&gt;
== Installeer Python ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste hebben we een recente (minstens Python 3 uiteraard!) versie van Python nodig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install python36 python36-virtualenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installeer mod_wsgi ==&lt;br /&gt;
&lt;br /&gt;
mod_wsgi geeft de request uit Apache door naar Python. Je moet opletten dat je een recente mod_wsgi gebruikt, anders krijg je problemen met oude Pythonversies. In ons geval (de vm-www-debug) moeten we Pip gebruiken om een recente mod_wsgi te bekomen. Daarvoor installeren we eerst de Python-developmentheaders:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install python36u-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en dan mod_wsgi zelf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo pip3.6 install mod_wsgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel Apache in zodat die mod_wsgi laadt, door &amp;lt;code&amp;gt;/etc/httpd/conf/httpd.conf&amp;lt;/code&amp;gt; aan te passen en de mod_wsgi-module in te laden (check ook even of dit het juiste pad is ernaartoe):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache om instabiliteit te voorkomen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Maak een (lege) virtualenv aan ==&lt;br /&gt;
&lt;br /&gt;
Hoewel elke (debug)website hun eigen virtualenv heeft, kan &amp;lt;code&amp;gt;mod_wsgi&amp;lt;/code&amp;gt; dat eigenlijk niet aan. Dit fixen we door een lege virtualenv aan te maken voor de daemon, en vervolgens in het daadwerkelijke Pythonscript die te vervangen met de juiste virtualenv.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo python3 -m virtualenv /usr/local/venvs/empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stel in dat requests worden doorgegeven ==&lt;br /&gt;
&lt;br /&gt;
Pas de configuratie van Apache aan, en zet daar het equivalent van het volgende neer, afhankelijk van de hostnaam en installatielocatie enzo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;
    ServerName boom-debug.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
    WSGIDaemonProcess whoswhopy user=apache group=apache threads=5 python-home=/usr/local/venvs/empty&lt;br /&gt;
    WSGIScriptAlias / /mnt/wwwdebug2/lidanoniem/wwwdebug/whoswhopy.wsgi&lt;br /&gt;
    WSGISocketPrefix /var/run/wsgi&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /mnt/wwwdebug2/lidanoniem/wwwdebug&amp;gt;&lt;br /&gt;
        WSGIProcessGroup whoswhopy&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache nogmaals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En nu zou het moeten werken :D&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
Krijg je een error 503 en zegt de log &amp;lt;code&amp;gt;Permission denied: mod_wsgi (pid=16690): Couldn't bind unix domain socket '/etc/httpd/logs/wsgi.16690.0.1.sock'.&amp;lt;/code&amp;gt;? Dan zou je ofwel de rechten van die directory moeten aanpassen, ofwel een andere directory kunnen gebruiken (pas dan &amp;lt;code&amp;gt;WSGISocketPrefix&amp;lt;/code&amp;gt; in de configuratie aan).&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm</id>
		<title>WhosWhoPy op een webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm"/>
				<updated>2019-03-06T15:38:32Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Maak een (lege) virtualenv aan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]] [[Category:HowTo]] [[Category:WhosWhoPy]]&lt;br /&gt;
&lt;br /&gt;
[[WhosWhoPy]] wordt op de WebCie-VM's gehost door middel van Apache en mod_wsgi.&lt;br /&gt;
&lt;br /&gt;
Om WhosWhoPy op een WebCie-VM te installeren, volg je de volgende stappen. We gaan er al vanuit dat je Apache en PHP hebt geïnstalleerd. (Zie ook [[Webcie VM]] voor instructies daarvoor.)&lt;br /&gt;
&lt;br /&gt;
== Installeer Python ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste hebben we een recente (minstens Python 3 uiteraard!) versie van Python nodig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install python36 python36-virtualenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installeer mod_wsgi ==&lt;br /&gt;
&lt;br /&gt;
mod_wsgi geeft de request uit Apache door naar Python. Je moet opletten dat je een recente mod_wsgi gebruikt, anders krijg je problemen met oude Pythonversies. In ons geval (de vm-www-debug) moeten we Pip gebruiken om een recente mod_wsgi te bekomen. Daarvoor installeren we eerst de Python-developmentheaders:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install python36u-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en dan mod_wsgi zelf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo pip3.6 install mod_wsgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel Apache in zodat die mod_wsgi laadt, door &amp;lt;code&amp;gt;/etc/httpd/conf/httpd.conf&amp;lt;/code&amp;gt; aan te passen en de mod_wsgi-module in te laden (check ook even of dit het juiste pad is ernaartoe):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache om instabiliteit te voorkomen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Maak een (lege) virtualenv aan ==&lt;br /&gt;
&lt;br /&gt;
Hoewel elke (debug)website hun eigen virtualenv heeft, kan &amp;lt;code&amp;gt;mod_wsgi&amp;lt;/code&amp;gt; dat eigenlijk niet aan. Dit fixen we door een lege virtualenv aan te maken voor de daemon, en vervolgens in het daadwerkelijke Pythonscript die te vervangen met de juiste virtualenv.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo python3 -m virtualenv /usr/local/venvs/empty&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stel in dat requests worden doorgegeven ==&lt;br /&gt;
&lt;br /&gt;
Pas de configuratie van Apache aan, en zet daar het equivalent van het volgende neer, afhankelijk van de hostnaam en installatielocatie enzo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;
    ServerName boom-debug.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
    WSGIDaemonProcess whoswhopy user=apache group=apache threads=5 python-home=/usr/local/venvs/empty&lt;br /&gt;
    WSGIScriptAlias / /mnt/wwwdebug2/lidanoniem/wwwdebug/whoswhopy.wsgi&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /mnt/wwwdebug2/lidanoniem/wwwdebug&amp;gt;&lt;br /&gt;
        WSGIProcessGroup whoswhopy&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache nogmaals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En nu zou het moeten werken :D&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm</id>
		<title>WhosWhoPy op een webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy_op_een_webcie-vm"/>
				<updated>2019-03-06T15:38:18Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Created page with &amp;quot;Category:WebCie Category:HowTo Category:WhosWhoPy  WhosWhoPy wordt op de WebCie-VM's gehost door middel van Apache en mod_wsgi.  Om WhosWhoPy op een WebCie-VM...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]] [[Category:HowTo]] [[Category:WhosWhoPy]]&lt;br /&gt;
&lt;br /&gt;
[[WhosWhoPy]] wordt op de WebCie-VM's gehost door middel van Apache en mod_wsgi.&lt;br /&gt;
&lt;br /&gt;
Om WhosWhoPy op een WebCie-VM te installeren, volg je de volgende stappen. We gaan er al vanuit dat je Apache en PHP hebt geïnstalleerd. (Zie ook [[Webcie VM]] voor instructies daarvoor.)&lt;br /&gt;
&lt;br /&gt;
== Installeer Python ==&lt;br /&gt;
&lt;br /&gt;
Ten eerste hebben we een recente (minstens Python 3 uiteraard!) versie van Python nodig:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install python36 python36-virtualenv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installeer mod_wsgi ==&lt;br /&gt;
&lt;br /&gt;
mod_wsgi geeft de request uit Apache door naar Python. Je moet opletten dat je een recente mod_wsgi gebruikt, anders krijg je problemen met oude Pythonversies. In ons geval (de vm-www-debug) moeten we Pip gebruiken om een recente mod_wsgi te bekomen. Daarvoor installeren we eerst de Python-developmentheaders:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install python36u-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en dan mod_wsgi zelf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo pip3.6 install mod_wsgi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel Apache in zodat die mod_wsgi laadt, door &amp;lt;code&amp;gt;/etc/httpd/conf/httpd.conf&amp;lt;/code&amp;gt; aan te passen en de mod_wsgi-module in te laden (check ook even of dit het juiste pad is ernaartoe):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LoadModule wsgi_module /usr/lib64/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache om instabiliteit te voorkomen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Maak een (lege) virtualenv aan ==&lt;br /&gt;
&lt;br /&gt;
Hoewel elke (debug)website hun eigen virtualenv heeft, kan &amp;lt;code&amp;gt;mod_wsgi&amp;lt;/code&amp;gt; dat eigenlijk niet aan. Dit fixen we door een lege virtualenv aan te maken voor de daemon, en vervolgens in het daadwerkelijke Pythonscript die te vervangen met de juiste virtualenv.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo python3 -m virtualenv /usr/local/venvs/empty&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stel in dat requests worden doorgegeven ==&lt;br /&gt;
&lt;br /&gt;
Pas de configuratie van Apache aan, en zet daar het equivalent van het volgende neer, afhankelijk van de hostnaam en installatielocatie enzo:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;
    ServerName boom-debug.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
    WSGIDaemonProcess whoswhopy user=apache group=apache threads=5 python-home=/usr/local/venvs/empty&lt;br /&gt;
    WSGIScriptAlias / /mnt/wwwdebug2/lidanoniem/wwwdebug/whoswhopy.wsgi&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;Directory /mnt/wwwdebug2/lidanoniem/wwwdebug&amp;gt;&lt;br /&gt;
        WSGIProcessGroup whoswhopy&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
    &amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Herstart Apache nogmaals:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En nu zou het moeten werken :D&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2019-03-06T14:58:55Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Installeer WhosWhoPy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''LET OP!''' Replicatie gaat niet helemaal goed samen met de [[Backup#Backup_van_binaire_logs|backup van de binaire logs]], zorg er eerst voor dat dat gefixt is, voordat je deze handleiding verder leest.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installeer WhosWhoPy ===&lt;br /&gt;
&lt;br /&gt;
Volg hiervoor de stappen in [[WhosWhoPy op een webcie-vm]].&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ipa-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor autologin:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install mod_auth_kerb mod_authnz_pam mod_lookup_ident sssd-dbus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor autologin op de site:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/www-auth.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stel de volgende gegevens in in &amp;lt;code&amp;gt;/etc/sssd/sssd.conf&amp;lt;/code&amp;gt; voor zover deze nog niet bestaat.&lt;br /&gt;
&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[domain/a-eskwadraat.nl]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;ldap_user_extra_attrs = mail,memberId,email:mail&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[sssd]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;services = nss, sudo, pam, ssh, ifp&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[ifp]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
allowed_uids = apache, root&lt;br /&gt;
user_attributes = +memberId&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ffmpeg git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2019-03-06T14:58:46Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Installeer Apache, PHP en PHP-FPM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''LET OP!''' Replicatie gaat niet helemaal goed samen met de [[Backup#Backup_van_binaire_logs|backup van de binaire logs]], zorg er eerst voor dat dat gefixt is, voordat je deze handleiding verder leest.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installeer WhosWhoPy ==&lt;br /&gt;
&lt;br /&gt;
Volg hiervoor de stappen in [[WhosWhoPy op een webcie-vm]].&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ipa-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor autologin:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install mod_auth_kerb mod_authnz_pam mod_lookup_ident sssd-dbus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor autologin op de site:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/www-auth.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stel de volgende gegevens in in &amp;lt;code&amp;gt;/etc/sssd/sssd.conf&amp;lt;/code&amp;gt; voor zover deze nog niet bestaat.&lt;br /&gt;
&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[domain/a-eskwadraat.nl]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;ldap_user_extra_attrs = mail,memberId,email:mail&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[sssd]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;services = nss, sudo, pam, ssh, ifp&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[ifp]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
allowed_uids = apache, root&lt;br /&gt;
user_attributes = +memberId&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ffmpeg git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy</id>
		<title>WhosWhoPy</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy"/>
				<updated>2019-03-06T14:58:10Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Aan de slag met Python */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WhosWhoPy''' is bedoeld als equivalent van [[WhosWho4]], maar dan in Python. Het is oorspronkelijk gebouwd voor [[WebCie Databases|databasemigraties]].&lt;br /&gt;
&lt;br /&gt;
== Aan de slag met Python ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy vereist een redelijk recente editie van Python 3 en pip. Als je &amp;lt;code&amp;gt;[[manage]] build&amp;lt;/code&amp;gt; uitvoert, worden de rest van de benodigdheden geïnstalleerd in een [https://virtualenv.pypa.io/en/stable/ virtuele omgeving]. Het idee van deze virtuele omgeving is dat we hierin al onze dependencies installeren zonder dat dit systeembreed is of conflicten geeft met projecten met andere dependencies. Het volgende is dus '''belangrijk''': voordat je een python-commando uitvoert, run &amp;lt;code&amp;gt;source venv/bin/activate&amp;lt;/code&amp;gt; in de [[debugrootdir]]. (Alle pythoncommando's gaan ervan uit dat dit gebeurd is, en je in de debugrootdir zit.)&lt;br /&gt;
&lt;br /&gt;
Zie ook [[WhosWhoPy op een webcie-vm]].&lt;br /&gt;
&lt;br /&gt;
== Architectuur ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy heeft als kern een hoop modelklassen (de (klein)kindklassen van &amp;lt;code&amp;gt;Entiteit&amp;lt;/code&amp;gt;) die gegenereerd worden op basis van een klassediagram. Daarnaast hebben we wat hulpfuncties om de klassen op elkaar te laten werken, en een paar scripts die die hulpfuncties aanroepen. Specifiekere onderdelen worden hieronder toegelicht.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.app ===&lt;br /&gt;
&lt;br /&gt;
Zet de Flask-app op die de uiteindelijke pagina's produceert. Maakt gebruik van de andere modules om dit voor elkaar te krijgen.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.auth ===&lt;br /&gt;
&lt;br /&gt;
Authorisatie werkt op basis van de &amp;lt;code&amp;gt;Auth&amp;lt;/code&amp;gt;-klasse, die bijhoudt welke db-user wordt gebruikt voor de huidige request, en die bepaalt welke rechten (waarden in de enum &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt;) de huidige gebruiker heeft.&lt;br /&gt;
&lt;br /&gt;
Een waarde in &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt; staat voor een extra privilege bovenop wat een niet-ingelogde gast mag doen. Merk op dat we dus in de Auth-klasse bepalen welk recht bij welke soort user hoort, in tegenstelling tot de PHP-architectuur waar we voor het aanroepen van de Auth-klasse al bepalen of het gaat om tbc/vakidioot/spocie/etc.-rechten.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.config ===&lt;br /&gt;
&lt;br /&gt;
Module om configuratiewaarden uit te lezen. Bij het importeren van deze module worden de configuratiewaarden ingelezen. Er zijn generieke functies &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;geef_verplicht&amp;lt;/code&amp;gt; voor stringvormige configuratiewaarden, en waardespecifieke functies zoals &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; die waarden parsen en andere types geven (zoals hier een bool).&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.database ===&lt;br /&gt;
&lt;br /&gt;
Module om databaseverbinding te maken. Bij het importeren wordt deze verbinding gemaakt en in de variabele &amp;lt;code&amp;gt;wsw4db&amp;lt;/code&amp;gt; (van type [http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session sqlalchemy.Session]) gezet.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.gen ===&lt;br /&gt;
&lt;br /&gt;
Bevat de gegenereerde code van &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt;, zie verderop.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.php ===&lt;br /&gt;
&lt;br /&gt;
Verscheidene modules om integratie met PHP in het algemeen, en Space/WhosWho4 in het bijzonder, mogelijk te maken. Aan de basis ligt &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie&amp;lt;/code&amp;gt;, die een wrapper geeft om PHP-functies, zodat ze vanuit Python aangeroepen kunnen worden.&lt;br /&gt;
&lt;br /&gt;
== Hoe requests werken ==&lt;br /&gt;
&lt;br /&gt;
Als een request naar WhosWhoPy binnenkomt in Apache, gebeuren er een paar dingen.&lt;br /&gt;
&lt;br /&gt;
Ten eerste geeft Apache door middel van [http://flask.pocoo.org/docs/1.0/deploying/mod_wsgi/ mod_wsgi] de request door aan de Flask-applicatie. Flask zorgt voor routing, die je bijvoorbeeld ziet als &amp;lt;code&amp;gt;@app.route('/dingweb/een/of/ander/bestand')&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;whoswhopy.app&amp;lt;/code&amp;gt;. In het normale geval komt de route uit bij een Pythonfunctie die gewoon werkt als een normale Flask-endpoint. Misschien is er nog iets nodig als een databaseverbinding, wat we doen door middel van een decorator die de &amp;lt;code&amp;gt;WhosWhoPy&amp;lt;/code&amp;gt;-klasse ondersteunt.&lt;br /&gt;
&lt;br /&gt;
In een iets ingewikkelder geval, moeten we gebruik maken van oude PHP-code om de request af te handelen. Dit is qua programmeren niet veel anders dan een normale request, alleen wordt er een &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie.VreemdeFunctie&amp;lt;/code&amp;gt; aangeroepen, en daarvoor dus snel een PHP-proces opgestart om de functie af te handelen.&lt;br /&gt;
&lt;br /&gt;
Als we de hele endpoint nog in PHP hebben staan, wordt de &amp;lt;code&amp;gt;whoswhopy.php.entry.Entry&amp;lt;/code&amp;gt;-klasse gebruikt. Die zorgt ervoor dat PHP in CGI-modus wordt opgestart en een gegeven functie de request afhandelt. Het resultaat, de response, wordt dan letterlijk doorgegeven. In feite werkt Python dan als een soort webserver die een CGI-script aanroept.&lt;br /&gt;
&lt;br /&gt;
Als de endpoint niet in Python gedefinieerd is, gebruiken we de fallback: deze werkt net als de PHP-entry door middel van CGI maar gooit de hele request, inclusief URL, door Benamite. Vervolgens wordt weer de bijbehorende functie aangeroepen en de response doorgestuurd.&lt;br /&gt;
&lt;br /&gt;
== Codestijl ==&lt;br /&gt;
&lt;br /&gt;
We houden de canonieke stijl van [https://www.python.org/dev/peps/pep-0008/ PEP-8] aan, dus indentatie is 4 spaties en geen alignment alsjeblieft dankjewel.&lt;br /&gt;
&lt;br /&gt;
== Programmeertools ==&lt;br /&gt;
&lt;br /&gt;
Voor codekwaliteit hebben we ook wat tools:&lt;br /&gt;
&lt;br /&gt;
* [https://docs.pytest.org pytest] en [hypothesis https://virtualenv.pypa.io/en/stable/]: een fijn unittestframework en volautomatische testcasegeneratie. Je kan &amp;lt;code&amp;gt;pytest&amp;lt;/code&amp;gt; aanroepen in de debugrootdir om tests te runnen.&lt;br /&gt;
* [https://www.pylint.org/ pylint] om je te wijzen op code smells/lelijke codestijl (moet misschien nog een beetje getweakt worden).&lt;br /&gt;
&lt;br /&gt;
== Generated code ==&lt;br /&gt;
&lt;br /&gt;
Zie ook: [[Dia en generated code]].&lt;br /&gt;
&lt;br /&gt;
Het script &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt; zet een gegeven klassediagram, in de vorm van een &amp;lt;code&amp;gt;.dia&amp;lt;/code&amp;gt;-bestand, om in Pythonklassen. Je kan de resulterende klassen importeren als &amp;lt;code&amp;gt;from whoswhopy.gen.Bla import Bla&amp;lt;/code&amp;gt; (of &amp;lt;code&amp;gt;from whoswhopy.gen.Intro.Bla import Bla&amp;lt;/code&amp;gt; als de code in een package zit). Deze klassen zijn [http://docs.sqlalchemy.org/en/latest/orm/tutorial.html SQLAlchemy ORM]-gebaseerde klassen, en je kan ermee werken zoals je van SQLAlchemy gewend bent.&lt;br /&gt;
&lt;br /&gt;
Mocht je alle klassen willen gebruiken, dan kun je doen &amp;lt;code&amp;gt;import whoswhopy.gen.alles as alles&amp;lt;/code&amp;gt;. Deze functionaliteit is bijvoorbeeld nodig om alle klassen aan de migratiegenerator door te geven.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy</id>
		<title>WhosWhoPy</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy"/>
				<updated>2019-03-06T14:55:42Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Leg uit hoe requests werken&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WhosWhoPy''' is bedoeld als equivalent van [[WhosWho4]], maar dan in Python. Het is oorspronkelijk gebouwd voor [[WebCie Databases|databasemigraties]].&lt;br /&gt;
&lt;br /&gt;
== Aan de slag met Python ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy vereist een redelijk recente editie van Python 3 en pip. Als je &amp;lt;code&amp;gt;[[manage]] build&amp;lt;/code&amp;gt; uitvoert, worden de rest van de benodigdheden geïnstalleerd in een [https://virtualenv.pypa.io/en/stable/ virtuele omgeving]. Het idee van deze virtuele omgeving is dat we hierin al onze dependencies installeren zonder dat dit systeembreed is of conflicten geeft met projecten met andere dependencies. Het volgende is dus '''belangrijk''': voordat je een python-commando uitvoert, run &amp;lt;code&amp;gt;source venv/bin/activate&amp;lt;/code&amp;gt; in de [[debugrootdir]]. (Alle pythoncommando's gaan ervan uit dat dit gebeurd is, en je in de debugrootdir zit.)&lt;br /&gt;
&lt;br /&gt;
== Architectuur ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy heeft als kern een hoop modelklassen (de (klein)kindklassen van &amp;lt;code&amp;gt;Entiteit&amp;lt;/code&amp;gt;) die gegenereerd worden op basis van een klassediagram. Daarnaast hebben we wat hulpfuncties om de klassen op elkaar te laten werken, en een paar scripts die die hulpfuncties aanroepen. Specifiekere onderdelen worden hieronder toegelicht.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.app ===&lt;br /&gt;
&lt;br /&gt;
Zet de Flask-app op die de uiteindelijke pagina's produceert. Maakt gebruik van de andere modules om dit voor elkaar te krijgen.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.auth ===&lt;br /&gt;
&lt;br /&gt;
Authorisatie werkt op basis van de &amp;lt;code&amp;gt;Auth&amp;lt;/code&amp;gt;-klasse, die bijhoudt welke db-user wordt gebruikt voor de huidige request, en die bepaalt welke rechten (waarden in de enum &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt;) de huidige gebruiker heeft.&lt;br /&gt;
&lt;br /&gt;
Een waarde in &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt; staat voor een extra privilege bovenop wat een niet-ingelogde gast mag doen. Merk op dat we dus in de Auth-klasse bepalen welk recht bij welke soort user hoort, in tegenstelling tot de PHP-architectuur waar we voor het aanroepen van de Auth-klasse al bepalen of het gaat om tbc/vakidioot/spocie/etc.-rechten.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.config ===&lt;br /&gt;
&lt;br /&gt;
Module om configuratiewaarden uit te lezen. Bij het importeren van deze module worden de configuratiewaarden ingelezen. Er zijn generieke functies &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;geef_verplicht&amp;lt;/code&amp;gt; voor stringvormige configuratiewaarden, en waardespecifieke functies zoals &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; die waarden parsen en andere types geven (zoals hier een bool).&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.database ===&lt;br /&gt;
&lt;br /&gt;
Module om databaseverbinding te maken. Bij het importeren wordt deze verbinding gemaakt en in de variabele &amp;lt;code&amp;gt;wsw4db&amp;lt;/code&amp;gt; (van type [http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session sqlalchemy.Session]) gezet.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.gen ===&lt;br /&gt;
&lt;br /&gt;
Bevat de gegenereerde code van &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt;, zie verderop.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.php ===&lt;br /&gt;
&lt;br /&gt;
Verscheidene modules om integratie met PHP in het algemeen, en Space/WhosWho4 in het bijzonder, mogelijk te maken. Aan de basis ligt &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie&amp;lt;/code&amp;gt;, die een wrapper geeft om PHP-functies, zodat ze vanuit Python aangeroepen kunnen worden.&lt;br /&gt;
&lt;br /&gt;
== Hoe requests werken ==&lt;br /&gt;
&lt;br /&gt;
Als een request naar WhosWhoPy binnenkomt in Apache, gebeuren er een paar dingen.&lt;br /&gt;
&lt;br /&gt;
Ten eerste geeft Apache door middel van [http://flask.pocoo.org/docs/1.0/deploying/mod_wsgi/ mod_wsgi] de request door aan de Flask-applicatie. Flask zorgt voor routing, die je bijvoorbeeld ziet als &amp;lt;code&amp;gt;@app.route('/dingweb/een/of/ander/bestand')&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;whoswhopy.app&amp;lt;/code&amp;gt;. In het normale geval komt de route uit bij een Pythonfunctie die gewoon werkt als een normale Flask-endpoint. Misschien is er nog iets nodig als een databaseverbinding, wat we doen door middel van een decorator die de &amp;lt;code&amp;gt;WhosWhoPy&amp;lt;/code&amp;gt;-klasse ondersteunt.&lt;br /&gt;
&lt;br /&gt;
In een iets ingewikkelder geval, moeten we gebruik maken van oude PHP-code om de request af te handelen. Dit is qua programmeren niet veel anders dan een normale request, alleen wordt er een &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie.VreemdeFunctie&amp;lt;/code&amp;gt; aangeroepen, en daarvoor dus snel een PHP-proces opgestart om de functie af te handelen.&lt;br /&gt;
&lt;br /&gt;
Als we de hele endpoint nog in PHP hebben staan, wordt de &amp;lt;code&amp;gt;whoswhopy.php.entry.Entry&amp;lt;/code&amp;gt;-klasse gebruikt. Die zorgt ervoor dat PHP in CGI-modus wordt opgestart en een gegeven functie de request afhandelt. Het resultaat, de response, wordt dan letterlijk doorgegeven. In feite werkt Python dan als een soort webserver die een CGI-script aanroept.&lt;br /&gt;
&lt;br /&gt;
Als de endpoint niet in Python gedefinieerd is, gebruiken we de fallback: deze werkt net als de PHP-entry door middel van CGI maar gooit de hele request, inclusief URL, door Benamite. Vervolgens wordt weer de bijbehorende functie aangeroepen en de response doorgestuurd.&lt;br /&gt;
&lt;br /&gt;
== Codestijl ==&lt;br /&gt;
&lt;br /&gt;
We houden de canonieke stijl van [https://www.python.org/dev/peps/pep-0008/ PEP-8] aan, dus indentatie is 4 spaties en geen alignment alsjeblieft dankjewel.&lt;br /&gt;
&lt;br /&gt;
== Programmeertools ==&lt;br /&gt;
&lt;br /&gt;
Voor codekwaliteit hebben we ook wat tools:&lt;br /&gt;
&lt;br /&gt;
* [https://docs.pytest.org pytest] en [hypothesis https://virtualenv.pypa.io/en/stable/]: een fijn unittestframework en volautomatische testcasegeneratie. Je kan &amp;lt;code&amp;gt;pytest&amp;lt;/code&amp;gt; aanroepen in de debugrootdir om tests te runnen.&lt;br /&gt;
* [https://www.pylint.org/ pylint] om je te wijzen op code smells/lelijke codestijl (moet misschien nog een beetje getweakt worden).&lt;br /&gt;
&lt;br /&gt;
== Generated code ==&lt;br /&gt;
&lt;br /&gt;
Zie ook: [[Dia en generated code]].&lt;br /&gt;
&lt;br /&gt;
Het script &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt; zet een gegeven klassediagram, in de vorm van een &amp;lt;code&amp;gt;.dia&amp;lt;/code&amp;gt;-bestand, om in Pythonklassen. Je kan de resulterende klassen importeren als &amp;lt;code&amp;gt;from whoswhopy.gen.Bla import Bla&amp;lt;/code&amp;gt; (of &amp;lt;code&amp;gt;from whoswhopy.gen.Intro.Bla import Bla&amp;lt;/code&amp;gt; als de code in een package zit). Deze klassen zijn [http://docs.sqlalchemy.org/en/latest/orm/tutorial.html SQLAlchemy ORM]-gebaseerde klassen, en je kan ermee werken zoals je van SQLAlchemy gewend bent.&lt;br /&gt;
&lt;br /&gt;
Mocht je alle klassen willen gebruiken, dan kun je doen &amp;lt;code&amp;gt;import whoswhopy.gen.alles as alles&amp;lt;/code&amp;gt;. Deze functionaliteit is bijvoorbeeld nodig om alle klassen aan de migratiegenerator door te geven.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy</id>
		<title>WhosWhoPy</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WhosWhoPy"/>
				<updated>2019-03-06T14:44:37Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Licht overige WhosWhoPy-onderdelen toe&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''WhosWhoPy''' is bedoeld als equivalent van [[WhosWho4]], maar dan in Python. Het is oorspronkelijk gebouwd voor [[WebCie Databases|databasemigraties]].&lt;br /&gt;
&lt;br /&gt;
== Aan de slag met Python ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy vereist een redelijk recente editie van Python 3 en pip. Als je &amp;lt;code&amp;gt;[[manage]] build&amp;lt;/code&amp;gt; uitvoert, worden de rest van de benodigdheden geïnstalleerd in een [https://virtualenv.pypa.io/en/stable/ virtuele omgeving]. Het idee van deze virtuele omgeving is dat we hierin al onze dependencies installeren zonder dat dit systeembreed is of conflicten geeft met projecten met andere dependencies. Het volgende is dus '''belangrijk''': voordat je een python-commando uitvoert, run &amp;lt;code&amp;gt;source venv/bin/activate&amp;lt;/code&amp;gt; in de [[debugrootdir]]. (Alle pythoncommando's gaan ervan uit dat dit gebeurd is, en je in de debugrootdir zit.)&lt;br /&gt;
&lt;br /&gt;
== Architectuur ==&lt;br /&gt;
&lt;br /&gt;
WhosWhoPy heeft als kern een hoop modelklassen (de (klein)kindklassen van &amp;lt;code&amp;gt;Entiteit&amp;lt;/code&amp;gt;) die gegenereerd worden op basis van een klassediagram. Daarnaast hebben we wat hulpfuncties om de klassen op elkaar te laten werken, en een paar scripts die die hulpfuncties aanroepen. Specifiekere onderdelen worden hieronder toegelicht.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.app ===&lt;br /&gt;
&lt;br /&gt;
Zet de Flask-app op die de uiteindelijke pagina's produceert. Maakt gebruik van de andere modules om dit voor elkaar te krijgen.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.auth ===&lt;br /&gt;
&lt;br /&gt;
Authorisatie werkt op basis van de &amp;lt;code&amp;gt;Auth&amp;lt;/code&amp;gt;-klasse, die bijhoudt welke db-user wordt gebruikt voor de huidige request, en die bepaalt welke rechten (waarden in de enum &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt;) de huidige gebruiker heeft.&lt;br /&gt;
&lt;br /&gt;
Een waarde in &amp;lt;code&amp;gt;AuthRecht&amp;lt;/code&amp;gt; staat voor een extra privilege bovenop wat een niet-ingelogde gast mag doen. Merk op dat we dus in de Auth-klasse bepalen welk recht bij welke soort user hoort, in tegenstelling tot de PHP-architectuur waar we voor het aanroepen van de Auth-klasse al bepalen of het gaat om tbc/vakidioot/spocie/etc.-rechten.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.config ===&lt;br /&gt;
&lt;br /&gt;
Module om configuratiewaarden uit te lezen. Bij het importeren van deze module worden de configuratiewaarden ingelezen. Er zijn generieke functies &amp;lt;code&amp;gt;geef&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;geef_verplicht&amp;lt;/code&amp;gt; voor stringvormige configuratiewaarden, en waardespecifieke functies zoals &amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; die waarden parsen en andere types geven (zoals hier een bool).&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.database ===&lt;br /&gt;
&lt;br /&gt;
Module om databaseverbinding te maken. Bij het importeren wordt deze verbinding gemaakt en in de variabele &amp;lt;code&amp;gt;wsw4db&amp;lt;/code&amp;gt; (van type [http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.Session sqlalchemy.Session]) gezet.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.gen ===&lt;br /&gt;
&lt;br /&gt;
Bevat de gegenereerde code van &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt;, zie verderop.&lt;br /&gt;
&lt;br /&gt;
=== whoswhopy.php ===&lt;br /&gt;
&lt;br /&gt;
Verscheidene modules om integratie met PHP in het algemeen, en Space/WhosWho4 in het bijzonder, mogelijk te maken. Aan de basis ligt &amp;lt;code&amp;gt;whoswhopy.php.vreemde_functie&amp;lt;/code&amp;gt;, die een wrapper geeft om PHP-functies, zodat ze vanuit Python aangeroepen kunnen worden.&lt;br /&gt;
&lt;br /&gt;
== Codestijl ==&lt;br /&gt;
&lt;br /&gt;
We houden de canonieke stijl van [https://www.python.org/dev/peps/pep-0008/ PEP-8] aan, dus indentatie is 4 spaties en geen alignment alsjeblieft dankjewel.&lt;br /&gt;
&lt;br /&gt;
== Programmeertools ==&lt;br /&gt;
&lt;br /&gt;
Voor codekwaliteit hebben we ook wat tools:&lt;br /&gt;
&lt;br /&gt;
* [https://docs.pytest.org pytest] en [hypothesis https://virtualenv.pypa.io/en/stable/]: een fijn unittestframework en volautomatische testcasegeneratie. Je kan &amp;lt;code&amp;gt;pytest&amp;lt;/code&amp;gt; aanroepen in de debugrootdir om tests te runnen.&lt;br /&gt;
* [https://www.pylint.org/ pylint] om je te wijzen op code smells/lelijke codestijl (moet misschien nog een beetje getweakt worden).&lt;br /&gt;
&lt;br /&gt;
== Generated code ==&lt;br /&gt;
&lt;br /&gt;
Zie ook: [[Dia en generated code]].&lt;br /&gt;
&lt;br /&gt;
Het script &amp;lt;code&amp;gt;dia2py&amp;lt;/code&amp;gt; zet een gegeven klassediagram, in de vorm van een &amp;lt;code&amp;gt;.dia&amp;lt;/code&amp;gt;-bestand, om in Pythonklassen. Je kan de resulterende klassen importeren als &amp;lt;code&amp;gt;from whoswhopy.gen.Bla import Bla&amp;lt;/code&amp;gt; (of &amp;lt;code&amp;gt;from whoswhopy.gen.Intro.Bla import Bla&amp;lt;/code&amp;gt; als de code in een package zit). Deze klassen zijn [http://docs.sqlalchemy.org/en/latest/orm/tutorial.html SQLAlchemy ORM]-gebaseerde klassen, en je kan ermee werken zoals je van SQLAlchemy gewend bent.&lt;br /&gt;
&lt;br /&gt;
Mocht je alle klassen willen gebruiken, dan kun je doen &amp;lt;code&amp;gt;import whoswhopy.gen.alles as alles&amp;lt;/code&amp;gt;. Deze functionaliteit is bijvoorbeeld nodig om alle klassen aan de migratiegenerator door te geven.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel</id>
		<title>Bestuurswissel</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bestuurswissel"/>
				<updated>2019-02-27T21:58:49Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Backside */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
Dit is het stappenplan wat elk jaar bij een bestuurswissel uitgevoerd moet worden. Dit is zo snel mogelijk na de Wissel-AV die in het begin van een nieuw collegejaar plaatsvindt.&lt;br /&gt;
&lt;br /&gt;
Er moeten zowel dingen op de site gedaan worden als in de code.&lt;br /&gt;
Natuurlijk moet de sysop ook dingen op het systeem regelen maar dat is hun probleem.&lt;br /&gt;
&lt;br /&gt;
=== Website frontside ===&lt;br /&gt;
&lt;br /&gt;
# Maak een nieuwe commissie aan met login &amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Voeg alle mensen die daar in horen toe aan deze commissie.&lt;br /&gt;
# Maak een publisher pagina aan voor het huidige bestuur (&amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Update de redirects in benamite (&amp;lt;code&amp;gt;/Vereniging/Bestuur&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/Vereniging/Commissies/Bestuur&amp;lt;/code&amp;gt;)&lt;br /&gt;
# Dubbelcheck even of alles nog werkt.&lt;br /&gt;
&lt;br /&gt;
===Backside===&lt;br /&gt;
# Check of onderstaande dingen al meteen moeten worden aangepast, het kan best zijn dat een (oud)bestuurslid nog tijdelijk bestuursrechten nodig heeft voor de laatste inwerking of afronding van werkzaamheden.&lt;br /&gt;
# Ga naar het BESTUUR DATA deel in &amp;lt;code&amp;gt;space/specialconstants.php&amp;lt;/code&amp;gt; en verander alle data hier:&lt;br /&gt;
#:* Vul bij &amp;lt;code&amp;gt;BESTUURLOGINNAAM&amp;lt;/code&amp;gt; wederom &amp;lt;code&amp;gt;bestuurjjjj&amp;lt;/code&amp;gt; in.&lt;br /&gt;
#:* Bij mails van de boekencommissaris en de secretaris (gegenereerd door de website) moet natuurlijk de naam staan van het verantwoordelijke bestuurslid. Daarom moet je deze namen invullen in respectievelijk &amp;lt;code&amp;gt;Willem Hulst&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;Tara Fokker&amp;lt;/code&amp;gt;&lt;br /&gt;
# Verander de regel met &amp;lt;code&amp;gt;KANDIDAATBESTUURLOGINNAAM&amp;lt;/code&amp;gt; (onder het bestuurdata-blok) in commentaar door &amp;quot;//&amp;quot; voor de regel te proppen.&lt;br /&gt;
# Update de inhoud van &amp;lt;code&amp;gt;config.yaml&amp;lt;/code&amp;gt; met de nieuwe bestuursleden.&lt;br /&gt;
&lt;br /&gt;
== Kandidaatbestuur aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Het kandidaatbestuur kan aangemaakt worden door een commissie te maken op de site op dezelfde manier als de website frontside. Alle afgelopen jaren is de conventie &amp;lt;code&amp;gt;kbjjjj&amp;lt;/code&amp;gt; gebruikt. Doe dit ook, en vul dit in bij &amp;lt;code&amp;gt;KANDIDAATBESTUURLOGINNAAM&amp;lt;/code&amp;gt; en zorg ervoor dat het geen commentaar-regel is.&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2019-02-27T21:57:34Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Deze hele sectie is overbodig met het nieuwe configbestand. /* Je eerste commit doen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== Webcie ==&lt;br /&gt;
&lt;br /&gt;
Ga naar de [[vm-www-debug]] en log in als user webcie:&lt;br /&gt;
 ssh vm-www-debug&lt;br /&gt;
 sudo -i -u webcie&lt;br /&gt;
&lt;br /&gt;
Toevoegen aan de htpasswd:&lt;br /&gt;
 htpasswd /srv/htpasswd $USER&lt;br /&gt;
Toevoegen aan de htgroups&lt;br /&gt;
 vim /srv/config/vm-www-debug/httpd/conf.d/htgroups&lt;br /&gt;
 vim /srv/config/vm-www/httpd/conf.d/htgroups&lt;br /&gt;
Toevoegen aan de &amp;lt;code&amp;gt;wwwdebug.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
 cd /srv/http/www/git&lt;br /&gt;
 vim config.yaml&lt;br /&gt;
Op dit punt moet je even een WebCie'er laten weten dat je jezelf een debug aan het geven bent. Die zal jou vertellen wat er ingevuld moet worden om jouw eigen debugomgeving op te zetten.&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 ./scripts/debugconfig.py&lt;br /&gt;
 git add -p&lt;br /&gt;
 git commit&lt;br /&gt;
 git push&lt;br /&gt;
 sudo service httpd restart&lt;br /&gt;
Toevoegen aan de git repo&lt;br /&gt;
 Vraag aan een momenteel webcie lid om dit te doen&lt;br /&gt;
&lt;br /&gt;
== Nieuw lid ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je de code van de website binnenhalen en je eigen debugomgeving aanmaken. Dit doe je door de volgende commando's in een terminal te draaien:&lt;br /&gt;
&lt;br /&gt;
(Weet je niet hoe je een 'terminal' moet openen? Vraag een medewebcieër!)&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug2&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 git clone https://gitlab.com/iba-aes/webcie/website.git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=DEBUGNAAM-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug2/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
(Hier moet je &amp;lt;code&amp;gt;DEBUGNAAM&amp;lt;/code&amp;gt; vervangen met de naam van je debugomgeving, bijvoorbeeld 'pepernoot' of 'comint'.)&lt;br /&gt;
&lt;br /&gt;
Dit zorgt ervoor dat de code die in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt; staat wordt uitgevoerd wanneer je naar &amp;lt;code&amp;gt;DEBUGNAAM-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt; gaat in je browser.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2019-02-27T21:56:58Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Webcie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== Webcie ==&lt;br /&gt;
&lt;br /&gt;
Ga naar de [[vm-www-debug]] en log in als user webcie:&lt;br /&gt;
 ssh vm-www-debug&lt;br /&gt;
 sudo -i -u webcie&lt;br /&gt;
&lt;br /&gt;
Toevoegen aan de htpasswd:&lt;br /&gt;
 htpasswd /srv/htpasswd $USER&lt;br /&gt;
Toevoegen aan de htgroups&lt;br /&gt;
 vim /srv/config/vm-www-debug/httpd/conf.d/htgroups&lt;br /&gt;
 vim /srv/config/vm-www/httpd/conf.d/htgroups&lt;br /&gt;
Toevoegen aan de &amp;lt;code&amp;gt;wwwdebug.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
 cd /srv/http/www/git&lt;br /&gt;
 vim config.yaml&lt;br /&gt;
Op dit punt moet je even een WebCie'er laten weten dat je jezelf een debug aan het geven bent. Die zal jou vertellen wat er ingevuld moet worden om jouw eigen debugomgeving op te zetten.&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 ./scripts/debugconfig.py&lt;br /&gt;
 git add -p&lt;br /&gt;
 git commit&lt;br /&gt;
 git push&lt;br /&gt;
 sudo service httpd restart&lt;br /&gt;
Toevoegen aan de git repo&lt;br /&gt;
 Vraag aan een momenteel webcie lid om dit te doen&lt;br /&gt;
&lt;br /&gt;
== Nieuw lid ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je de code van de website binnenhalen en je eigen debugomgeving aanmaken. Dit doe je door de volgende commando's in een terminal te draaien:&lt;br /&gt;
&lt;br /&gt;
(Weet je niet hoe je een 'terminal' moet openen? Vraag een medewebcieër!)&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug2&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 git clone https://gitlab.com/iba-aes/webcie/website.git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=DEBUGNAAM-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug2/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
(Hier moet je &amp;lt;code&amp;gt;DEBUGNAAM&amp;lt;/code&amp;gt; vervangen met de naam van je debugomgeving, bijvoorbeeld 'pepernoot' of 'comint'.)&lt;br /&gt;
&lt;br /&gt;
Dit zorgt ervoor dat de code die in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt; staat wordt uitgevoerd wanneer je naar &amp;lt;code&amp;gt;DEBUGNAAM-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt; gaat in je browser.&lt;br /&gt;
&lt;br /&gt;
=== Je eerste commit doen ===&lt;br /&gt;
&lt;br /&gt;
In de root van je website (dat is de map ~/wwwdebug/www/ dus doe als je daar nog niet in zit &amp;lt;code&amp;gt;cd ~/wwwdebug/www/&amp;lt;/code&amp;gt;) staat de map space/auth/ met daarin het bestand init.php. Voeg jezelf hier toe bij de $GODNRS. Om dit bestand vervolgens te committen doe je&lt;br /&gt;
 git commit space/auth/init.php&lt;br /&gt;
Vervolgens moet je het bestand pushen zodat de rest van de webcieërs het binnen kunnen halen&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies</id>
		<title>PHP-extensies</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies"/>
				<updated>2019-02-27T21:04:52Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PHP-extensies kun je ook in composer.json configureren!&lt;br /&gt;
&lt;br /&gt;
De volgende extensies stonden op 2019-02-27 aan op de vm-www2:&lt;br /&gt;
&lt;br /&gt;
* php-json&lt;br /&gt;
* php-pecl-mcrypt&lt;br /&gt;
* php-bcmath&lt;br /&gt;
* php-cli&lt;br /&gt;
* php-fpm&lt;br /&gt;
* php-gd&lt;br /&gt;
* php-imap&lt;br /&gt;
* php-ldap&lt;br /&gt;
* php-mbstring&lt;br /&gt;
* php-mysqlnd&lt;br /&gt;
* php-pdo&lt;br /&gt;
* php-pecl-apcu&lt;br /&gt;
* php-pecl-zip&lt;br /&gt;
* php-process&lt;br /&gt;
* php-tidy&lt;br /&gt;
* php-xml&lt;br /&gt;
* php-pecl-yaml&lt;br /&gt;
&lt;br /&gt;
== APCU ==&lt;br /&gt;
&lt;br /&gt;
Iets met caching.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-pecl-apcu&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-dom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMAP ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de IMAP extensie voor functies als &amp;lt;code&amp;gt;imap_mime_header_decode&amp;lt;/code&amp;gt; binnen het &amp;lt;code&amp;gt;mail_process_bug.2&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
Om het te installeren moet je eerst &amp;lt;code&amp;gt;sudo yum install php-imap&amp;lt;/code&amp;gt; draaien op een CentOS systeem. Daarna, moet je apache herstarten: &amp;lt;code&amp;gt;sudo service httpd restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LDAP ==&lt;br /&gt;
&lt;br /&gt;
Voor het SysteemAPI: &amp;lt;code&amp;gt;yum install php-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MB ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-mbstring&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MCrypt ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-mcrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PDO ==&lt;br /&gt;
&lt;br /&gt;
Een OO'e manier om Databases in PHP te krijgen. We hebben ook de mysql-specifieke drivers nodig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-pdo php-mysql&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XDebug ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de extensie XDebug voor code coverage. Deze is alleen op &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; geïnstalleerd omdat het renderen best wel traag maakt.&lt;br /&gt;
&lt;br /&gt;
== YAML ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken YAML om configuratiebestanden uit te lezen.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Databasestructuur_committen</id>
		<title>Databasestructuur committen</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Databasestructuur_committen"/>
				<updated>2019-02-11T10:44:17Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Geef de hint dat wijzigingen via migraties zouden moeten gebeuren.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie [[WebCie Databases]] voor algemene info over de databazen.&lt;br /&gt;
&lt;br /&gt;
'''WebCie TopTip:''' Om de structuur van de database te wijzigen, kun je het beste [[databasemigraties]] gebruiken. Deze houden de wijziging in de code en wijziging in de databasestructuur bij elkaar.&lt;br /&gt;
&lt;br /&gt;
== Committen ==&lt;br /&gt;
Als je iets hebt aangepast in de database, moet je dit officieel maken door het te committen. Anders krijg je het volgende bericht regelmatig toegemaild: &amp;lt;code&amp;gt;De structuur van de database is veranderd. Commit dit ajb zsm.&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om je aanpassingen te committen, doe je het volgende:&lt;br /&gt;
&lt;br /&gt;
#ssh vm-www&lt;br /&gt;
#s webcie&lt;br /&gt;
#cd /srv/http/www/scripts/cron&lt;br /&gt;
#./dump_database_struct.sh &lt;br /&gt;
#cd ../&lt;br /&gt;
#Check databasecontent.mysql.sql, gewoon met &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;. Als dit klopt commit het dan. (Denk eraan om toe te voegen dat jij het hebt gecommit via &amp;quot;Committer: naam&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Databasemigraties</id>
		<title>Databasemigraties</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Databasemigraties"/>
				<updated>2019-02-11T10:41:17Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Redirected page to WebCie Databases#Databasestructuur aanpassen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[WebCie_Databases#Databasestructuur_aanpassen]]&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]] [[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken</id>
		<title>Uitgebreid Zoeken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken"/>
				<updated>2019-02-08T12:47:56Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Itemsoorten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
In het nieuwe Uitgebreid Zoeken kunnen gebruikers hun eigen kwerries samenstellen door sleuren en pleuren. Dit wordt dan op de server omgezet tot een SQL-query, die op de database uitgevoerd wordt, en waarvoor vervolgens de juiste weergave gekozen wordt. De zoekkwerrie wordt overgestuurd als een JSON-object, als een soort fancy s-expressie.&lt;br /&gt;
&lt;br /&gt;
== Front-end: sleuren en pleuren ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de Javascriptlibrary [https://github.com/stevendwood/html5-dropzone HTML5 Dropzone], die een fijne wrapper geeft om de sleur-en-pleurfunctionaliteit in HTML5. Je hebt hier een niet al te antieke browser voor nodig dus.&lt;br /&gt;
Voor elk soort item die de gebruiker in de query kan doen, maken we een template aan (iets met class &amp;quot;zoek-item&amp;quot;), die de gebruiker kan kopiëren naar gaten (iets met class &amp;quot;zoek-gat&amp;quot;) in de query. Deze gaten worden dan gevuld met (maar niet vervangen door) kopietjes van dit item. In dit item mogen ook weer gaten voorkomen, bijvoorbeeld voor de &amp;quot;EN&amp;quot;- en &amp;quot;OF&amp;quot;-operatoren.&lt;br /&gt;
Omdat we gaten niet vervangen, hebben we ook replacement-functionaliteit: wil je een item vervangen met een ander item, dan pleur je het nieuwe item over het andere item heen. De eventhandlers van het gat zorgen ervoor dat de vervanging goedgaat.&lt;br /&gt;
De hele state van de query wordt in de structuur van de html-elementen opgeslagen, zodat er niets gedesynct wordt. Een nadeel is dat je niet al te veel fancy's kunt doen met de opmaak, want we gaan ervan uit dat de kwerrie eruit ziet als een &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-element met als (direct) kind precies 1 &amp;lt;code&amp;gt;.zoek-root&amp;lt;/code&amp;gt;-element, met als (direct) kind een aantal &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-elementen, etc. In feite is de hele structuur niets meer dan een s-expressie met pretentie.&lt;br /&gt;
&lt;br /&gt;
De notatie die we nu gaan aanhouden: als je een item hebt met een paar (oningevulde) gaten, schrijven we die op als &amp;lt;code&amp;gt;(zoektype ? ? ... ?)&amp;lt;/code&amp;gt;, en als er een paar gaten zijn ingevuld, wordt het bijvoorbeeld  &amp;lt;code&amp;gt;(en (of (vakid) ?) (niet (actief)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Op dit moment werkt het verplaatsen van al geplaatste items nog niet heel netjes: bij het pleuren wordt namelijk alleen een nieuw item gemaakt van de wortel van hetgeen wat je sleept. Een kopie van &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt; ziet er dus uit als &amp;lt;code&amp;gt;(en ? ?)&amp;lt;/code&amp;gt;, niet &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Om formvelden binnen items te ondersteunen (denk aan &amp;quot;lid sinds &amp;lt;datum&amp;gt;&amp;quot;), kunnen items ook een dict attrs van extra waarden, naast de invulling van gaten, meedragen. In de HTML worden deze weergegeven als attributen van de vorm &amp;lt;code&amp;gt;data-zoek-*&amp;lt;/code&amp;gt;, zodat &amp;lt;code&amp;gt;data-zoek-bla&amp;lt;/code&amp;gt; overeenkomt met een key &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; in de attrs. Je moet in Javascript ervoor zorgen dat deze bij elke update van het formveld dit in de attributen geupdate wordt.&lt;br /&gt;
&lt;br /&gt;
== Serialisatie ==&lt;br /&gt;
&lt;br /&gt;
Als de gebruiker vervolgens op de zoekknop drukt, wordt een geserialiseerde kwerrie opgestuurd. Op basis van de HTML wordt een JSON-object gemaakt dat de zoekkwerrie encodeert. Omdat de structuur om en om bestaat uit gat met misschien een item, en item met een lijst gaten, doen we ook twee serialisatiestappen in mutuele recursie. Een gat serialiseert tot ofwel de serialisatie van het item dat erinzit, ofwel &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. Een item serialiseert tot een JSON-object van de vorm &amp;lt;code&amp;gt;{'head': ... , 'tail': ... , 'attrs': ...}&amp;lt;/code&amp;gt;. De head is het zoektype van dit item (&amp;lt;code&amp;gt;'en'&amp;lt;/code&amp;gt; voor de logische conjunctieoperator, &amp;lt;code&amp;gt;'vakid'&amp;lt;/code&amp;gt;, etc.), de tail is een lijst van alle (geserialiseerde) gaten van dit item (inclusief &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; voor oningevulde!), en de attrs zijn een dict met strings, de extra attributen (zoals de waarden van inputs in dit zoekitem).&lt;br /&gt;
&lt;br /&gt;
Zo wordt bijvoorbeeld de s-expressie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;(of (vakid) (en (actiefCie) (niet (actiefAlles))))&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geserialiseerd naar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&amp;quot;head&amp;quot;:&amp;quot;of&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;vakid&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}},{&amp;quot;head&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;actiefCie&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}},{&amp;quot;head&amp;quot;:&amp;quot;niet&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;actiefAlles&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: voorbeeld met attributen&lt;br /&gt;
&lt;br /&gt;
== Itemsoorten ==&lt;br /&gt;
&lt;br /&gt;
De volgende itemsoorten worden ondersteund:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Zoektype !! Gaten !! Attributen !! Betekenis&lt;br /&gt;
|-&lt;br /&gt;
| en || 2 || {} || conjunctie: ('''en''' ''l'' ''r'') bestaat uit de doorsnede van iedereen in ''l'' en iedereen in ''r''&lt;br /&gt;
|-&lt;br /&gt;
| of || 2 || {} || disjunctie: ('''of''' ''l'' ''r'') bestaat uit de vereniging van iedereen in ''l'' met iedereen in ''r''&lt;br /&gt;
|-&lt;br /&gt;
| niet || 1 || {} || negatie: ('''niet''' ''q'') bestaat uit iedereen die niet in ''q'' zit&lt;br /&gt;
|-&lt;br /&gt;
| lidtoestand || 0 || {'toestand': ...} || lidtoestand komt overeen met &amp;lt;code&amp;gt;attrs.toestand&amp;lt;/code&amp;gt;: 'lid': &amp;quot;gewoon&amp;quot; huidig lid of BAL; 'oudlid': vroeger, maar niet meer, lid; 'bijnalid': heeft zich ingeschreven voor de intro maar is nog niet lid geworden; 'bal': Bijzonder Actief Lid (staat bij huidige leden, niet bij oudleden); 'erelid': erelid (staat niet bij huidige leden); 'verdienste': lid van verdienste (staat niet bij huidige leden).&lt;br /&gt;
|-&lt;br /&gt;
| studeert || 0 || {'studie': ...} || doet op dit moment de gegeven studie. &amp;lt;code&amp;gt;attrs.studie&amp;lt;/code&amp;gt; is het ID van een Studie-object in de database.&lt;br /&gt;
|-&lt;br /&gt;
| studeerde || 0 || {'studie': ...} || studeerde vroeger, niet meer, de gegeven studie. Zie '''studeert''' voor info over &amp;lt;code&amp;gt;attrs.studie&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| studieOnbekend || 0 || {} || geen studiegegevens bekend&lt;br /&gt;
|-&lt;br /&gt;
| vakidPost || 0 || {} || heeft aangegeven de Vakidioot per post te willen ontvangen&lt;br /&gt;
|-&lt;br /&gt;
| aesRoots || 0 || {} || heeft aangegeven de A–Eskwadraat√roots te willen ontvangen&lt;br /&gt;
|-&lt;br /&gt;
| actiefCie || 0 || {} || is actief in een commissie&lt;br /&gt;
|-&lt;br /&gt;
| actiefAlles || 0 || {} || is actief in een commissie, groep of dispuut&lt;br /&gt;
|-&lt;br /&gt;
| actiefRecent || 0 || {} || is, of was afgelopen jaar, actief in een commissie, groep of dispuut&lt;br /&gt;
|-&lt;br /&gt;
| deelnemer || 0 || {} || staat bij de deelnemers voor een activiteit afgelopen jaar&lt;br /&gt;
|-&lt;br /&gt;
| adresBekend || 0 || {} || adres bekend in de database&lt;br /&gt;
|-&lt;br /&gt;
| emailBekend || 0 || {} || email bekend in de database&lt;br /&gt;
|-&lt;br /&gt;
| donateur || 0 || {} || is op dit moment donateur&lt;br /&gt;
|-&lt;br /&gt;
| donateurGeweest || 0 || {} || was donateur maar nu niet meer&lt;br /&gt;
|-&lt;br /&gt;
| afgestudeerd || 0 || {'coljaar': ...} || afgestudeerd in &amp;lt;code&amp;gt;attrs.coljaar&amp;lt;/code&amp;gt;. Collegejaren worden gegeven als string van het jaar waarin ze beginnen, dus '2017' is 3 sept 2017 - 3 sept 2018.&lt;br /&gt;
|-&lt;br /&gt;
| almaOK || 0 || {} || willen opgenomen worden in de almanak&lt;br /&gt;
|-&lt;br /&gt;
| geluksvogel || 0 || {} || jonger dan 18 jaar&lt;br /&gt;
|-&lt;br /&gt;
| kart || 0 || {} || zit in de kart van de gebruiker&lt;br /&gt;
|-&lt;br /&gt;
| lidVan || 0 || {'coljaar': ...} || lid geworden in &amp;lt;code&amp;gt;attrs.coljaar&amp;lt;/code&amp;gt;. Collegejaren worden gegeven als string van het jaar waarin ze beginnen, dus '2017' is 3 sept 2017 - 3 sept 2018.&lt;br /&gt;
|-&lt;br /&gt;
| lidTot || 0 || {'coljaar': ...} || lid-af in &amp;lt;code&amp;gt;attrs.coljaar&amp;lt;/code&amp;gt;. Collegejaren worden gegeven als string van het jaar waarin ze beginnen, dus '2017' is 3 sept 2017 - 3 sept 2018.&lt;br /&gt;
|-&lt;br /&gt;
| voornaamwoord || 0 || {'voornaamwoordID': ...} || gebruikt persoonlijk voornaamwoord met ID &amp;lt;code&amp;gt;attrs.voornaamwoordID&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| bounces || 0 || {} || heeft bounces: e-mails die door de site zijn verstuurd maar niet zijn aangekomen&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken</id>
		<title>Uitgebreid Zoeken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken"/>
				<updated>2019-02-08T12:05:32Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Serialisatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
In het nieuwe Uitgebreid Zoeken kunnen gebruikers hun eigen kwerries samenstellen door sleuren en pleuren. Dit wordt dan op de server omgezet tot een SQL-query, die op de database uitgevoerd wordt, en waarvoor vervolgens de juiste weergave gekozen wordt. De zoekkwerrie wordt overgestuurd als een JSON-object, als een soort fancy s-expressie.&lt;br /&gt;
&lt;br /&gt;
== Front-end: sleuren en pleuren ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de Javascriptlibrary [https://github.com/stevendwood/html5-dropzone HTML5 Dropzone], die een fijne wrapper geeft om de sleur-en-pleurfunctionaliteit in HTML5. Je hebt hier een niet al te antieke browser voor nodig dus.&lt;br /&gt;
Voor elk soort item die de gebruiker in de query kan doen, maken we een template aan (iets met class &amp;quot;zoek-item&amp;quot;), die de gebruiker kan kopiëren naar gaten (iets met class &amp;quot;zoek-gat&amp;quot;) in de query. Deze gaten worden dan gevuld met (maar niet vervangen door) kopietjes van dit item. In dit item mogen ook weer gaten voorkomen, bijvoorbeeld voor de &amp;quot;EN&amp;quot;- en &amp;quot;OF&amp;quot;-operatoren.&lt;br /&gt;
Omdat we gaten niet vervangen, hebben we ook replacement-functionaliteit: wil je een item vervangen met een ander item, dan pleur je het nieuwe item over het andere item heen. De eventhandlers van het gat zorgen ervoor dat de vervanging goedgaat.&lt;br /&gt;
De hele state van de query wordt in de structuur van de html-elementen opgeslagen, zodat er niets gedesynct wordt. Een nadeel is dat je niet al te veel fancy's kunt doen met de opmaak, want we gaan ervan uit dat de kwerrie eruit ziet als een &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-element met als (direct) kind precies 1 &amp;lt;code&amp;gt;.zoek-root&amp;lt;/code&amp;gt;-element, met als (direct) kind een aantal &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-elementen, etc. In feite is de hele structuur niets meer dan een s-expressie met pretentie.&lt;br /&gt;
&lt;br /&gt;
De notatie die we nu gaan aanhouden: als je een item hebt met een paar (oningevulde) gaten, schrijven we die op als &amp;lt;code&amp;gt;(zoektype ? ? ... ?)&amp;lt;/code&amp;gt;, en als er een paar gaten zijn ingevuld, wordt het bijvoorbeeld  &amp;lt;code&amp;gt;(en (of (vakid) ?) (niet (actief)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Op dit moment werkt het verplaatsen van al geplaatste items nog niet heel netjes: bij het pleuren wordt namelijk alleen een nieuw item gemaakt van de wortel van hetgeen wat je sleept. Een kopie van &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt; ziet er dus uit als &amp;lt;code&amp;gt;(en ? ?)&amp;lt;/code&amp;gt;, niet &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Om formvelden binnen items te ondersteunen (denk aan &amp;quot;lid sinds &amp;lt;datum&amp;gt;&amp;quot;), kunnen items ook een dict attrs van extra waarden, naast de invulling van gaten, meedragen. In de HTML worden deze weergegeven als attributen van de vorm &amp;lt;code&amp;gt;data-zoek-*&amp;lt;/code&amp;gt;, zodat &amp;lt;code&amp;gt;data-zoek-bla&amp;lt;/code&amp;gt; overeenkomt met een key &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; in de attrs. Je moet in Javascript ervoor zorgen dat deze bij elke update van het formveld dit in de attributen geupdate wordt.&lt;br /&gt;
&lt;br /&gt;
== Serialisatie ==&lt;br /&gt;
&lt;br /&gt;
Als de gebruiker vervolgens op de zoekknop drukt, wordt een geserialiseerde kwerrie opgestuurd. Op basis van de HTML wordt een JSON-object gemaakt dat de zoekkwerrie encodeert. Omdat de structuur om en om bestaat uit gat met misschien een item, en item met een lijst gaten, doen we ook twee serialisatiestappen in mutuele recursie. Een gat serialiseert tot ofwel de serialisatie van het item dat erinzit, ofwel &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;. Een item serialiseert tot een JSON-object van de vorm &amp;lt;code&amp;gt;{'head': ... , 'tail': ... , 'attrs': ...}&amp;lt;/code&amp;gt;. De head is het zoektype van dit item (&amp;lt;code&amp;gt;'en'&amp;lt;/code&amp;gt; voor de logische conjunctieoperator, &amp;lt;code&amp;gt;'vakid'&amp;lt;/code&amp;gt;, etc.), de tail is een lijst van alle (geserialiseerde) gaten van dit item (inclusief &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; voor oningevulde!), en de attrs zijn een dict met strings, de extra attributen (zoals de waarden van inputs in dit zoekitem).&lt;br /&gt;
&lt;br /&gt;
Zo wordt bijvoorbeeld de s-expressie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;(of (vakid) (en (actiefCie) (niet (actiefAlles))))&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geserialiseerd naar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;{&amp;quot;head&amp;quot;:&amp;quot;of&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;vakid&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}},{&amp;quot;head&amp;quot;:&amp;quot;en&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;actiefCie&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}},{&amp;quot;head&amp;quot;:&amp;quot;niet&amp;quot;,&amp;quot;tail&amp;quot;:[{&amp;quot;head&amp;quot;:&amp;quot;actiefAlles&amp;quot;,&amp;quot;tail&amp;quot;:[],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}],&amp;quot;attrs&amp;quot;:{}}&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: voorbeeld met attributen&lt;br /&gt;
&lt;br /&gt;
== Itemsoorten ==&lt;br /&gt;
&lt;br /&gt;
TODO: documenteer dit&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken</id>
		<title>Uitgebreid Zoeken</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Uitgebreid_Zoeken"/>
				<updated>2019-02-06T22:00:59Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: Created page with &amp;quot;Category:WebCie  In het nieuwe Uitgebreid Zoeken kunnen gebruikers hun eigen kwerries samenstellen door sleuren en pleuren. Dit wordt dan op de server omgezet tot een SQL-...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:WebCie]]&lt;br /&gt;
&lt;br /&gt;
In het nieuwe Uitgebreid Zoeken kunnen gebruikers hun eigen kwerries samenstellen door sleuren en pleuren. Dit wordt dan op de server omgezet tot een SQL-query, die op de database uitgevoerd wordt, en waarvoor vervolgens de juiste weergave gekozen wordt. De zoekkwerrie wordt overgestuurd als een JSON-object, als een soort fancy s-expressie.&lt;br /&gt;
&lt;br /&gt;
== Front-end: sleuren en pleuren ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de Javascriptlibrary [https://github.com/stevendwood/html5-dropzone HTML5 Dropzone], die een fijne wrapper geeft om de sleur-en-pleurfunctionaliteit in HTML5. Je hebt hier een niet al te antieke browser voor nodig dus.&lt;br /&gt;
Voor elk soort item die de gebruiker in de query kan doen, maken we een template aan (iets met class &amp;quot;zoek-item&amp;quot;), die de gebruiker kan kopiëren naar gaten (iets met class &amp;quot;zoek-gat&amp;quot;) in de query. Deze gaten worden dan gevuld met (maar niet vervangen door) kopietjes van dit item. In dit item mogen ook weer gaten voorkomen, bijvoorbeeld voor de &amp;quot;EN&amp;quot;- en &amp;quot;OF&amp;quot;-operatoren.&lt;br /&gt;
Omdat we gaten niet vervangen, hebben we ook replacement-functionaliteit: wil je een item vervangen met een ander item, dan pleur je het nieuwe item over het andere item heen. De eventhandlers van het gat zorgen ervoor dat de vervanging goedgaat.&lt;br /&gt;
De hele state van de query wordt in de structuur van de html-elementen opgeslagen, zodat er niets gedesynct wordt. Een nadeel is dat je niet al te veel fancy's kunt doen met de opmaak, want we gaan ervan uit dat de kwerrie eruit ziet als een &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-element met als (direct) kind precies 1 &amp;lt;code&amp;gt;.zoek-root&amp;lt;/code&amp;gt;-element, met als (direct) kind een aantal &amp;lt;code&amp;gt;.zoek-gat&amp;lt;/code&amp;gt;-elementen, etc. In feite is de hele structuur niets meer dan een s-expressie met pretentie.&lt;br /&gt;
&lt;br /&gt;
De notatie die we nu gaan aanhouden: als je een item hebt met een paar (oningevulde) gaten, schrijven we die op als &amp;lt;code&amp;gt;(zoektype ? ? ... ?)&amp;lt;/code&amp;gt;, en als er een paar gaten zijn ingevuld, wordt het bijvoorbeeld  &amp;lt;code&amp;gt;(en (of (vakid) ?) (niet (actief)))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Op dit moment werkt het verplaatsen van al geplaatste items nog niet heel netjes: bij het pleuren wordt namelijk alleen een nieuw item gemaakt van de wortel van hetgeen wat je sleept. Een kopie van &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt; ziet er dus uit als &amp;lt;code&amp;gt;(en ? ?)&amp;lt;/code&amp;gt;, niet &amp;lt;code&amp;gt;(en (vakid) (actief))&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Om formvelden binnen items te ondersteunen (denk aan &amp;quot;lid sinds &amp;lt;datum&amp;gt;&amp;quot;), kunnen items ook een dict attrs van extra waarden, naast de invulling van gaten, meedragen. In de HTML worden deze weergegeven als attributen van de vorm &amp;lt;code&amp;gt;data-zoek-*&amp;lt;/code&amp;gt;, zodat &amp;lt;code&amp;gt;data-zoek-bla&amp;lt;/code&amp;gt; overeenkomt met een key &amp;lt;code&amp;gt;bla&amp;lt;/code&amp;gt; in de attrs. Je moet in Javascript ervoor zorgen dat deze bij elke update van het formveld dit in de attributen geupdate wordt.&lt;br /&gt;
&lt;br /&gt;
== Serialisatie ==&lt;br /&gt;
&lt;br /&gt;
TODO: documenteer dit&lt;br /&gt;
&lt;br /&gt;
== Itemsoorten ==&lt;br /&gt;
&lt;br /&gt;
TODO: documenteer dit&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases</id>
		<title>WebCie Databases</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases"/>
				<updated>2019-01-09T19:24:00Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Debugdatabase */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De WebCie runt een paar databases waarin alle websitedata (dus ook ledendata, en transactiedata) staat. Op de [[vm-www]], [[vm-www-debug]] en de [[vm-www-inwerking]] draaien allemaal een databaseserver en dezelfde databasestructuur (modulo updatevolgorde).&lt;br /&gt;
&lt;br /&gt;
== Gebruik in de code ==&lt;br /&gt;
&lt;br /&gt;
De beste manier om kwerries op de databaas te doen is met [[QueryBuilder]]. Dit is een manier om volautomatisch SQL te genereren vanuit object-georienteerde code, zonder dat je bang hoeft te zijn voor injectie enzo.&lt;br /&gt;
&lt;br /&gt;
De belangrijkste database is &amp;lt;code&amp;gt;whoswho4&amp;lt;/code&amp;gt;, waar alle [[WhosWho4]]-objecten in staan. Dan zijn er nog &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; voor [[Benamite]] en &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt; voor [[Bookweb]].&lt;br /&gt;
&lt;br /&gt;
=== Hoe een db-connectie opgezet wordt ===&lt;br /&gt;
&lt;br /&gt;
In principe zouden dingen als databaseconnectie enzo al geregeld moeten zijn als je controllerfunctie aangeroepen wordt, maak hier dus alleen zorgen over als je ergens in [[space]] bezig bent.&lt;br /&gt;
&lt;br /&gt;
Eerst wordt door [[space]] het bestand [[secret.php]] geladen, waarin gebruikersnaam en wachtwoord voor alle databaseusers staan. Op basis van de functie &amp;lt;code&amp;gt;getLevel&amp;lt;/code&amp;gt; worden drie globalen &amp;lt;code&amp;gt;$WSW4DB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$BWDB&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;$BMDB&amp;lt;/code&amp;gt; gemaakt door middel van [https://doxygen-www.a-eskwadraat.nl/classdbpdo.html dbpdo]. Hun memberfunctie &amp;lt;code&amp;gt;q(...)&amp;lt;/code&amp;gt; verstuurt een kwerrie naar de desbetreffende databaas.&lt;br /&gt;
&lt;br /&gt;
Dit zorgt er ook voor dat inloggen en uitloggen (en eigenlijk alles wat de auth van de gebruiker aanpast) een refresh vereist voordat alles goed weergegeven kan worden!&lt;br /&gt;
&lt;br /&gt;
== Debugdatabase ==&lt;br /&gt;
&lt;br /&gt;
Op de [[vm-www-debug]] wordt elke nacht een kopietje gemaakt van de livedatabases om op te kunnen debuggen. Deze db's heten &amp;lt;code&amp;gt;test_$BLA&amp;lt;/code&amp;gt; waar &amp;lt;code&amp;gt;$BLA&amp;lt;/code&amp;gt; staat voor de naam van de originele database.&lt;br /&gt;
&lt;br /&gt;
Om precies te zijn, elke dag wordt &amp;lt;code&amp;gt;scripts/cron/copy_db_to_test_db.sh boeken whoswho4&amp;lt;/code&amp;gt; aangeroepen op de live-server (zolang bookweb nog wordt gebruikt met &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt;).&lt;br /&gt;
Elke maandag ochtend wordt de tabel &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; gekopieerd naar de debug database.&lt;br /&gt;
Dit valt terug te vinden in de crontab onder &amp;lt;code&amp;gt;scripts/cron&amp;lt;/code&amp;gt;.&lt;br /&gt;
De aanroep is &amp;lt;code&amp;gt;ssh root@vm-www-debug -i ~/.ssh/debug test_$db&amp;lt;/code&amp;gt;. Zoals je misschien vermoedt, is er geen commando genaamd &amp;lt;code&amp;gt;test_$db&amp;lt;/code&amp;gt; op de vm-www-debug. In plaats daarvan staat in &amp;lt;code&amp;gt;~/.ssh/authorized_keys&amp;lt;/code&amp;gt; van root@vm-www-debug ingesteld dat bij ssh'en het commando &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; aangeroepen wordt in plaats van wat je van plan bent. Bij navraag bij degene die deze soepmes begaan heeft, antwoordde die: &amp;quot;zo is natoer&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Nieuwe database aanmaken ==&lt;br /&gt;
&lt;br /&gt;
(De bedoeling is dat we het bij de huidige db's houden, maar misschien is er in de toekomst een goede reden!)&lt;br /&gt;
&lt;br /&gt;
Als je een nieuwe WebCie-database wilt aanmaken, moet je ook het [[Backup|backupscript]] aanpassen. Daarin staan namelijk alle databases die gebackupt worden. Vergeet ook niet verbindingen te openen met de nieuwe db in [[space]].&lt;br /&gt;
&lt;br /&gt;
== Databasestructuur aanpassen ==&lt;br /&gt;
&lt;br /&gt;
De databasestructuur wordt in de repository opgeslagen door middel van [http://alembic.zzzcomputing.com/en/latest/index.html Alembic]. Deze bewaart de geschiedenis in de vorm van een gerichte graaf van revisie, een soort git maar dan voor databasestructuur.&lt;br /&gt;
In tegenstelling tot git, begin je met de revisie een naam geven, en pas je daarna een bestand aan.&lt;br /&gt;
&lt;br /&gt;
=== Voorbeeld: een veld toevoegen aan een tabel ===&lt;br /&gt;
&lt;br /&gt;
Stel dat je in het Persoon-object een veld 'naamHuisdier' wilt toevoegen.&lt;br /&gt;
De makkelijkste manier is om [[Dia en generated code|de dia aan te passen]] en dan in je terminal uit te voeren: &amp;lt;code&amp;gt;manage revision 'veld naamHuisdier toevoegen in Persoon'&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dit zou volautomatisch een databaserevisie moeten maken en openen in je favoriete editor. ('''PRO-TIP''': opent niet je favoriete editor? Stel &amp;lt;code&amp;gt;$EDITOR&amp;lt;/code&amp;gt; in!)&lt;br /&gt;
Vervolgens kun je de migratie naar hartelust aanpassen.&lt;br /&gt;
&lt;br /&gt;
Ben je tevreden met de wijzigingen, dan sla je het bestand op,&lt;br /&gt;
en doe je op de command line &amp;lt;code&amp;gt;alembic upgrade head&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dit past je wijzigingen toe op de debugdatabase.&lt;br /&gt;
Nu kun je de nieuwe databasestructuur gaan testen.&lt;br /&gt;
'''LET OP''': als je je revisie aan wil passen, doe eerst &amp;lt;code&amp;gt;alembic downgrade -1&amp;lt;/code&amp;gt; om die ongedaan te maken.&lt;br /&gt;
&lt;br /&gt;
Na verloop van tijd is je feature hopelijk naar de livesite gemerged.&lt;br /&gt;
Het livezetten gaat hetzelfde: doe op de [[vm-www]] weer &amp;lt;code&amp;gt;alembic upgrade head&amp;lt;/code&amp;gt;&lt;br /&gt;
en alle wijzigingen worden automatisch doorgevoerd.&lt;br /&gt;
Als je wijzigingen op de livesite doorgevoerd hebt, moet je de [[Databasestructuur committen]].&lt;br /&gt;
&lt;br /&gt;
==== Hetzelfde, maar dan handmatig ====&lt;br /&gt;
&lt;br /&gt;
In het handmatige geval doe je als eerste stap in de command line &amp;lt;code&amp;gt;alembic revision -m 'veld naamHuisdier toevoegen in Persoon'&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alembic maakt dan een bestand aan in &amp;lt;code&amp;gt;alembic/versions/&amp;lt;/code&amp;gt; met een of andere naam.&lt;br /&gt;
Open dat bestand in je favoriete teksteditor ('''PRO-TIP''': stel &amp;lt;code&amp;gt;$EDITOR&amp;lt;/code&amp;gt; in en doe &amp;lt;code&amp;gt;alembic edit head&amp;lt;/code&amp;gt;).&lt;br /&gt;
Nu kun je in het bestand operaties gaan toevoegen, zodat je bestand er ongeveer uitziet als:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ... metadata voor Alembic&lt;br /&gt;
&lt;br /&gt;
from alembic import op&lt;br /&gt;
import sqlalchemy as sa&lt;br /&gt;
&lt;br /&gt;
def upgrade():&lt;br /&gt;
    op.add_column('Persoon', sa.Column('naamHuisdier', sa.String))&lt;br /&gt;
&lt;br /&gt;
def downgrade():&lt;br /&gt;
    op.drop_column('Persoon', 'naamHuisdier')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Het is belangrijk om upgrade en downgrade elkaars inverses te maken (op de structuur, want data kun je misschien wel kwijtraken),&lt;br /&gt;
zodat het schakelen tussen branches goedgaat.&lt;br /&gt;
&lt;br /&gt;
Het verdere verloop is net als bij automatische migraties.&lt;br /&gt;
&lt;br /&gt;
== In de database graven ==&lt;br /&gt;
&lt;br /&gt;
Wil je iets in de database doen dat niet kan met de site? Dan kun je op [https://pgadmin-debug.a-eskwadraat.nl] (of als je echt PHPMyAdmin nodig hebt [https://admin-debug.a-eskwadraat.nl]) (debugdb) en [https://admin.a-eskwadraat.nl] (livedb) inloggen op localhost met gebruikersnaam root en het databasewachtwoord. Dit wachtwoord vind je in het bestand &amp;lt;code&amp;gt;.my.cnf&amp;lt;/code&amp;gt; in de homedir van gebruiker &amp;lt;code&amp;gt;webcie&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Migratie naar PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
MySQL is stiekem best wel slecht, dus we willen graag in plaats daarvan PostgreSQL gebruiken. De migratie gaat ongeveer als volgt.&lt;br /&gt;
&lt;br /&gt;
SSH naar de VM waar de oorspronkelijke database opstaat. Dan doe je ongeveer de volgende stappen (dit is voor de vm-www-debug).&lt;br /&gt;
Eerst installeren we Postgres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
rpm -Uvh pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
sudo yum update                                                                &lt;br /&gt;
sudo yum install postgresql96-server postgresql96-contrib                      &lt;br /&gt;
sudo service postgresql-9.6 initdb                                             &lt;br /&gt;
sudo service postgresql-9.6 start                                              &lt;br /&gt;
sudo chkconfig postgresql-9.6 on                                               &lt;br /&gt;
sudo -i                                                                        &lt;br /&gt;
su postgres                                                                    &lt;br /&gt;
psql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doe nu &amp;lt;code&amp;gt;CREATE USER&amp;lt;/code&amp;gt; voor alle users in je [[secret.php]].&lt;br /&gt;
&lt;br /&gt;
Dan zijn we klaar om de koppeling met PHP te maken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install php-pgsql                                                        &lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
                                                        &lt;br /&gt;
Pas &amp;lt;code&amp;gt;/var/lib/pgsql/9.6/data/pg_hba.conf&amp;lt;/code&amp;gt; aan zodat je auth method md5 gebruikt.&lt;br /&gt;
(De bestanden &amp;lt;code&amp;gt;/usr/pgsql/*&amp;lt;/code&amp;gt; slaan nergens op, negeer deze.)                                                &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service postgresql-9.6 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
                                             &lt;br /&gt;
Je zou nu moeten kunnen inloggen met &amp;lt;code&amp;gt;psql --user $BLA -d postgres&amp;lt;/code&amp;gt;              &lt;br /&gt;
en ook op adminer (maar let op dat je een database kiest die bestaat).             &lt;br /&gt;
&lt;br /&gt;
=== Data migreren ===                                                                                  &lt;br /&gt;
Ruim eerst je DB een beetje op!                                                   &lt;br /&gt;
(oftewel zorg dat je foreign keys kloppen, dat er geen datums zijn met jaar 0000, maand 00 of dag 00 enzo)&lt;br /&gt;
&lt;br /&gt;
Dit is een volledige migratie, inclusief dbstructuur. Gebruik andere opties voor &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; om alleen data te verhuizen.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mysqldump --compatible=postgresql --user=root --password --default-character-set=utf8 test_whoswho4 &amp;gt; export.sql&lt;br /&gt;
python2.7 docs/db_converter.py export.sql pg-export.sql                    &lt;br /&gt;
psql -d test_whoswho4 -U root -f pg-export.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PRO-TIP: pas de relaties eerst handmatig aan, want die zijn niet echt goed over te zetten.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moeten we handmatig alle tabellen die in MySQL een autoincrement hadden, maar waar die kolom niet &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; heet, in PostgreSQL een sequencenummer geven. Dat ziet er ongeveer zo uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE SEQUENCE IOUBon_bonID_seq;&lt;br /&gt;
SELECT setval('IOUBon_bonID_seq', max(&amp;quot;bonID&amp;quot;)) FROM &amp;quot;IOUBon&amp;quot;;&lt;br /&gt;
ALTER TABLE &amp;quot;IOUBon&amp;quot; ALTER COLUMN &amp;quot;bonID&amp;quot; SET DEFAULT nextval('IOUBon_bonID_seq');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Heb je dat allemaal gedaan, dan moet je ook voor alle databaseusers rechten geven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO god;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ingelogd;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO dibstablet;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO mollie;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO gast;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we ook nog de rechten overnemen. In MySQL doe je &amp;lt;code&amp;gt;SHOW GRANTS FOR '$USER'@'localhost'&amp;lt;/code&amp;gt; voor alle users in de db-wachtwoorden, pas de output hiervan aan tot PostgreSQL-syntax en voer die uit. (Dit is een hoop werk!)&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2019-01-06T16:26:23Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Overige tsjak ter installatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''LET OP!''' Replicatie gaat niet helemaal goed samen met de [[Backup#Backup_van_binaire_logs|backup van de binaire logs]], zorg er eerst voor dat dat gefixt is, voordat je deze handleiding verder leest.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ipa-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor autologin:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install mod_auth_kerb mod_authnz_pam mod_lookup_ident sssd-dbus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor autologin op de site:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/www-auth.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stel de volgende gegevens in in &amp;lt;code&amp;gt;/etc/sssd/sssd.conf&amp;lt;/code&amp;gt; voor zover deze nog niet bestaat.&lt;br /&gt;
&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[domain/a-eskwadraat.nl]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;ldap_user_extra_attrs = mail,memberId,email:mail&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[sssd]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;services = nss, sudo, pam, ssh, ifp&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[ifp]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
allowed_uids = apache, root&lt;br /&gt;
user_attributes = +memberId&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ffmpeg git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2019-01-06T13:19:40Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Mariadb en replicatie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''LET OP!''' Replicatie gaat niet helemaal goed samen met de [[Backup#Backup_van_binaire_logs|backup van de binaire logs]], zorg er eerst voor dat dat gefixt is, voordat je deze handleiding verder leest.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install ipa-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor autologin:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install mod_auth_kerb mod_authnz_pam mod_lookup_ident sssd-dbus&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voor autologin op de site:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/www-auth.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Stel de volgende gegevens in in &amp;lt;code&amp;gt;/etc/sssd/sssd.conf&amp;lt;/code&amp;gt; voor zover deze nog niet bestaat.&lt;br /&gt;
&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[domain/a-eskwadraat.nl]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;ldap_user_extra_attrs = mail,memberId,email:mail&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[sssd]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;services = nss, sudo, pam, ssh, ifp&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onder &amp;lt;code&amp;gt;[ifp]&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
allowed_uids = apache, root&lt;br /&gt;
user_attributes = +memberId&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Backup</id>
		<title>Backup</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Backup"/>
				<updated>2019-01-06T13:18:01Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* WebCie: snapshots van de database */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Geregeld worden er '''backups''' gemaakt van een groot deel van het systeem. Hier vallen onder andere de home directories en virtuele machines onder. De WebCie heeft ook een grote hoeveelheid incrementele databasebackups.&lt;br /&gt;
&lt;br /&gt;
== Interne backups ==&lt;br /&gt;
&lt;br /&gt;
De interne backups zijn bedoeld om bestanden terug te kunnen halen die per ongeluk verwijderd zijn. Elke 4 uur, met middernacht als offset, wordt er een recursieve snapshot gemaakt van alle data. Deze 4 uurlijkse snapshots worden, op die van middernacht na, 2 dagen bewaard. De snapshots van middernacht worden standaard 2 weken bewaard, met enkele uitzonderingen zoals de home directories. Deze uitzonderingen plus hun retention tijd staan op haskell in `/etc/cron.daily/managesnapshot`.&lt;br /&gt;
&lt;br /&gt;
Deze 4 uurlijkse backups worden direct gesynced naar de on-site backup in de vorm van Nikola.&lt;br /&gt;
&lt;br /&gt;
Interne backups kunnen makkelijk teruggehaald worden. In het geval van een dataset is er in de root van deze dataset een onzichtbare map .zfs. In het geval van de home kan de staat van 20 november 2015 teruggevonden worden in `/srv/home/.zfs/snapshot/2015112000`. Dit kan alleen op haskell gedaan worden aangezien deze map niet bereikbaar is over NFS. Iets vergelijkbaars kan gedaan wordne met zvol's. Eerst moet echter de property snapdev op visible gezet worden in plaats van hidden en daarna zijn de snapshots van de zvols zichtbaar in `/dev`. Snapshots zijn read-only, dus als je een zvol probeert te mounten die dirty is, dan werkt dit niet als er ext4 op de zvol staat. Ext4 wil bij het recoveren namelijk schrijven, wat niet kan. In een dergelijke situatie kan het vaak handig zijn om een snapshot te klonen en dan te mounten. Met xfs is dit niet nodig.&lt;br /&gt;
&lt;br /&gt;
== Off-site backups ==&lt;br /&gt;
&lt;br /&gt;
We slaan de data ook off-site op bij de universiteit. Dit is een virtuele machine met de naam [[Claude|claude]]. Dit gebeurd vanaf max, aangezien daar een 1:1 kopie staat van de data en op deze manier wordt haskell ontlast. De backups worden vanaf [https://mediawiki.a-eskwadraat.nl/wiki/Claude claude] gepulled vanaf max en door max eerst ge-gzipped en ge-encrypt, zodat de universiteit niet bij onze data kan. Naar [https://mediawiki.a-eskwadraat.nl/wiki/Claude claude] wordt elke eerste dag van de maand een complete kopie gedumped en voor de rest van de maand worden incrementele dumps gemaakt.&lt;br /&gt;
&lt;br /&gt;
== Relevante scripts ==&lt;br /&gt;
&lt;br /&gt;
De volgende scripts en crons die te maken hebben met backups zijn allemaal in gebruik.&lt;br /&gt;
&lt;br /&gt;
*`/usr/local/bin/backupscript` op Haskell maakt elke 4 uur (door `/etc/cron.d/autobackup`) een snapshot en stuurt deze direct naar max.&lt;br /&gt;
*`/etc/cron.daily/cleansnapshots` draait op zowel Max als Haskell en ruimt elke dag oude snapshots op. Deze file is identiek op beide machines, dus aanpassingen moeten gesynced worden.&lt;br /&gt;
*`/usr/local/bin/pullbackups` op [https://mediawiki.a-eskwadraat.nl/wiki/Claude claude] pullt backups van Max en slaat deze op.&lt;br /&gt;
*`/usr/local/bin/cleanbackups`op [https://mediawiki.a-eskwadraat.nl/wiki/Claude claude] ruimt oude snapshots op als de ruimte (2TB) vol dreigt te raken. Vol is &amp;gt;90%. Dit is een cron die elke 5 minuten checkt. Mocht er iets fout gaan zoals dat er bij het opruimen niet tenminste 1 volledige backup altijd bewaard blijft, dan mailt deze dit. Het gebeurd nog wel eens dat de nfs share van de universiteit eruit knalt, en dan flipt dit script ook.&lt;br /&gt;
&lt;br /&gt;
== WebCie: snapshots van de database ==&lt;br /&gt;
&lt;br /&gt;
Op de vm-www maakt een script automatisch elke 10 minuten een dump van de database. Een diff met de vorige db-dump wordt opgeslagen in het archief (&amp;lt;code&amp;gt;haskell:/srv/www/archief&amp;lt;/code&amp;gt;): vanaf de [[vm-www]] beschikbaar op &amp;lt;code&amp;gt;/archief/www/2018-08/07/whoswho4.2018-08-07_13_00.diff&amp;lt;/code&amp;gt; bijvoorbeeld. Ook wordt elke dag een volledige db-dump opgeslagen. Elke maand worden de volledige dumps en alle diffs samen gecomprimeerd. De dumps kun je gebruiken om per ongeluk gewiste data weer terug te zetten.&lt;br /&gt;
&lt;br /&gt;
=== Backup van binaire logs ===&lt;br /&gt;
&lt;br /&gt;
Omdat het diffprogramma soms te lang deed over het backuppen omdat de diffs heeeeeeeeel lang werden, gaan we de binaire logs gebruiken voor backups.&lt;br /&gt;
&lt;br /&gt;
Als je in de mysql-configuratie de optie log-bin aanzet, zal mysql alle updates aan de databases opschrijven in een logbestand. Dit kun je gebruiken voor [[replicatie]], of voor backups. Elke 10 minuten worden de logs geflusht en alle nieuwe bestanden gekopieerd naar het www-archief. Vervolgens worden de oude logbestanden weggegooid (zodat we niet de volledige geschiedenis steeds opnieuw overnemen). PAS OP: als je replicatie doet en een andere server is offline terwijl de logs worden weggegooid, kan die niet zomaar meer up-to-date komen! Zodra je weer replicatie wilt aanzetten (zoals [[Webcie-vm#Mariadb_en_replicatie|als je een nieuwe VM wilt maken]], moet je dus een goede oplossing hiervoor verzinnen. (Misschien: houd bij welke logbestanden al gekopieerd zijn en sla die over?)&lt;br /&gt;
&lt;br /&gt;
* https://dev.mysql.com/doc/refman/8.0/en/backup-methods.html&lt;br /&gt;
* https://dev.mysql.com/doc/refman/8.0/en/binary-log.html&lt;br /&gt;
* https://dev.mysql.com/doc/refman/8.0/en/point-in-time-recovery.html&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]]&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases</id>
		<title>WebCie Databases</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/WebCie_Databases"/>
				<updated>2019-01-06T11:53:46Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Databasestructuur aanpassen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;De WebCie runt een paar databases waarin alle websitedata (dus ook ledendata, en transactiedata) staat. Op de [[vm-www]], [[vm-www-debug]] en de [[vm-www-inwerking]] draaien allemaal een databaseserver en dezelfde databasestructuur (modulo updatevolgorde).&lt;br /&gt;
&lt;br /&gt;
== Gebruik in de code ==&lt;br /&gt;
&lt;br /&gt;
De beste manier om kwerries op de databaas te doen is met [[QueryBuilder]]. Dit is een manier om volautomatisch SQL te genereren vanuit object-georienteerde code, zonder dat je bang hoeft te zijn voor injectie enzo.&lt;br /&gt;
&lt;br /&gt;
De belangrijkste database is &amp;lt;code&amp;gt;whoswho4&amp;lt;/code&amp;gt;, waar alle [[WhosWho4]]-objecten in staan. Dan zijn er nog &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; voor [[Benamite]] en &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt; voor [[Bookweb]].&lt;br /&gt;
&lt;br /&gt;
=== Hoe een db-connectie opgezet wordt ===&lt;br /&gt;
&lt;br /&gt;
In principe zouden dingen als databaseconnectie enzo al geregeld moeten zijn als je controllerfunctie aangeroepen wordt, maak hier dus alleen zorgen over als je ergens in [[space]] bezig bent.&lt;br /&gt;
&lt;br /&gt;
Eerst wordt door [[space]] het bestand [[secret.php]] geladen, waarin gebruikersnaam en wachtwoord voor alle databaseusers staan. Op basis van de functie &amp;lt;code&amp;gt;getLevel&amp;lt;/code&amp;gt; worden drie globalen &amp;lt;code&amp;gt;$WSW4DB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$BWDB&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;$BMDB&amp;lt;/code&amp;gt; gemaakt door middel van [https://doxygen-www.a-eskwadraat.nl/classdbpdo.html dbpdo]. Hun memberfunctie &amp;lt;code&amp;gt;q(...)&amp;lt;/code&amp;gt; verstuurt een kwerrie naar de desbetreffende databaas.&lt;br /&gt;
&lt;br /&gt;
Dit zorgt er ook voor dat inloggen en uitloggen (en eigenlijk alles wat de auth van de gebruiker aanpast) een refresh vereist voordat alles goed weergegeven kan worden!&lt;br /&gt;
&lt;br /&gt;
== Debugdatabase ==&lt;br /&gt;
&lt;br /&gt;
Op de [[vm-www-debug]] wordt elke nacht een kopietje gemaakt van de livedatabases om op te kunnen debuggen. Deze db's heten &amp;lt;code&amp;gt;test_$BLA&amp;lt;/code&amp;gt; waar &amp;lt;code&amp;gt;$BLA&amp;lt;/code&amp;gt; staat voor de naam van de originele database.&lt;br /&gt;
&lt;br /&gt;
Om precies te zijn, elke dag wordt &amp;lt;code&amp;gt;scripts/cron/copy_db_to_test_db.sh boeken whoswho4&amp;lt;/code&amp;gt; aangeroepen op de live-server (zolang bookweb nog wordt gebruikt met &amp;lt;code&amp;gt;boeken&amp;lt;/code&amp;gt;).&lt;br /&gt;
Elke maandag ochtend wordt de tabel &amp;lt;code&amp;gt;benamite&amp;lt;/code&amp;gt; gekopieerd naar de debug database.&lt;br /&gt;
Dit valt terug te vinden in de crontab onder &amp;lt;code&amp;gt;scripts/cron&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Nieuwe database aanmaken ==&lt;br /&gt;
&lt;br /&gt;
(De bedoeling is dat we het bij de huidige db's houden, maar misschien is er in de toekomst een goede reden!)&lt;br /&gt;
&lt;br /&gt;
Als je een nieuwe WebCie-database wilt aanmaken, moet je ook het [[Backup|backupscript]] aanpassen. Daarin staan namelijk alle databases die gebackupt worden. Vergeet ook niet verbindingen te openen met de nieuwe db in [[space]].&lt;br /&gt;
&lt;br /&gt;
== Databasestructuur aanpassen ==&lt;br /&gt;
&lt;br /&gt;
De databasestructuur wordt in de repository opgeslagen door middel van [http://alembic.zzzcomputing.com/en/latest/index.html Alembic]. Deze bewaart de geschiedenis in de vorm van een gerichte graaf van revisie, een soort git maar dan voor databasestructuur.&lt;br /&gt;
In tegenstelling tot git, begin je met de revisie een naam geven, en pas je daarna een bestand aan.&lt;br /&gt;
&lt;br /&gt;
=== Voorbeeld: een veld toevoegen aan een tabel ===&lt;br /&gt;
&lt;br /&gt;
Stel dat je in het Persoon-object een veld 'naamHuisdier' wilt toevoegen.&lt;br /&gt;
De makkelijkste manier is om [[Dia en generated code|de dia aan te passen]] en dan in je terminal uit te voeren: &amp;lt;code&amp;gt;manage revision 'veld naamHuisdier toevoegen in Persoon'&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dit zou volautomatisch een databaserevisie moeten maken en openen in je favoriete editor. ('''PRO-TIP''': opent niet je favoriete editor? Stel &amp;lt;code&amp;gt;$EDITOR&amp;lt;/code&amp;gt; in!)&lt;br /&gt;
Vervolgens kun je de migratie naar hartelust aanpassen.&lt;br /&gt;
&lt;br /&gt;
Ben je tevreden met de wijzigingen, dan sla je het bestand op,&lt;br /&gt;
en doe je op de command line &amp;lt;code&amp;gt;alembic upgrade head&amp;lt;/code&amp;gt;.&lt;br /&gt;
Dit past je wijzigingen toe op de debugdatabase.&lt;br /&gt;
Nu kun je de nieuwe databasestructuur gaan testen.&lt;br /&gt;
'''LET OP''': als je je revisie aan wil passen, doe eerst &amp;lt;code&amp;gt;alembic downgrade -1&amp;lt;/code&amp;gt; om die ongedaan te maken.&lt;br /&gt;
&lt;br /&gt;
Na verloop van tijd is je feature hopelijk naar de livesite gemerged.&lt;br /&gt;
Het livezetten gaat hetzelfde: doe op de [[vm-www]] weer &amp;lt;code&amp;gt;alembic upgrade head&amp;lt;/code&amp;gt;&lt;br /&gt;
en alle wijzigingen worden automatisch doorgevoerd.&lt;br /&gt;
Als je wijzigingen op de livesite doorgevoerd hebt, moet je de [[Databasestructuur committen]].&lt;br /&gt;
&lt;br /&gt;
==== Hetzelfde, maar dan handmatig ====&lt;br /&gt;
&lt;br /&gt;
In het handmatige geval doe je als eerste stap in de command line &amp;lt;code&amp;gt;alembic revision -m 'veld naamHuisdier toevoegen in Persoon'&amp;lt;/code&amp;gt;.&lt;br /&gt;
Alembic maakt dan een bestand aan in &amp;lt;code&amp;gt;alembic/versions/&amp;lt;/code&amp;gt; met een of andere naam.&lt;br /&gt;
Open dat bestand in je favoriete teksteditor ('''PRO-TIP''': stel &amp;lt;code&amp;gt;$EDITOR&amp;lt;/code&amp;gt; in en doe &amp;lt;code&amp;gt;alembic edit head&amp;lt;/code&amp;gt;).&lt;br /&gt;
Nu kun je in het bestand operaties gaan toevoegen, zodat je bestand er ongeveer uitziet als:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
# ... metadata voor Alembic&lt;br /&gt;
&lt;br /&gt;
from alembic import op&lt;br /&gt;
import sqlalchemy as sa&lt;br /&gt;
&lt;br /&gt;
def upgrade():&lt;br /&gt;
    op.add_column('Persoon', sa.Column('naamHuisdier', sa.String))&lt;br /&gt;
&lt;br /&gt;
def downgrade():&lt;br /&gt;
    op.drop_column('Persoon', 'naamHuisdier')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Het is belangrijk om upgrade en downgrade elkaars inverses te maken (op de structuur, want data kun je misschien wel kwijtraken),&lt;br /&gt;
zodat het schakelen tussen branches goedgaat.&lt;br /&gt;
&lt;br /&gt;
Het verdere verloop is net als bij automatische migraties.&lt;br /&gt;
&lt;br /&gt;
== In de database graven ==&lt;br /&gt;
&lt;br /&gt;
Wil je iets in de database doen dat niet kan met de site? Dan kun je op [https://pgadmin-debug.a-eskwadraat.nl] (of als je echt PHPMyAdmin nodig hebt [https://admin-debug.a-eskwadraat.nl]) (debugdb) en [https://admin.a-eskwadraat.nl] (livedb) inloggen op localhost met gebruikersnaam root en het databasewachtwoord. Dit wachtwoord vind je in het bestand &amp;lt;code&amp;gt;.my.cnf&amp;lt;/code&amp;gt; in de homedir van gebruiker &amp;lt;code&amp;gt;webcie&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Migratie naar PostgreSQL ==&lt;br /&gt;
&lt;br /&gt;
MySQL is stiekem best wel slecht, dus we willen graag in plaats daarvan PostgreSQL gebruiken. De migratie gaat ongeveer als volgt.&lt;br /&gt;
&lt;br /&gt;
SSH naar de VM waar de oorspronkelijke database opstaat. Dan doe je ongeveer de volgende stappen (dit is voor de vm-www-debug).&lt;br /&gt;
Eerst installeren we Postgres:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
rpm -Uvh pgdg-centos96-9.6-3.noarch.rpm&lt;br /&gt;
sudo yum update                                                                &lt;br /&gt;
sudo yum install postgresql96-server postgresql96-contrib                      &lt;br /&gt;
sudo service postgresql-9.6 initdb                                             &lt;br /&gt;
sudo service postgresql-9.6 start                                              &lt;br /&gt;
sudo chkconfig postgresql-9.6 on                                               &lt;br /&gt;
sudo -i                                                                        &lt;br /&gt;
su postgres                                                                    &lt;br /&gt;
psql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doe nu &amp;lt;code&amp;gt;CREATE USER&amp;lt;/code&amp;gt; voor alle users in je [[secret.php]].&lt;br /&gt;
&lt;br /&gt;
Dan zijn we klaar om de koppeling met PHP te maken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install php-pgsql                                                        &lt;br /&gt;
sudo service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
                                                        &lt;br /&gt;
Pas &amp;lt;code&amp;gt;/var/lib/pgsql/9.6/data/pg_hba.conf&amp;lt;/code&amp;gt; aan zodat je auth method md5 gebruikt.&lt;br /&gt;
(De bestanden &amp;lt;code&amp;gt;/usr/pgsql/*&amp;lt;/code&amp;gt; slaan nergens op, negeer deze.)                                                &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo service postgresql-9.6 restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;  &lt;br /&gt;
                                             &lt;br /&gt;
Je zou nu moeten kunnen inloggen met &amp;lt;code&amp;gt;psql --user $BLA -d postgres&amp;lt;/code&amp;gt;              &lt;br /&gt;
en ook op adminer (maar let op dat je een database kiest die bestaat).             &lt;br /&gt;
&lt;br /&gt;
=== Data migreren ===                                                                                  &lt;br /&gt;
Ruim eerst je DB een beetje op!                                                   &lt;br /&gt;
(oftewel zorg dat je foreign keys kloppen, dat er geen datums zijn met jaar 0000, maand 00 of dag 00 enzo)&lt;br /&gt;
&lt;br /&gt;
Dit is een volledige migratie, inclusief dbstructuur. Gebruik andere opties voor &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; om alleen data te verhuizen.&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
mysqldump --compatible=postgresql --user=root --password --default-character-set=utf8 test_whoswho4 &amp;gt; export.sql&lt;br /&gt;
python2.7 docs/db_converter.py export.sql pg-export.sql                    &lt;br /&gt;
psql -d test_whoswho4 -U root -f pg-export.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PRO-TIP: pas de relaties eerst handmatig aan, want die zijn niet echt goed over te zetten.&lt;br /&gt;
&lt;br /&gt;
Vervolgens moeten we handmatig alle tabellen die in MySQL een autoincrement hadden, maar waar die kolom niet &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; heet, in PostgreSQL een sequencenummer geven. Dat ziet er ongeveer zo uit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE SEQUENCE IOUBon_bonID_seq;&lt;br /&gt;
SELECT setval('IOUBon_bonID_seq', max(&amp;quot;bonID&amp;quot;)) FROM &amp;quot;IOUBon&amp;quot;;&lt;br /&gt;
ALTER TABLE &amp;quot;IOUBon&amp;quot; ALTER COLUMN &amp;quot;bonID&amp;quot; SET DEFAULT nextval('IOUBon_bonID_seq');&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Heb je dat allemaal gedaan, dan moet je ook voor alle databaseusers rechten geven:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO god;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO ingelogd;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO dibstablet;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO mollie;&lt;br /&gt;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO gast;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we ook nog de rechten overnemen. In MySQL doe je &amp;lt;code&amp;gt;SHOW GRANTS FOR '$USER'@'localhost'&amp;lt;/code&amp;gt; voor alle users in de db-wachtwoorden, pas de output hiervan aan tot PostgreSQL-syntax en voer die uit. (Dit is een hoop werk!)&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies</id>
		<title>PHP-extensies</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies"/>
				<updated>2018-12-12T19:26:19Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PHP-extensies kun je ook in composer.json configureren!&lt;br /&gt;
&lt;br /&gt;
De volgende extensies stonden op 2018-12-12 aan op de vm-www2:&lt;br /&gt;
&lt;br /&gt;
* php-json&lt;br /&gt;
* php-pecl-mcrypt&lt;br /&gt;
* php-bcmath&lt;br /&gt;
* php-cli&lt;br /&gt;
* php-fpm&lt;br /&gt;
* php-gd&lt;br /&gt;
* php-imap&lt;br /&gt;
* php-ldap&lt;br /&gt;
* php-mbstring&lt;br /&gt;
* php-mysqlnd&lt;br /&gt;
* php-pdo&lt;br /&gt;
* php-pecl-apcu&lt;br /&gt;
* php-pecl-zip&lt;br /&gt;
* php-process&lt;br /&gt;
* php-tidy&lt;br /&gt;
* php-xml   &lt;br /&gt;
&lt;br /&gt;
== APCU ==&lt;br /&gt;
&lt;br /&gt;
Iets met caching.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-pecl-apcu&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-dom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMAP ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de IMAP extensie voor functies als &amp;lt;code&amp;gt;imap_mime_header_decode&amp;lt;/code&amp;gt; binnen het &amp;lt;code&amp;gt;mail_process_bug.2&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
Om het te installeren moet je eerst &amp;lt;code&amp;gt;sudo yum install php-imap&amp;lt;/code&amp;gt; draaien op een CentOS systeem. Daarna, moet je apache herstarten: &amp;lt;code&amp;gt;sudo service httpd restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LDAP ==&lt;br /&gt;
&lt;br /&gt;
Voor het SysteemAPI: &amp;lt;code&amp;gt;yum install php-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MB ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-mbstring&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MCrypt ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-mcrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PDO ==&lt;br /&gt;
&lt;br /&gt;
Een OO'e manier om Databases in PHP te krijgen. We hebben ook de mysql-specifieke drivers nodig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-pdo php-mysql&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XDebug ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de extensie XDebug voor code coverage. Deze is alleen op &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; geïnstalleerd omdat het renderen best wel traag maakt.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm</id>
		<title>Webcie-vm</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webcie-vm"/>
				<updated>2018-10-05T19:34:14Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Installeer Apache, PHP en PHP-FPM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Zie ook: [[Webcie-vms]] (!)&lt;br /&gt;
&lt;br /&gt;
== Nieuwe vm-webcie-debug&amp;amp;nbsp;aanmaken ==&lt;br /&gt;
&lt;br /&gt;
Maak een nieuwe vm vm-webcie-debug aan. Kickstart de vm en highstate de vm met salt. Installeer mariadb met het volgende commando:&lt;br /&gt;
&amp;lt;pre&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet het rootwachtwoord en disalow root login remotely. Let op: de rootwachtwoorden van de databases van de vm-webcie/www en vm-webcie/www-debug moeten hetzelfde zijn!&lt;br /&gt;
&lt;br /&gt;
Maak in de home van de root het bestandje .my.cnf aan (zet de rechten op 0600!) met de volgende content:&lt;br /&gt;
&amp;lt;pre&amp;gt;[client]&lt;br /&gt;
user = root&lt;br /&gt;
pass = root-database-wachtwoord&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak ook de juiste databases aan (bv test_whoswho4, test_benamite of boeken. Denk eraan dat op een vm-webcie/www-machine er zowel de normal db als test_db moeten zijn). Kopieër nu de databases. Vergeet ook niet de mysql-database te kopieëren, daar staan de rechten van de verschillende gebruikers in.&amp;amp;nbsp;Maak eerst een dump op de oude vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysqldump 'dbnaam' &amp;gt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kopieër het dumpbestand naar de nieuwe vm en laad de dump in op de nieuwe vm:&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql 'dbnaam' &amp;lt; 'dbnaam'.db&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Opzetten vm-www2 ==&lt;br /&gt;
&lt;br /&gt;
Deze instructies zijn bedoeld voor de WebCie. We gaan ervan uit dat je het WebCie-wachtwoord uit je hoofd kent.&lt;br /&gt;
&lt;br /&gt;
Vraag de Sysop om een nieuwe vm (ik bedoel uiteraard container ;)) met subdomein (in dit geval: vm-www2.a-eskwadraat.nl) en dezelfde mounts als de originele vm. Zorg ervoor dat sendmail vanaf de nieuwe vm werkt. Verkrijg roottoegang op de vm-www2.&lt;br /&gt;
&lt;br /&gt;
In het begin heeft yum nog een update voor repositorygegevens nodig: doe &amp;lt;code&amp;gt;yum clean all&amp;lt;/code&amp;gt; voordat je een ander yum-commando draait.&lt;br /&gt;
&lt;br /&gt;
=== Mariadb en replicatie ===&lt;br /&gt;
&lt;br /&gt;
Installeer mariadb als op de vm-www-debug: &amp;lt;code&amp;gt;yum install mariadb mariadb-server&amp;lt;/code&amp;gt; (let op: ivm backwards incompatibility willen we versie 5.5 voorlopig), &amp;lt;code&amp;gt;systemctl enable mariadb&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;systemctl start mariadb&amp;lt;/code&amp;gt; en dan &amp;lt;code&amp;gt;/usr/bin/mysql_secure_installation&amp;lt;/code&amp;gt;. Check even of inloggen nog werkt: &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt;. Check ook dat je verbinding kan maken met mysql op de originele host vanaf de nieuwe host: &amp;lt;code&amp;gt;mysql -h vm-www -u root -p&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we [https://mariadb.com/kb/en/library/replication-overview/ replicatie] opzetten (master-master). We moeten hiervoor een random wachtwoord genereren, bewaar die goed! Open in een nieuwe terminal op de originele host, en pas de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=1&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mysqld/mariadb om de wijzigingen toe te passen. Log in als root op mysql en geef permissies: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www2.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Zet de tabellen op slot terwijl we de rest doen: &amp;lt;code&amp;gt;flush tables with read lock;&amp;lt;/code&amp;gt;. Ten slotte moeten we wat gegevens bekomen: &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt;. Log niet uit tot we klaar zijn, dan gaan de tabellen weer van het slot af.&lt;br /&gt;
&lt;br /&gt;
In de andere terminal op &amp;lt;code&amp;gt;vm-www2&amp;lt;/code&amp;gt; gaan we ook de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aanpassen (ik heb de wijzigingen in &amp;lt;code&amp;gt;/etc/my.cnf.d/webcie.cnf&amp;lt;/code&amp;gt; gezet):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
&lt;br /&gt;
server-id=2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Herstart mariadb om de wijzigingen toe te passen. We moeten ook de volledige(!!!) [https://stackoverflow.com/questions/1078196/how-to-take-complete-backup-of-mysql-database-using-mysqldump-command-line-utili#27400627 databaasinhoud overzetten]. (Dit is een van de redenen dat je een read lock hebt.) Doe een mysqldump van de gehele database inclusief tabellen, permissies en inhoud en pas die toe op de nieuwe db.&lt;br /&gt;
&lt;br /&gt;
Log in op de nieuwe db met &amp;lt;code&amp;gt;mysql -u root -p&amp;lt;/code&amp;gt; en stel replicatie in:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(De juiste waarden haal je uit de uitvoer van &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; op de originele host.) Vervolgens &amp;lt;code&amp;gt;START SLAVE; SHOW SLAVE STATUS \G&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Als de uitvoer een beetje sense maakt, dan heb je succesvol een master-slave replicatie van de oude naar de nieuwe host opgezet. Doe &amp;lt;code&amp;gt;UNLOCK TABLES;&amp;lt;/code&amp;gt; op de originele host en probeer wat aan te passen. Dit zou op de nieuwe host terecht moeten komen.&lt;br /&gt;
&lt;br /&gt;
Als een error bij de slave gebeurd is die niet op master voorkwam, gaat die blokkeren tot je het fixt. Wat je kan doen als het echt helemaal in de soep loopt, is opnieuw alles op slot gooien, een dbdump overnemen van master naar slave. Doe weer &amp;lt;code&amp;gt; show master status\G&amp;lt;/code&amp;gt; en unlock de master. Vervolgens doe je op de slave &amp;lt;code&amp;gt;change master to MASTER_LOG_POS=37071; START SLAVE;&amp;lt;/code&amp;gt; en dan zou die automatisch alles wat sinds de backup is gebeurd, weer naar binnen gaan slurpen.&lt;br /&gt;
&lt;br /&gt;
Nu gaan we de replicatie de andere kant op sturen. Dit is in principe het precies omgekeerde van wat we hiervoor deden. Pas op vm-www2 de &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt; aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mysqld]&lt;br /&gt;
server-id=2&lt;br /&gt;
log-bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en herstart mariadb. Voeg de repli-user toe op de vm-www2: &amp;lt;code&amp;gt;grant replication slave on *.* to repli@'vm-www.a-eskwadraat.nl' identified by 'replipassword'; flush privileges;&amp;lt;/code&amp;gt;. Doe op allebei de hosts een table lock, doe op de nieuwe host &amp;lt;code&amp;gt;show master status\G&amp;lt;/code&amp;gt; en op de originele host de replicatie-instellingen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHANGE MASTER TO&lt;br /&gt;
  MASTER_HOST='master.domain.com',&lt;br /&gt;
  MASTER_USER='replication_user',&lt;br /&gt;
  MASTER_PASSWORD='bigs3cret',&lt;br /&gt;
  MASTER_PORT=3306,&lt;br /&gt;
  MASTER_LOG_FILE='mariadb-bin.000096',&lt;br /&gt;
  MASTER_LOG_POS=568,&lt;br /&gt;
  MASTER_CONNECT_RETRY=10;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En nu kun je op de originele host &amp;lt;code&amp;gt;start slave;&amp;lt;/code&amp;gt; runnen, en je hebt een master-masterreplicatie :D&lt;br /&gt;
&lt;br /&gt;
=== Installeer Apache, PHP en PHP-FPM ===&lt;br /&gt;
&lt;br /&gt;
Doe &amp;lt;code&amp;gt;yum install httpd&amp;lt;/code&amp;gt; voor Apache.&lt;br /&gt;
Voor een niet verschrikkelijk antieke PHP moet je extra dingen installeren (zie ook [https://rpms.remirepo.net/wizard/]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install epel-release&lt;br /&gt;
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm&lt;br /&gt;
yum install yum-utils&lt;br /&gt;
yum-config-manager --enable remi-php56 # of php72 of andere versie&lt;br /&gt;
yum install php php-fpm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Installeer ook alle [[PHP-extensies]] die nodig zijn. (Zie die pagina voor de lijst.)&lt;br /&gt;
&lt;br /&gt;
Overige dependencies:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install gettext java npm python36 python36-virtualenv&lt;br /&gt;
npm install -g bower&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moeten we PHP-instellingen regelen. Maak een checkout van de website, en doe daarin:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir config/vm-www2&lt;br /&gt;
ln -s /etc/php.ini config/vm-www2/&lt;br /&gt;
vim config/vm-www2/php.ini # Pas hier alle relevante config van de vm-www toe.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cron instellen ===&lt;br /&gt;
&lt;br /&gt;
Maak een map &amp;lt;code&amp;gt;/website-output&amp;lt;/code&amp;gt; aan en chown die naar &amp;lt;code&amp;gt;apache:apache&amp;lt;/code&amp;gt; (en zorg ervoor dat apache ernaar kan schrijven :P). Hierin komt alle output van cronjobs enzo.&lt;br /&gt;
&lt;br /&gt;
Je kan in principe de crontab van de oude vm overnemen, dus ga naar de checkout, en doe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp scripts/cron/crontab-$VMOUD-apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
crontab -u apache scripts/cron/crontab-$VMNIEUW-apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
om de cronjobs te activeren.&lt;br /&gt;
&lt;br /&gt;
=== Mail werkend krijgen ===&lt;br /&gt;
&lt;br /&gt;
De website gebruikt sendmail-commando's om te mailen. Normaal stuurt sendmail de mails direct het web op, maar we willen dat deze door de vm-mailpp heen gestuurd wordt zodat de berichten juist zijn ondertekend en door spamfilters heen komen. Hiervoor gebruiken we het sendmail-commando dat uit postfix komt. Installeer postfix met:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install postfix&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De configuratie van postfix ongeveer dezelfde als op alle CentOS7 machines en is te vinden op de vm-salt-master in &amp;lt;code&amp;gt;/srv/salt/centos7/global/main.cf&amp;lt;/code&amp;gt;. Je moet de volgende parameters aanpassen zodat mail naar buiten mag:&lt;br /&gt;
&amp;lt;pre&amp;gt;mydomain = a-eskwadraat.nl&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om mailings te configureren, voeg de volgende parameters toe aan &amp;lt;code&amp;gt;main.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
inet_interfaces = all&lt;br /&gt;
relay_domains = a-eskwadraat.nl&lt;br /&gt;
smtpd_recipient_restrictions = check_recipient_access regexp:/etc/postfix/access, reject_unauth_destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
En voeg de volgende regels toe aan &amp;lt;code&amp;gt;/etc/postfix/master.cf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bughook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bug_vm-www ${sender} ${size} ${recipient}&lt;br /&gt;
lidhook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_lid ${sender} ${size} ${recipient}&lt;br /&gt;
bouncehook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_bounce ${sender} ${size} ${recipient}&lt;br /&gt;
mailinghook unix - n n - - pipe&lt;br /&gt;
    flags=F user=webcie argv=/website/scripts/mail_process_incoming_mailing.php ${sender} ${size} $$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
En plaats de volgende regels in &amp;lt;code&amp;gt;/etc/postfix/access&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/^lid-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER lidhook:&lt;br /&gt;
/^bug(([0-9]+)|(s))@a-es((kwadraat)|(2))\.nl$/ FILTER bughook:&lt;br /&gt;
/^bounce-[0-9]+@a-es((kwadraat)|(2))\.nl$/ FILTER bouncehook:&lt;br /&gt;
/^((.*-)|)mailing((s)|)@a-es((kwadraat)|(2))\.nl$/ FILTER mailinghook:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Stel nu in dat het sendmail-commando uit postfix gebruikt wordt in plaats van de standaard sendmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;update-alternatives --config mta&amp;lt;/pre&amp;gt;&lt;br /&gt;
En start dan de postfix service met &amp;lt;code&amp;gt;service postfix start&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zo worden de mails doorgestuurd naar de juiste scriptjes van de WebCie. Zie [[Mail sturen naar de site]]&lt;br /&gt;
&lt;br /&gt;
=== IPA ===&lt;br /&gt;
yum install ipa-client&lt;br /&gt;
&lt;br /&gt;
Het volgende moet de sysop regelen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-client-install &lt;br /&gt;
ipa host-add dummyhost.example.com --desc=&amp;quot;Dummy Host&amp;quot; --location=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa host-add-managedby dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
ipa service-add HTTP/dummyhost.example.com&lt;br /&gt;
ipa service-add-host HTTP/dummyhost.example.com --hosts=&amp;quot;&amp;lt;fqdn-of-webserver&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ga naar de ipa webinterface &lt;br /&gt;
Ga naar de tab hosts &lt;br /&gt;
Ga naar de juiste host&lt;br /&gt;
klik op actions -&amp;gt; add New certificate &lt;br /&gt;
&lt;br /&gt;
Voer nu de volgende commands uit in de commandline:&lt;br /&gt;
mkdir /etc/nssdb&lt;br /&gt;
cd /etc/nssdb&lt;br /&gt;
certutil -N -d . &lt;br /&gt;
&lt;br /&gt;
mkdir /etc/httpd/certs&lt;br /&gt;
ipa-getcert request -r -f /etc/httpd/certs/dummyhost.crt -k /etc/httpd/certs/dummyhost.key -N CN=dummyhost.example.com -D \&lt;br /&gt;
  dummyhost.example.com -K HTTP/dummyhost.example.com&lt;br /&gt;
ipa-getkeytab -s ipa05.a-eskwadraat.nl -p HTTP/*hostname*.a-eskwadraat.nl -k /etc/httpd/conf/httpd.keytab #nog testen of nodig is&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overige tsjak ter installatie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install git sudo vim wget&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== De website opzetten ===&lt;br /&gt;
&lt;br /&gt;
Heb je alles geïnstalleerd, dan ben je klaar voor de laatste fase.&lt;br /&gt;
&lt;br /&gt;
Vertel de scripts dat dit een host is: &amp;lt;code&amp;gt;vim /etc/function&amp;lt;/code&amp;gt; en stop daarin &amp;lt;code&amp;gt;server&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Ga naar de checkout van de website, kopieer handmatig de secret.php en doe daarin manage build. (Dit moet na de php-instellingen gebeuren want manage voert php uit.)&lt;br /&gt;
&lt;br /&gt;
Pas de httpd-configuratie aan om de juiste paden in te stellen:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp config/vm-www/httpd/conf.d/website.conf /etc/httpd/conf.d/&lt;br /&gt;
ln -s /etc/httpd config/vm-www2/httpd&lt;br /&gt;
vim config/vm-www2/httpd/conf.d/website.conf &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu kun je de webserver aanzwengelen :D &amp;lt;code&amp;gt;systemctl restart httpd&amp;lt;code&amp;gt; &amp;lt;code&amp;gt;systemctl restart php-fpm&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je moet waarschijnlijk nog wat chmod'en en paden aanmaken, zie daarvoor de logs in &amp;lt;code&amp;gt;/var/log/httpd/error_log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/php-fpm/error.log&amp;lt;/code&amp;gt; en &amp;lt;code&amp;gt;/var/log/www/php-warnings.log&amp;lt;/code&amp;gt; (in volgorde van dingen werkend krijgen).&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]] [[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2018-10-05T18:38:24Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: /* Webcie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== Webcie ==&lt;br /&gt;
&lt;br /&gt;
Ga naar de [[vm-www-debug]] en log in als user webcie:&lt;br /&gt;
 ssh vm-www-debug&lt;br /&gt;
 sudo -i -u webcie&lt;br /&gt;
&lt;br /&gt;
Toevoegen aan de htpasswd:&lt;br /&gt;
 htpasswd /srv/htpasswd $USER&lt;br /&gt;
Toevoegen aan de htgroups&lt;br /&gt;
 vim /srv/config/vm-www-debug/httpd/conf.d/htgroups&lt;br /&gt;
 vim /srv/config/vm-www/httpd/conf.d/htgroups&lt;br /&gt;
Toevoegen aan de wwwdebug.conf&lt;br /&gt;
 cd /srv/http/www/git&lt;br /&gt;
 vim webcie_leden.sh&lt;br /&gt;
Voeg toe aan dit bestand de lidnaam, debugnaam, en het pad waar de debugomgeving terechtkomt. Weet je niet wat hier moet staan? Doe dan &amp;lt;code&amp;gt;$USER $bla /mnt/wwwdebug2&amp;lt;/code&amp;gt;.&lt;br /&gt;
 ./webcie_leden.sh&lt;br /&gt;
 git add -p&lt;br /&gt;
 git commit&lt;br /&gt;
 git push&lt;br /&gt;
 sudo service httpd restart&lt;br /&gt;
Toevoegen aan de git repo&lt;br /&gt;
 Vraag aan een momenteel webcie lid om dit te doen&lt;br /&gt;
&lt;br /&gt;
== Nieuw lid ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je de code van de website binnenhalen en je eigen debugomgeving aanmaken. Dit doe je door de volgende commando's in een terminal te draaien:&lt;br /&gt;
&lt;br /&gt;
(Weet je niet hoe je een 'terminal' moet openen? Vraag een medewebcieër!)&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug2&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 git clone https://gitlab.com/iba-aes/webcie/website.git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=DEBUGNAAM-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug2/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
(Hier moet je &amp;lt;code&amp;gt;DEBUGNAAM&amp;lt;/code&amp;gt; vervangen met de naam van je debugomgeving, bijvoorbeeld 'pepernoot' of 'comint'.)&lt;br /&gt;
&lt;br /&gt;
Dit zorgt ervoor dat de code die in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt; staat wordt uitgevoerd wanneer je naar &amp;lt;code&amp;gt;DEBUGNAAM-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt; gaat in je browser.&lt;br /&gt;
&lt;br /&gt;
=== Je eerste commit doen ===&lt;br /&gt;
&lt;br /&gt;
In de root van je website (dat is de map ~/wwwdebug/www/ dus doe als je daar nog niet in zit &amp;lt;code&amp;gt;cd ~/wwwdebug/www/&amp;lt;/code&amp;gt;) staat de map space/auth/ met daarin het bestand init.php. Voeg jezelf hier toe bij de $GODNRS. Om dit bestand vervolgens te committen doe je&lt;br /&gt;
 git commit space/auth/init.php&lt;br /&gt;
Vervolgens moet je het bestand pushen zodat de rest van de webcieërs het binnen kunnen halen&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid</id>
		<title>Nieuw WWW-lid</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Nieuw_WWW-lid"/>
				<updated>2018-10-05T18:37:08Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wat je moet doen voor een nieuw lid van de [[WebCie|www]]:&lt;br /&gt;
&lt;br /&gt;
== Bestuur ==&lt;br /&gt;
&lt;br /&gt;
#Toevoegen aan 'webcie' (inloggen op de server en bij de repo)&lt;br /&gt;
&lt;br /&gt;
== Webcie ==&lt;br /&gt;
&lt;br /&gt;
Ga naar de [[vm-www-debug]] en log in als user webcie:&lt;br /&gt;
 ssh vm-www-debug&lt;br /&gt;
 sudo -i -u webcie&lt;br /&gt;
&lt;br /&gt;
Toevoegen aan de htpasswd:&lt;br /&gt;
 htpasswd /srv/htpasswd $USER&lt;br /&gt;
Toevoegen aan de htgroups&lt;br /&gt;
 vim /srv/config/vm-www-debug/httpd/conf.d/htgroups&lt;br /&gt;
 vim /srv/config/vm-www/httpd/conf.d/htgroups&lt;br /&gt;
Toevoegen aan de wwwdebug.conf&lt;br /&gt;
 cd /srv/http/www/git&lt;br /&gt;
 vim webcie_leden.sh&lt;br /&gt;
Zet in dit bestand de lidnaam, debugnaam, en het pad waar de debugomgeving terechtkomt. Weet je niet wat hier moet staan? Doe dan &amp;lt;code&amp;gt;$USER $bla /mnt/wwwdebug2&amp;lt;/code&amp;gt;.&lt;br /&gt;
 ./webcie_leden.sh&lt;br /&gt;
 git add -p&lt;br /&gt;
 git commit&lt;br /&gt;
 git push&lt;br /&gt;
 sudo service httpd restart&lt;br /&gt;
Toevoegen aan de git repo&lt;br /&gt;
 Vraag aan een momenteel webcie lid om dit te doen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Nieuw lid ==&lt;br /&gt;
&lt;br /&gt;
Als eerste ga je de code van de website binnenhalen en je eigen debugomgeving aanmaken. Dit doe je door de volgende commando's in een terminal te draaien:&lt;br /&gt;
&lt;br /&gt;
(Weet je niet hoe je een 'terminal' moet openen? Vraag een medewebcieër!)&lt;br /&gt;
&lt;br /&gt;
 cd /mnt/wwwdebug2&lt;br /&gt;
 mkdir $USER/&lt;br /&gt;
 cd $USER&lt;br /&gt;
 git clone https://gitlab.com/iba-aes/webcie/website.git wwwdebug&lt;br /&gt;
 cd wwwdebug/www&lt;br /&gt;
 ./manage build --enable-debug --hostname=DEBUGNAAM-debug.a-eskwadraat.nl&lt;br /&gt;
 ln -s /mnt/wwwdebug2/$USER/wwwdebug/ ~/wwwdebug&lt;br /&gt;
&lt;br /&gt;
(Hier moet je &amp;lt;code&amp;gt;DEBUGNAAM&amp;lt;/code&amp;gt; vervangen met de naam van je debugomgeving, bijvoorbeeld 'pepernoot' of 'comint'.)&lt;br /&gt;
&lt;br /&gt;
Dit zorgt ervoor dat de code die in de map &amp;lt;code&amp;gt;~/wwwdebug&amp;lt;/code&amp;gt; staat wordt uitgevoerd wanneer je naar &amp;lt;code&amp;gt;DEBUGNAAM-debug.a-eskwadraat.nl&amp;lt;/code&amp;gt; gaat in je browser.&lt;br /&gt;
&lt;br /&gt;
=== Je eerste commit doen ===&lt;br /&gt;
&lt;br /&gt;
In de root van je website (dat is de map ~/wwwdebug/www/ dus doe als je daar nog niet in zit &amp;lt;code&amp;gt;cd ~/wwwdebug/www/&amp;lt;/code&amp;gt;) staat de map space/auth/ met daarin het bestand init.php. Voeg jezelf hier toe bij de $GODNRS. Om dit bestand vervolgens te committen doe je&lt;br /&gt;
 git commit space/auth/init.php&lt;br /&gt;
Vervolgens moet je het bestand pushen zodat de rest van de webcieërs het binnen kunnen halen&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Mail_sturen_naar_de_site</id>
		<title>Mail sturen naar de site</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Mail_sturen_naar_de_site"/>
				<updated>2018-10-01T09:02:04Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Mailen naar de site werkt ongeveer zo: de [[Sysop]] zorgt ervoor op [[Ernst]] dat de juiste e-mailadressen@a-eskwadraat.nl naar de [[WebCie VM]] geleid worden, en dan zal op de VM de MTA (dit is postfix of exim ofzo) het juiste script aanroepen, zoals &amp;lt;code&amp;gt;scripts/mail_process_bug_vm-www&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Mail naar de site testen ==&lt;br /&gt;
&lt;br /&gt;
Stel dat je een scriptje wil testen dat reageert op mails, zoals &amp;lt;code&amp;gt;mail_process_bug_vm-www&amp;lt;/code&amp;gt;. Dan heb je het scriptje &amp;lt;code&amp;gt;schrijf_test_mail.php&amp;lt;/code&amp;gt; dat je helpt om een voorbeeldmail te genereren. Bijvoorbeeld:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh vm-www-debug&lt;br /&gt;
$ cd wwwdebug/scripts&lt;br /&gt;
$ ./schrijf_test_mail.php | ./mail_process_bug_vm-www &lt;br /&gt;
From? timb@a-es2.nl&lt;br /&gt;
To? bug7132@a-eskwadraat.nl&lt;br /&gt;
Subject? UTF-8 testing&lt;br /&gt;
Body? (Ctrl-D om te stoppen)&lt;br /&gt;
Hoi ik ben een test ☺&lt;br /&gt;
Jammer genoeg gaat UTF-8 stuk ☹&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;br /&gt;
[[Category:HowTo]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies</id>
		<title>PHP-extensies</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/PHP-extensies"/>
				<updated>2018-09-20T17:25:35Z</updated>
		
		<summary type="html">&lt;p&gt;Timb: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;PHP-extensies kun je ook in composer.json configureren!&lt;br /&gt;
&lt;br /&gt;
== APCU ==&lt;br /&gt;
&lt;br /&gt;
Iets met caching.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-pecl-apcu&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DOM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-dom&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IMAP ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de IMAP extensie voor functies als &amp;lt;code&amp;gt;imap_mime_header_decode&amp;lt;/code&amp;gt; binnen het &amp;lt;code&amp;gt;mail_process_bug.2&amp;lt;/code&amp;gt; script.&lt;br /&gt;
&lt;br /&gt;
Om het te installeren moet je eerst &amp;lt;code&amp;gt;sudo yum install php-imap&amp;lt;/code&amp;gt; draaien op een CentOS systeem. Daarna, moet je apache herstarten: &amp;lt;code&amp;gt;sudo service httpd restart&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LDAP ==&lt;br /&gt;
&lt;br /&gt;
Voor het SysteemAPI: &amp;lt;code&amp;gt;yum install php-ldap&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MB ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-mbstring&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MCrypt ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-mcrypt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PDO ==&lt;br /&gt;
&lt;br /&gt;
Een OO'e manier om Databases in PHP te krijgen. We hebben ook de mysql-specifieke drivers nodig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;yum install php-pdo php-mysql&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XDebug ==&lt;br /&gt;
&lt;br /&gt;
We gebruiken de extensie XDebug voor code coverage. Deze is alleen op &amp;lt;code&amp;gt;vm-www-debug&amp;lt;/code&amp;gt; geïnstalleerd omdat het renderen best wel traag maakt.&lt;br /&gt;
&lt;br /&gt;
[[Category:WebCie]]&lt;/div&gt;</summary>
		<author><name>Timb</name></author>	</entry>

	</feed>