<?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=Johand</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=Johand"/>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Special:Contributions/Johand"/>
		<updated>2026-08-10T11:20:54Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.2</generator>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webdav</id>
		<title>Webdav</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webdav"/>
				<updated>2015-12-30T19:40:45Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:WebDav}}&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/WebDAV WebDav] is een protocol bovenop HTTP waarmee je bestanden kunt ophalen en aanpassen op afstand en is daarmee in functionaliteit vergelijkbaar met bijvoorbeeld [https://en.wikipedia.org/wiki/File_Transfer_Protocol FTP]. Het voordeel van [https://en.wikipedia.org/wiki/WebDAV WebDav] over [https://en.wikipedia.org/wiki/File_Transfer_Protocol FTP] is, is dat [https://en.wikipedia.org/wiki/WebDAV WebDav] makkelijk SSL ondersteunt. Er is geen standaard variant van FTP over SSL die goed is ondersteund. WebDav + ssl wordt in de windows explorer gewoon standaard ondersteund, terwijl dit voor beveiligde FTP niet het geval is. Dit maakt het makkelijk om bij bestanden van A-Eskwadraat te komen, terwijl het nog wel veilig is.&lt;br /&gt;
&lt;br /&gt;
== Implementatie ==&lt;br /&gt;
&lt;br /&gt;
Standaard WebDav implementaties zoals mod_webdav van apache zijn niet flexibel te integreren met home directories, in tegenstelling tot FTP. Daarom draaien we een gepatchte versie van SabreDav die runtime de UID van het php proces aanpast, zodat deze hetzelfde is als de user die inlogt. Het inloggen wordt gedaan via mod_authnz_pam, en is daardoor een beetje traag, ook al wordt lokaal een hoop aan credential caching gedaan en hangt de vm-webdav niet aan ipa, maar direct met ldap en caching via ns(l)cd. Een constructie die niet wordt aangeraden, maar wel acceptabel werkt. De relevante code is terug te vinden is Salt. Het meest relevante is de custom authenticatie backend waar de setuid e.d. gebeurd.&lt;br /&gt;
Het kan zijn dat na een update van SabreDAV bestanden aangepast, geherpatched moeten worden.&lt;br /&gt;
&lt;br /&gt;
== Handleiding ==&lt;br /&gt;
Een handleiding voor het gebruik van WebDav is [https://home.a-eskwadraat.nl/~sysop/handleidingen/webdav.pdf hier] te vinden.&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webdav</id>
		<title>Webdav</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Webdav"/>
				<updated>2015-12-30T18:09:03Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: Created page with &amp;quot;[https://en.wikipedia.org/wiki/WebDAV WebDav] is een protocol bovenop HTTP waarmee je bestanden kunt ophalen en aanpassen op afstand en is daarmee in functionaliteit vergelijk...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[https://en.wikipedia.org/wiki/WebDAV WebDav] is een protocol bovenop HTTP waarmee je bestanden kunt ophalen en aanpassen op afstand en is daarmee in functionaliteit vergelijkbaar met bijvoorbeeld [https://en.wikipedia.org/wiki/File_Transfer_Protocol FTP]. Het voordeel van [https://en.wikipedia.org/wiki/WebDAV WebDav]&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Mail</id>
		<title>Mail</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Mail"/>
				<updated>2015-12-30T17:26:21Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bij A–Eskwadraat gebruiken we '''Maildir''' voor de opslag van e-mail. Hiervoor gebruikten we het mbox-formaat. We raden gebruikers aan om niet direct de Maildirmappen te benaderen, maar om dit via [http://en.wikipedia.org/wiki/Internet_Message_Access_Protocol IMAP] te doen. De standaardconfiguratie van de meeste mailclients staat hier ook voor ingesteld.&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
&lt;br /&gt;
Op [[Haskell|haskell]] draait de virtuele machine [[Vm-mail|vm-mail]] om het mailverkeer van en naar A-Eskwadraat te regelen:&lt;br /&gt;
&lt;br /&gt;
*[http://www.exim.org/ exim] (''/etc/exim4/'') verwerkt in principe alle binnenkomende mails, en wat er waarheen doorgestuurd moet worden;&lt;br /&gt;
*[http://www.dovecot.org/ dovecot] (''/etc/dovecot/'') neemt de POP- en IMAP-servers voor zijn rekening;&lt;br /&gt;
*[http://spamassassin.apache.org/ SpamAssassin] (''/etc/mail/spamassassin/'') [[Mailfiltering|filtert]] het binnenkomende mailverkeer;&lt;br /&gt;
*[http://http://www.clamav.net/lang/en/ ClamAV] (''/etc/clamd.d/'') scant het mailverkeer voor virussen en dergelijke;&lt;br /&gt;
*[http://squirrelmail.org SquirrelMail] (''/etc/squirrelmail/'') is een webmail interface SquirrelMail draait in de webserver van [[Vm-mail|vm-mail]];&lt;br /&gt;
*[http://www.list.org/ Mailman] (''/etc/mailman/'') Mailman is verantwoordelijk voor de mailing lists, zoals de BBCie-announce.&lt;br /&gt;
&lt;br /&gt;
== Naamgeving Maildirmappen ==&lt;br /&gt;
&lt;br /&gt;
Let op dat om voor dovecot begrijpbare namen te hebben, de mappen op in ''~/Maildir'' altijd met een punt moeten beginnen. Submappen werken ook op deze manier. Een paar voorbeelden:&lt;br /&gt;
&lt;br /&gt;
*''~/Maildir/.Intro/'' voor de IMAP-map ''Intro'';&lt;br /&gt;
*''~/Maildir/.Sysop.postmaster/'' voor de map ''postmaster'' als submap van ''Sysop''.&lt;br /&gt;
&lt;br /&gt;
Als de mappen via IMAP worden aangemaakt gebeurt dit automatisch.&lt;br /&gt;
&lt;br /&gt;
== Postfix ==&lt;br /&gt;
&lt;br /&gt;
Postfix is de SMTP server voor de nieuwe mail server.&lt;br /&gt;
&lt;br /&gt;
Postfix gebruikt meerdere ports om mail te ontvangen en te verwerken. Inkomende mail van leden moet naar de SMTP daemon op port 587 worden gestuurd. Authenticatie en TLS encryptie zijn een vereiste op deze verbinding. In de toekomst zal de [[Router|Router]] de encryptie tussen client en mail-server regelen. Alle andere mail komt binnen op port 25. Spam- en virus-filtering gebeurd via de SMTP daemons op ports 10025 en 10027 voor onbekende en bekende mail, respectievelijk. Lees ''/etc/postfix/master.cf'' voor de configuratie van deze SMTP daemons.&lt;br /&gt;
&lt;br /&gt;
=== Transport ===&lt;br /&gt;
&lt;br /&gt;
Eerst checkt Postfix of de inkomende mail aan een lokaal mailadres is gestuurd. Vervolgens word het adres verandert aan de hand van de alias mappen in /etc/postfix/aliases. De mail word naar elke resulterende gebruiker gestuurd via de instellingen van hun ''.forward'' bestand. Welke domeinen als 'lokaal' worden bestempeld staat in ''/etc/postfix/domains/local''.&lt;br /&gt;
&lt;br /&gt;
Daarna checkt Postfix of de inkomende mail naar een virtueel domein is gestuurd. Domeinen zoals turingslegacy.nl worden via een aliasmap herschreven, en de herschreven mail word van begins af aan verwerkt door Postfix. De virtuele domeinen staan in ''/etc/postfix/domains/virtual''.&lt;br /&gt;
&lt;br /&gt;
Als laatste checkt Postfix of de inkomende mail is gestuurd naar een domein waarvoor A-Eskwadraat mail relayed. Deze mail word onveranderd naar de mail-server van dit domein verstuurd (relaying). Dit voorkomt verlies van mail voor het externe domein wanneer hun mailserver uitvalt, aangezien A-Eskwadraat de secondary mailserver is voor dat domein.&lt;br /&gt;
&lt;br /&gt;
Een uitzondering op de regel is mail bedoeld voor de webserver. Mail aan de webcie komt binnen op de mail server, maar moet worden doorgestuurd naar de webserver. De verwijzingen zijn te vinden in ''/etc/postfix/transport_www'' en ''/etc/postfix/transport_regex''.&lt;br /&gt;
&lt;br /&gt;
Let op dat deze uitleg heel erg bot is. Lees de relevante ''man'' pages van Postfix om te leren hoe mail word verwerkt. Let op dat veranderingen in een alias/transport/domain map niet worden opgemerkt tot het ''postmap'' of ''postalias'' op het bestand is aangeroepen!&lt;br /&gt;
&lt;br /&gt;
=== Mailfiltering ===&lt;br /&gt;
&lt;br /&gt;
Postfix maakt gebruik van amavisd voor het filteren van de inkomende mail. Amavis is een interface voor SpamAssassin welke spam filtert en ClamAV welke mails op virussen scant. Check de configuratie op [[Vm-saltmaster|vm-saltmaster]] voor details.&lt;br /&gt;
&lt;br /&gt;
Om de virus database up te daten:&lt;br /&gt;
&amp;lt;pre&amp;gt;freshclam&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mailman ==&lt;br /&gt;
&lt;br /&gt;
Mailman is verantwoordelijk voor de infrastructuur van de mailing lists. De mailing lists zijn te vinden op [lists.a-eskwadraat.nl/mailman lists.a-eskwadraat.nl/mailman]. Er zijn twee belangrijke services om mailman te draaien: mailman en httpd. De configuratie van mailman bevind zich in ''/etc/mailman/'', de data bevind zich in ''/var/lib/mailman'', en de binaries bevinden zich in ''/usr/lib/mailman''.&lt;br /&gt;
&lt;br /&gt;
Gebruik de scripts in /usr/lib/mailman/bin om de mailing lists vanaf de command-line te wijzigen. De volgende commando's zijn belangrijk bij het debuggen / migreren van mailman:&lt;br /&gt;
&lt;br /&gt;
*check_perms: repareert de bestandsrechten van mailman-specifieke bestanden.&lt;br /&gt;
*with_list &amp;amp; fix_url: repareert de links van de mailman archieven indien deze zijn veranderd.&lt;br /&gt;
&lt;br /&gt;
Lees de [http://wiki.list.org/DOC/4.09%20Summary%20of%20the%20mailman%20bin%20commands MailmanWiki] voor een samenvatting van alle commands.&lt;br /&gt;
&lt;br /&gt;
Mailman werkt samen met de Postfix mailserver via de alias map ''/etc/mailman/aliases''. Voer het volgende commando uit na het toevoegen/verwijderen van een lijst zodat Postfix zijn alias database update:&lt;br /&gt;
&amp;lt;pre&amp;gt;postalias /etc/mailman/aliases&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Na een migratie van de mailman lijsten is het belangrijk om ''restorecon'' uit te voeren op ''/var/lib/mailman''. Mailman en SELinux werken prima samen zolang de rechten maar goed staan.&lt;br /&gt;
&amp;lt;pre&amp;gt;# Samenvatting van een Mailman migratie.&lt;br /&gt;
# Op de nieuwe mailserver.&lt;br /&gt;
rsync -azv -e &amp;quot;ssh -i &amp;lt;sshkey&amp;gt;&amp;quot; &amp;lt;OUDEHOST&amp;gt;:/var/lib/mailman/ /var/lib/mailman/&lt;br /&gt;
restorecon -r /var/lib/mailman/&lt;br /&gt;
cd /usr/lib/mailman/&lt;br /&gt;
bin/check_perms -f&lt;br /&gt;
bin/withlist -l -a -r fix_url&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dovecot ==&lt;br /&gt;
&lt;br /&gt;
Dovecot is de IMAP server verantwoordelijk voor het ophalen en beheren van de mail opgeslagen in de homedirs. Mail wordt opgeslagen in de .Maildir van een gebruik zijn home directory. Momenteel is vm-mail de actieve IMAP server van A-Eskwadraat. De server luistert op poort 143 (standaard IMAP poort) en vereist een TLS-encrypted verbinding van de gebruiker. Het certificaat voor de verbinding is anders dan het certificaat van de webserver.&amp;amp;nbsp; Dovecot authenticeert gebruikers door middel van SASL-kerberos met de IPA servers. Dovecot werkt ook als authenticatie-server voor postfix door middel van een open socket. Een SELinux module is vereist om Postfix toegang te geven tot de socket.&lt;br /&gt;
&lt;br /&gt;
Voor meer configuratie details, zie de configuratie op de salt-master. (CentOS 6: /srv/salt/centos/vm-mail/dovecot, CentOS 7: /srv/salt/centos7/dovecot)&lt;br /&gt;
&lt;br /&gt;
'''AL DE CONFIGURATIE HIERONDER IS GIGANTISCH OUT OF DATE''' \/\/\/&lt;br /&gt;
&lt;br /&gt;
== Configuratie mailfilters ==&lt;br /&gt;
&lt;br /&gt;
Gebruik je een ''.forward'' of ''.procmailrc'' om e-mail direct in mappen te stoppen, let dan op de naamgeving (zie hierboven) en zorg ervoor dat de mappen altijd op een ''/'' eindigen. Begin je ''.procmailrc'' ook altijd met de regel&lt;br /&gt;
&lt;br /&gt;
 MAILDIR=$HOME/Maildir/&lt;br /&gt;
&lt;br /&gt;
om te zorgen dat e-mail toch niet in ''/var/mail'' terechtkomt.&lt;br /&gt;
&lt;br /&gt;
== Maak een mailserver met exim, en dovecot ==&lt;br /&gt;
&lt;br /&gt;
Zorg eerst dat sendmail uit staat!&lt;br /&gt;
&amp;lt;pre&amp;gt;service sendmail stop&lt;br /&gt;
chkconfig sendmail off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Bij voorkeur verwijder je ook de package voor [[Postfix|postfix]]. Deze is standaard bij CentOS geïnstalleerd.&lt;br /&gt;
&lt;br /&gt;
=== Exim ===&lt;br /&gt;
&lt;br /&gt;
Exim is een MTA (Mail Transfer Agent) en is ervoor om mailtjes te versturen, ontvangen, en doorsturen. Dit gebeurd uiteraard op de mailserver!&lt;br /&gt;
&lt;br /&gt;
Installeer allereerst exim op de host.&lt;br /&gt;
&amp;lt;pre&amp;gt;# yum install exim&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verander vervolgens het configuratie bestand /etc/exim/exim.conf:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Het Mail domain - normaal gesproken a-eskwadraat.nl&lt;br /&gt;
primary_hostname = circle.a-eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
# Weiger met ipv6 te werken.&lt;br /&gt;
local_interfaces = 0.0.0.0&lt;br /&gt;
disable_ipv6 = true&lt;br /&gt;
&lt;br /&gt;
daemon_smtp_ports = smtp&amp;amp;nbsp;: submission&lt;br /&gt;
accept_8bitmime = true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Lijsten van geldige mail domainin.&lt;br /&gt;
domainlist mailman_domains = CONFDIR/domains.mailman&lt;br /&gt;
domainlist local_domains = @&amp;amp;nbsp;: CONFDIR/domains.local&amp;amp;nbsp;: +mailman_domains&amp;amp;nbsp;: lsearch;CONFDIR/domains.virtual&lt;br /&gt;
domainlist relay_to_domains = CONFDIR/domains.relay&lt;br /&gt;
&lt;br /&gt;
hostlist relay_from_hosts = 10.14.3.0/22&lt;br /&gt;
&lt;br /&gt;
# Backup mail server in het geval dat onze niet werkt.&lt;br /&gt;
hostlist mx_hosts = mail.wolffelaar.nl&lt;br /&gt;
&lt;br /&gt;
qualify_domain = A-Eskwadraat.nl&lt;br /&gt;
&lt;br /&gt;
queue_run_max = 250&lt;br /&gt;
&lt;br /&gt;
smtp_accept_max = 100&lt;br /&gt;
smtp_accept_max_per_host = ${if match_ip{$sender_host_address}{+mx_hosts}{50}{10}}&lt;br /&gt;
&lt;br /&gt;
received_headers_max = 30&lt;br /&gt;
&lt;br /&gt;
RETRY_SECONDARY=F,90d,15m&lt;br /&gt;
RETRY_REST=F,2h,15m; G,16h,2h,1.5; F,4d,8h&lt;br /&gt;
&lt;br /&gt;
acl_smtp_rcpt = acl_check_rcpt&lt;br /&gt;
acl_not_smtp_start = acl_check_not_smtp&lt;br /&gt;
acl_smtp_data = acl_check_data&lt;br /&gt;
&lt;br /&gt;
host_lookup = *&lt;br /&gt;
helo_try_verify_hosts =&amp;amp;nbsp;!@&amp;amp;nbsp;:&amp;amp;nbsp;!@[]&lt;br /&gt;
helo_allow_chars = _&lt;br /&gt;
&lt;br /&gt;
# ClamAV - The Anti-Virus Scanner&lt;br /&gt;
av_scanner = clamd:/var/run/clamav/clamd.sock&lt;br /&gt;
&lt;br /&gt;
# Custom 5s limiet.&lt;br /&gt;
rfc1413_query_timeout = 5s&lt;br /&gt;
&lt;br /&gt;
# Mailman support, als per /usr/share/doc/mailman/README.EXIM.gz&lt;br /&gt;
MAILMAN_HOME=/var/lib/mailman&lt;br /&gt;
MAILMAN_WRAP=/usr/lib/mailman/mail/mailman&lt;br /&gt;
MAILMAN_USER=mailman&lt;br /&gt;
MAILMAN_GROUP=mailman&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Dovecot ===&lt;br /&gt;
&lt;br /&gt;
Dovecot is een IMAP en POP3 server, wat inhoud dat het mailtjes kan ontvangen, iets wat best wel handig is om te hebben. Installeer dovecot op je mailserver als je dat nog niet gedaan hebt. Verander dan nu het volgende:&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/dovecot.conf:&lt;br /&gt;
&lt;br /&gt;
*protocols = imap&lt;br /&gt;
*login_trusted_networks = &amp;amp;lt;ip-adressen die je vertrouwd&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-mail.conf&lt;br /&gt;
&lt;br /&gt;
*mail_location = maildir:~/Maildir&lt;br /&gt;
*lock_method = dotlock&lt;br /&gt;
&lt;br /&gt;
In /etc/dovecot/conf.d/10-auth.conf&lt;br /&gt;
&lt;br /&gt;
*disable_plaintext_auth = no&lt;br /&gt;
*auth_realms = aeskwadraat&lt;br /&gt;
*auth_default_realm = aeskwadraat&lt;br /&gt;
*auth_gssapi_hostname = &amp;amp;lt;ipa-server&amp;amp;gt;&lt;br /&gt;
*auth_krb5_keytab = /etc/dovecot/krb5.keytab&lt;br /&gt;
*auth_mechanisms = plain gssapi&lt;br /&gt;
&lt;br /&gt;
en zet op het einde&lt;br /&gt;
&amp;lt;pre&amp;gt;userdb {&lt;br /&gt;
  driver = static&lt;br /&gt;
  args = uid=dovecot gid=dovecot home=/var/spool/mail/%u&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak nu op de ipa-server een service imap aan met de mailserver als host. Dit kan je doen via de webinterface. Voer vervolgens het volgende uit op de mailserver:&lt;br /&gt;
&amp;lt;pre&amp;gt;kinit admin&lt;br /&gt;
ipa-getkeytab -s &amp;lt;ipa-server&amp;gt; -p imap/&amp;lt;mailserver&amp;gt; -k /etc/dovecot/krb5.keytab&lt;br /&gt;
chown root:dovecot /etc/dovecot/krb5.keytab&lt;br /&gt;
chmod 640 /etc/dovecot/krb5.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart dovecot en zet hem standaard aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;service dovecot restart&lt;br /&gt;
chkconfig dovecot on&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet tenslotte nog met system-config-firewall-tui 'imap over ssl' en 'mail (smtp)' aan, en voila! Je kan nu met ipa-users gebruik maken van IMAP om mailtjes te ontvangen!&lt;br /&gt;
&lt;br /&gt;
Je kan eventueel in /etc/postfix/main.cf en /etc/dovecot/conf.d/10-mail.conf nog het een ander van waar de mail wordt opgeslagen veranderen.&lt;br /&gt;
&lt;br /&gt;
=== Spamassassin ===&lt;br /&gt;
&lt;br /&gt;
Spamassassin is een mailfilteringprogramma voor spam. Om het te installeren:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install spamassassin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maak nu de user en group spamd aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;groupadd -g 5001 spamd&lt;br /&gt;
useradd -u 5001 -g spamd -s /sbin/nologin -d /var/lib/spamassassin spamd&lt;br /&gt;
mkdir /var/lib/spamassassin&lt;br /&gt;
chown spamd:spamd /var/lib/spamassassin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet dan het volgende in /etc/mail/spamassassin/local.cf:&lt;br /&gt;
&amp;lt;pre&amp;gt;required_score 5.0&lt;br /&gt;
report_safe 0&lt;br /&gt;
rewrite_header Subject [***SPAM***]&lt;br /&gt;
&lt;br /&gt;
# Enable the Bayes system&lt;br /&gt;
use_bayes 1&lt;br /&gt;
use_bayes_rules 1&lt;br /&gt;
# Enable Bayes auto-learning&lt;br /&gt;
bayes_auto_learn 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verander nu in /etc/postfix/master.cf&lt;br /&gt;
&amp;lt;pre&amp;gt;smtp      inet  n       -       n       -       -       smtpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
in&lt;br /&gt;
&amp;lt;pre&amp;gt;smtp      inet  n       -       n       -       -       smtpd -o content_filter=spamassassin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
en stop op het einde van master.cf:&lt;br /&gt;
&amp;lt;pre&amp;gt;spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart nu spamassassin en postfix:&lt;br /&gt;
&amp;lt;pre&amp;gt;chkconfig spamassassin on&lt;br /&gt;
service spamassassin restart&lt;br /&gt;
service postfix restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aliases ===&lt;br /&gt;
&lt;br /&gt;
In postfix staan de locaties van de aliases in /etc/postfix/main.cf. Deze kan je vinden bij de regel 'alias_maps = ...'. Als je een nieuw aliasbestand wilt toevoegen, voeg dit dan ook toe bij deze regel als hash:&amp;amp;lt;bestandslocatie&amp;amp;gt;. Vergeet ook niet om dit toe te voegen bij alias_database!.&lt;br /&gt;
&lt;br /&gt;
De aliases zelf staan geconfigureerd in de aliasbestanden die te vinden zijn onder /etc/aesalias/. Nadat je een nieuw alias hebt toegevoegd moet je het commando 'newaliases' als root uitvoeren om de nieuwe alias(sen) te activeren. Hetzelfde moet je ook doen als je aliases weghaalt natuurlijk!&lt;br /&gt;
&lt;br /&gt;
== Instellingen ==&lt;br /&gt;
&lt;br /&gt;
=== Postfix ===&lt;br /&gt;
&lt;br /&gt;
==== Mail relay ====&lt;br /&gt;
&lt;br /&gt;
Postfix kan mail relayen naar een extern domein. Hiervoor is de volgende regel:&lt;br /&gt;
&amp;lt;pre&amp;gt;relay_domains = $mydestination, hash:/etc/postfix/domains.relay&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In het bestand /etc/postfix/domains.relay staat de lijst van alle externe domains waar mail naar toe gerelayed wordt. Als je iets in het bestand wijzigt, vergeet dan niet om daarna het commando&lt;br /&gt;
&amp;lt;pre&amp;gt;postmap /etc/postfix/domains.relay&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uit te voeren.&lt;br /&gt;
&lt;br /&gt;
==== Whitelist ====&lt;br /&gt;
&lt;br /&gt;
Postfix kan gebruik maken van een whitelist. Zorg hiervoor dat er het volgende in /etc/postfix/main.cf staat:&lt;br /&gt;
&amp;lt;pre&amp;gt;smtpd_client_restrictions = check_client_access hash:/etc/postfix/client.access&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In het bestand /etc/postfix/client.access staat de lijst van alle domains die geweigerd en toegelaten worden. Als je hier iets in verandert, vergeet dan niet om uit te voeren&lt;br /&gt;
&amp;lt;pre&amp;gt;postmap /etc/postfix/access.client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SquirrelMail ==&lt;br /&gt;
&lt;br /&gt;
SquirrelMail is een webmail-client.&lt;br /&gt;
&lt;br /&gt;
=== SquirrelMail installeren ===&lt;br /&gt;
&lt;br /&gt;
Installeer eerst natuurlijk Squirrelmail:&lt;br /&gt;
&amp;lt;pre&amp;gt;yum install squirrelmail&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zorg ervoor dat httpd standaard aan staat en start httpd:&lt;br /&gt;
&amp;lt;pre&amp;gt;chkconfig httpd on&lt;br /&gt;
service httpd start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verander nu het volgende in /etc/squirrelmail/config.php:&lt;br /&gt;
&amp;lt;pre&amp;gt;$org_name        = &amp;quot;A-Eskwadraat&amp;quot;;&lt;br /&gt;
$org_logo        = SM_PATH . 'images/sm_logo.png';&lt;br /&gt;
$org_logo_width  = '308';&lt;br /&gt;
$org_logo_height = '111';&lt;br /&gt;
$org_title       = 'A-Eskwadraat SquirrelMail $version&amp;quot;;&lt;br /&gt;
$signout_page    = 'vm-mail.a-eskwadraat.nl';&lt;br /&gt;
&lt;br /&gt;
$domain            = 'circle.a-eskwadraat.nl';&lt;br /&gt;
$imapServerAddress = 'localhost';&lt;br /&gt;
$useSendmail       = false;&lt;br /&gt;
$smtpServerAddress = 'localhost';&lt;br /&gt;
$pop_before_smtp   = false;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zet nu het A-Eskwadraat logo in de squirrelmail config map.&lt;br /&gt;
&amp;lt;pre&amp;gt;setsebool -P httpd_can_network_connect 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== RoundcubeMail ==&lt;br /&gt;
&lt;br /&gt;
Roundcube is ook een webmail client.&lt;br /&gt;
&lt;br /&gt;
=== Installeren ===&lt;br /&gt;
&lt;br /&gt;
Op vm-salt-master staat een configuratie voor een Roundcube mail VM met een korte readme. Deze zorgt ervoor dat httpd, roundcubemail en mariadb geinstalleerd staan. Salt een VM met deze configuratie.&lt;br /&gt;
&amp;lt;pre&amp;gt;salt '$hostname' state.highstate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Laat vervolgens httpd van die VM door de firewall heen. Daarna moet de database voor Roundcube geinitialiseerd worden. Dit gaat met mysql.&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE DATABASE roundcubemail;&lt;br /&gt;
GRANT ALL PRIVILEGES on roundcubemail.* TO roundcube@localhost IDENTIFIED BY '$password';&lt;br /&gt;
FLUSH PRIVILEGES;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu moet de timezone nog even ingesteld worden in /etc/php.ini op de roundcube VM. Daarna moeten er nog de juiste tables in de database worden gezet. Dit kan door op de nieuwe VM de bestanden in /etc/roundcubemail/databasefiles te runnen met mysql.&lt;br /&gt;
&amp;lt;pre&amp;gt;mysql roundcubemail &amp;lt; mysql.initial.sql&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mail Authorizatie ==&lt;br /&gt;
&lt;br /&gt;
Om te controleren of een gebruiker wel als een adres mag mailen wordt gebruik gemaakt van een sender_login_maps, die in een database de users opzoekt die als gegeven adres mogen versturen. Dit is een python script die op de vm-sysop staat bij de sysop api, aangezien daar de mail aliases al staan voor de alias_check. Het python script, te vinden in `/var/www/html/api/python/mail-authorization.py`, loopt recursief langs alle users die in cies, bestuur, extern of iba zitten en kijkt daarnaast ook naar mail aliassen. Aan de hand hiervan wordt met een sql query alle transitieve relaties expliciet gemaakt, zodat dit niet runtime gedaan moet worden. Als een alias naar een cie wordt doorgestuurd, en een user weer in die cie zit, wil je dat die user ook als die alias mag mailen. Als database wordt PostgreSQL gebruikt op de vm-database. De database die gebruikt wordt heet &amp;quot;mail&amp;quot;. In de python code staan nog wat comments. Er draait op de vm-sysop een cron die af en toe de database refreshed. Daarnaast is het python script ook intern bereikbaar [http://vm-sysop.a-eskwadraat.nl/api/python/mail-authorization.py hier]. Bij het laden van deze pagina wordt de database gerefreshed. Op deze manier kan de database meteen gerefreshed worden zodra iemand toegevoegd is aan een cie. Als er in een alias een wildcard staat (*@bapc.eu: bapc), wat betekend dat alles van het domein bapc.eu naar de bapc commissie wordt gestuurd, wordt dit omgezet naar een SQL wildcard, wat uiteindelijk dus netjes werkt.&lt;br /&gt;
&lt;br /&gt;
Als er via SMTP een request gedaan wordt om van buitenaf een mail te versturen doet postfix een query en kijkt welke users als die alias mail mogen versturen. Deze config is op de vm-mailpp te vinden in `/etc/postfix/alias_auth.cf`.&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-12-30T16:53:26Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}}&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell|Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_(operating_system) Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell|Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden. Deze pool werkt ongeveer hetzelfde als bij LVM. Er is een pool met data beschikbaar en deze kan vervolgens weer gesplitst worden in datasets. Elke dataset heeft een aantal properties. Veel opties die bij andere dingen als mount opties in de fstab staan zijn in ZFS properties (mountpoint/extended attributes/atime/compressie). Er is ook een ZFS service en die regelt bij het opstarten alles zelf met betrekking tot mounten en sharen van file systems, dus er is niets van zfs te zien in /etc/fstab.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
&lt;br /&gt;
ZFS draait in een zogehete raidz2. Dit is in feite een raid 6 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogeheten [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem. Bij een raidz2/raid6 kunnen er 2 disks uitvallen voordat dataverlies optreed.&lt;br /&gt;
&lt;br /&gt;
== Versies ==&lt;br /&gt;
&lt;br /&gt;
ZFSonLinux is een aparte kernel module en er komen geregeld nieuwe versies uit. De updates zijn tamelijk grondig, dus het is verstandig niet direct te upgraden zodra er een nieuwe release uit is. Op moment van schrijven draait Haskell ZoL 0.6.3-1 en Max draait 0.6.3. Nieuwe versies zijn altijd backwards compatible. Ze bieden echter wel de optie aan om de pool te upgraden naar de nieuwe versies, zodat er gebruik gemaakt kan worden van nieuwe functionaliteit. Wees dus terughoudend met het upgraden van de pool. Het is ook handig om de github, te vinden op [https://github.com/zfsonlinux/zfs/issues https://github.com/zfsonlinux/zfs/issues], in de gaten te houden om te kijken of er niet al te veel problemen zijn met de nieuwe versies.&lt;br /&gt;
&lt;br /&gt;
Na het updaten van ZFS of de kernel kan het nog wel eens gebeuren dat de package manager de nieuwe modules niet goed build en dat dit handmatig gebeuren moet. Dit gebeurd met de volgende commandos. Na het builden moet de zpool nog handmatig geimporteerd worden, dus schrik niet als je geen pools ziet.&lt;br /&gt;
&lt;br /&gt;
  dkms install spl/&amp;lt;VERSION&amp;gt;&lt;br /&gt;
 dkms install zfs/&amp;lt;VERSION&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Waar &amp;amp;lt;VERSION&amp;amp;gt; de versie van zfs is, dus bv 0.6.5.&lt;br /&gt;
&lt;br /&gt;
== Blocksize problemen ==&lt;br /&gt;
&lt;br /&gt;
Het aanmaken van de raidz6 pool is gebeurd met 4 sas schijven + 2 dummy's. De dummy's zijn later vervangen door 2 seagate's. De sas schijven hebben echter een blocksize van 512 en de pool heeft daardoor ook een blocksize van 512 gekregen. De seagates hebben echter een blocksize van 4096, waardoor write amplification optreed. Andersom zou dit geen probleem zijn. De write performance van de pool is hierdoor drastisch lager, potentieel 8x. Of de pool moet opnieuw gemaakt worden, of de seagate's moeten worden vervangen door schijven met een physical block size van 512 byte.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;br /&gt;
&lt;br /&gt;
ZFS heeft eigen caching mechanismes die buiten de linux page cache om gaat. Er zijn 2 belangrijke caches die belangrijk zijn. De ram caching. Deze heet de ARC en is ingesteld op 4GB. Daarnaast wordt er aan write caching gedaan. Data wordt eerst naar SSD geschreven en dan pas naar HDD. Deze write cache heet de ZIL (ZFS Intent Log). Statistieken over o.a. deze caches kunnen gevonden worden in `/proc/spl/kstat/zfs`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do's and Don't ==&lt;br /&gt;
&lt;br /&gt;
=== Do's ===&lt;br /&gt;
&lt;br /&gt;
*De man pages van de commando's zfs en zpool zijn zeer uitgebreid. In het geval dat je niet helemaal weet hoe iets werkt, kijk eerst in de man page.&lt;br /&gt;
*Er is een stuk over ZFS in de sysop inwerking, te vinden op [https://home.a-eskwadraat.nl/~sysop/inwerking/inwerking.pdf https://home.a-eskwadraat.nl/~sysop/inwerking/inwerking.pdf], dit is een goede start om een beetje bekend te raken met ZFS.&lt;br /&gt;
&lt;br /&gt;
  man zpool&lt;br /&gt;
 man zfs&lt;br /&gt;
&lt;br /&gt;
=== Dont's ===&lt;br /&gt;
&lt;br /&gt;
*Wees voorzichting met zfs destroy, dubbelcheck altijd als je iets wilt verwijderen.&lt;br /&gt;
*Als je met disks bezig bent, werkt altijd met /dev/disk/by-id/.. en niet met kale /dev/sda e.d.&lt;br /&gt;
*Doe nooit iets met zpool labelclear, dit doet enge dingen met je partities.&lt;br /&gt;
*Wees voorzichtig met het upgraden van ZFS.&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-12-30T16:52:43Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}} [http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell|Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_(operating_system) Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell|Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden. Deze pool werkt ongeveer hetzelfde als bij LVM. Er is een pool met data beschikbaar en deze kan vervolgens weer gesplitst worden in datasets. Elke dataset heeft een aantal properties. Veel opties die bij andere dingen als mount opties in de fstab staan zijn in ZFS properties (mountpoint/extended attributes/atime/compressie). Er is ook een ZFS service en die regelt bij het opstarten alles zelf met betrekking tot mounten en sharen van file systems, dus er is niets van zfs te zien in /etc/fstab.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
&lt;br /&gt;
ZFS draait in een zogehete raidz2. Dit is in feite een raid 6 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogeheten [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem. Bij een raidz2/raid6 kunnen er 2 disks uitvallen voordat dataverlies optreed.&lt;br /&gt;
&lt;br /&gt;
== Versies ==&lt;br /&gt;
&lt;br /&gt;
ZFSonLinux is een aparte kernel module en er komen geregeld nieuwe versies uit. De updates zijn tamelijk grondig, dus het is verstandig niet direct te upgraden zodra er een nieuwe release uit is. Op moment van schrijven draait Haskell ZoL 0.6.3-1 en Max draait 0.6.3. Nieuwe versies zijn altijd backwards compatible. Ze bieden echter wel de optie aan om de pool te upgraden naar de nieuwe versies, zodat er gebruik gemaakt kan worden van nieuwe functionaliteit. Wees dus terughoudend met het upgraden van de pool. Het is ook handig om de github, te vinden op [https://github.com/zfsonlinux/zfs/issues https://github.com/zfsonlinux/zfs/issues], in de gaten te houden om te kijken of er niet al te veel problemen zijn met de nieuwe versies.&lt;br /&gt;
&lt;br /&gt;
Na het updaten van ZFS of de kernel kan het nog wel eens gebeuren dat de package manager de nieuwe modules niet goed build en dat dit handmatig gebeuren moet. Dit gebeurd met de volgende commandos. Na het builden moet de zpool nog handmatig geimporteerd worden, dus schrik niet als je geen pools ziet.&lt;br /&gt;
&lt;br /&gt;
  dkms install spl/&amp;lt;VERSION&amp;gt;&lt;br /&gt;
 dkms install zfs/&amp;lt;VERSION&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Waar &amp;amp;lt;VERSION&amp;amp;gt; de versie van zfs is, dus bv 0.6.5.&lt;br /&gt;
&lt;br /&gt;
== Blocksize problemen ==&lt;br /&gt;
&lt;br /&gt;
Het aanmaken van de raidz6 pool is gebeurd met 4 sas schijven + 2 dummy's. De dummy's zijn later vervangen door 2 seagate's. De sas schijven hebben echter een blocksize van 512 en de pool heeft daardoor ook een blocksize van 512 gekregen. De seagates hebben echter een blocksize van 4096, waardoor write amplification optreed. Andersom zou dit geen probleem zijn. De write performance van de pool is hierdoor drastisch lager, potentieel 8x. Of de pool moet opnieuw gemaakt worden, of de seagate's moeten worden vervangen door schijven met een physical block size van 512 byte.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;br /&gt;
&lt;br /&gt;
ZFS heeft eigen caching mechanismes die buiten de linux page cache om gaat. Er zijn 2 belangrijke caches die belangrijk zijn. De ram caching. Deze heet de ARC en is ingesteld op 4GB. Daarnaast wordt er aan write caching gedaan. Data wordt eerst naar SSD geschreven en dan pas naar HDD. Deze write cache heet de ZIL (ZFS Intent Log). Statistieken over o.a. deze caches kunnen gevonden worden in `/proc/spl/kstat/zfs`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do's and Don't ==&lt;br /&gt;
&lt;br /&gt;
=== Do's ===&lt;br /&gt;
&lt;br /&gt;
*De man pages van de commando's zfs en zpool zijn zeer uitgebreid. In het geval dat je niet helemaal weet hoe iets werkt, kijk eerst in de man page.&lt;br /&gt;
*Er is een stuk over ZFS in de sysop inwerking, te vinden op [https://home.a-eskwadraat.nl/~sysop/inwerking/inwerking.pdf https://home.a-eskwadraat.nl/~sysop/inwerking/inwerking.pdf], dit is een goede start om een beetje bekend te raken met ZFS.&lt;br /&gt;
&lt;br /&gt;
  man zpool&lt;br /&gt;
 man zfs&lt;br /&gt;
&lt;br /&gt;
=== Dont's ===&lt;br /&gt;
&lt;br /&gt;
*Wees voorzichting met zfs destroy, dubbelcheck altijd als je iets wilt verwijderen.&lt;br /&gt;
*Als je met disks bezig bent, werkt altijd met /dev/disk/by-id/.. en niet met kale /dev/sda e.d.&lt;br /&gt;
*Doe nooit iets met zpool labelclear, dit doet enge dingen met je partities.&lt;br /&gt;
*Wees voorzichtig met het upgraden van ZFS.&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-12-30T16:39:59Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: ` `&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}} [http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell|Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_(operating_system) Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell|Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden. Deze pool werkt ongeveer hetzelfde als bij LVM. Er is een pool met data beschikbaar en deze kan vervolgens weer gesplitst worden in datasets. Elke dataset heeft een aantal properties. Veel opties die bij andere dingen als mount opties in de fstab staan zijn in ZFS properties (mountpoint/extended attributes/atime/compressie). Er is ook een ZFS service en die regelt bij het opstarten alles zelf met betrekking tot mounten en sharen van file systems, dus er is niets van zfs te zien in /etc/fstab.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
&lt;br /&gt;
ZFS draait in een zogehete raidz2. Dit is in feite een raid 6 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogeheten [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem. Bij een raidz2/raid6 kunnen er 2 disks uitvallen voordat dataverlies optreed.&lt;br /&gt;
&lt;br /&gt;
== Versies ==&lt;br /&gt;
&lt;br /&gt;
ZFSonLinux is een aparte kernel module en er komen geregeld nieuwe versies uit. De updates zijn tamelijk grondig, dus het is verstandig niet direct te upgraden zodra er een nieuwe release uit is. Op moment van schrijven draait Haskell ZoL 0.6.3-1 en Max draait 0.6.3. Nieuwe versies zijn altijd backwards compatible. Ze bieden echter wel de optie aan om de pool te upgraden naar de nieuwe versies, zodat er gebruik gemaakt kan worden van nieuwe functionaliteit. Wees dus terughoudend met het upgraden van de pool. Het is ook handig om de github, te vinden op [https://github.com/zfsonlinux/zfs/issues https://github.com/zfsonlinux/zfs/issues], in de gaten te houden om te kijken of er niet al te veel problemen zijn met de nieuwe versies.&lt;br /&gt;
&lt;br /&gt;
== Blocksize problemen ==&lt;br /&gt;
&lt;br /&gt;
Het aanmaken van de raidz6 pool is gebeurd met 4 sas schijven + 2 dummy's. De dummy's zijn later vervangen door 2 seagate's. De sas schijven hebben echter een blocksize van 512 en de pool heeft daardoor ook een blocksize van 512 gekregen. De seagates hebben echter een blocksize van 4096, waardoor write amplification optreed. Andersom zou dit geen probleem zijn. De write performance van de pool is hierdoor drastisch lager, potentieel 8x. Of de pool moet opnieuw gemaakt worden, of de seagate's moeten worden vervangen door schijven met een physical block size van 512 byte.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;br /&gt;
&lt;br /&gt;
ZFS heeft eigen caching mechanismes die buiten de linux page cache om gaat. Er zijn 2 belangrijke caches die belangrijk zijn. De ram caching. Deze heet de ARC en is ingesteld op 4GB. Daarnaast wordt er aan write caching gedaan. Data wordt eerst naar SSD geschreven en dan pas naar HDD. Deze write cache heet de ZIL (ZFS Intent Log). Statistieken over o.a. deze caches kunnen gevonden worden in `/proc/spl/kstat/zfs`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do's and Don't ==&lt;br /&gt;
&lt;br /&gt;
=== Do's ===&lt;br /&gt;
&lt;br /&gt;
De man pages van de commando's zfs en zpool zijn zeer uitgebreid. In het geval dat je niet helemaal weet hoe iets werkt, kijk eerst in de man page.&lt;br /&gt;
&lt;br /&gt;
  man zpool&lt;br /&gt;
 man zfs&lt;br /&gt;
&lt;br /&gt;
=== Dont's ===&lt;br /&gt;
&lt;br /&gt;
*Wees voorzichting met zfs destroy, dubbelcheck altijd als je iets wilt verwijderen.&lt;br /&gt;
*Als je met disks bezig bent, werkt altijd met /dev/disk/by-id/.. en niet met kale /dev/sda e.d.&lt;br /&gt;
*Doe nooit iets met zpool labelclear, dit doet enge dingen met je partities.&lt;br /&gt;
*Wees voorzichtig met het upgraden van ZFS.&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Max</id>
		<title>Max</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Max"/>
				<updated>2015-12-30T14:57:41Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:max}} '''max''' was van 2007 tot [[Haskell|haskell]] de hoofdserver ([[Square|square]]) van A–Eskwadraat. Hij is vernoemd naar de Duitse fysicus [http://nl.wikipedia.org/wiki/Max_Planck Max Planck].&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
&lt;br /&gt;
Net als de [[Workstations|workstations]] draait max Centos 7. Op dit moment staan er alleen backups op en is het een hele kale Centos 7, dus hij hangt ook niet in salt o.i.d.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
In max zit een [http://ark.intel.com/products/28033/Intel-Xeon-Processor-X3210-(8M-Cache-2_13-GHz-1066-MHz-FSB) Xeon X3210] met een kloksnelheid van 2.13GHz en 4GB DDR2 RAM met een snelheid van 667MHz.&lt;br /&gt;
&lt;br /&gt;
=== Hard Disks ===&lt;br /&gt;
&lt;br /&gt;
Op het moment van schrijven zitten er vier hard disks in max. De root staat op een deel van de 2 schijven in een raid-0. De rest van deze 2 schijven + de andere 2 zitten in een raidz1 (raid-5).&lt;br /&gt;
&lt;br /&gt;
==== SATA II vs. SATA I ====&lt;br /&gt;
&lt;br /&gt;
Quote van [http://www.wdc.com/en/ Western Digital]:&lt;br /&gt;
&lt;br /&gt;
:Our Second Generation Serial ATA hard drives use autospeed negotiation. This enables our Second Generation Serial ATA hard drives to automatically detect the motherboard data transfer rate, making it backward compatible with First Generation Serial ATA data transfer rates. However, because this technology is so new, some older First Generation Serial ATA controllers are unable to support autospeed negotiation and cannot recognize the drive. This “drive not detected” condition occurs when a chipset is incapable of correctly negotiating the data transfer speed with a Second Generation Serial ATA hard drive.&lt;br /&gt;
&lt;br /&gt;
De oplossing: een SATA II schijf jumperen om 'm te forceren te werken in SATA I mode.&lt;br /&gt;
[[Category:Hardware]] [[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</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>2015-12-30T14:30:34Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &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.&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 max.&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;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs</id>
		<title>Bindfs</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs"/>
				<updated>2015-06-03T14:03:31Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de '''umask''' op ''0002'' te zetten, waardoor bestanden en directories altijd group writeable zijn. Dit gaat echter nog altijd fout in een aantal scenario's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sommige programma's zoals google-chrome downloaden bestanden altijd met rechten 640 als user:primary-group, ongeacht umask en of de directory de set group-id bit heeft. Bij het downloaden van bestanden direct naar een comissiemap gaat dit dan fout.&lt;br /&gt;
*Een mv is in feite een rename en daarbij worden de rechten e.d. niet aangepast. Als iemand een file mv'ed van zijn homedir naar het commissieaccount heeft hij dus nog de oude rechten en kan de commissie er niet bij.&lt;br /&gt;
*Bij een cp wordt er wel gekeken naar zaken als setgid bits, maar worden de rechten wel meegekopieerd, wat een probleem kan zijn als het origineel niet group-writeable is.&lt;br /&gt;
&lt;br /&gt;
De enige manier om bovenstaande problemen structureel op te lossen is om deze permissies hard op file system niveau af te dwingen. Hiervoor wordt [http://bindfs.org/ BindFS] gebruikt. Dit is een [http://fuse.sourceforge.net/ Fuse] file system waarmee een directory op een andere plek gemount kan worden, net zoals bij ''mount --bind'', maar waarbij de permissies ook nog aangepast kunnen worden. Om echter te zorgen dat de permissies van bestanden dynamisch aangepast worden afhankelijk van de locatie was het echter nodig om [http://bindfs.org/ BindFS] te patchen.&lt;br /&gt;
&lt;br /&gt;
== Gebruikte opties van BindFS ==&lt;br /&gt;
&lt;br /&gt;
Als we kijken naar de /etc/fstab van een systeem dat [http://bindfs.org/ BindFS] gebruikt zien we de volgende opties.&lt;br /&gt;
&lt;br /&gt;
*chmod-filter=g+rwD: Zorgt ervoor dat als er een chmod plaats vind op een file altijd de bits g+rw voor files en g+rwx voor directories geset worden. Een chmod 600 wordt dan bijvoorbeeld uitgevoerd als chmod 660 op de achtergrond.&lt;br /&gt;
*create-with-perms=g+rwD: Permissies worden aangemaakt met g+rwD rechten.&lt;br /&gt;
*perms=g+rwD: Bestaande bestanden worden gepresenteerd alsof ze g+rwD rechten hebben, ook al hoeft dat op de originele locatie niet zo te zijn.&lt;br /&gt;
*chgrp-ignore: Negeer chgrp commando's. Dit is nodig omdat programma's als mv of google-chrome anders handmatig de group verkeerd zetten. Dit heeft wel als side effect dat handmatig rechten goedzetten dus ook niet meer kan.&lt;br /&gt;
*nonempty: Zorgt ervoor dat [http://fuse.sourceforge.net/ Fuse] de directory in een niet lege directory kan mounten.&lt;br /&gt;
*noauto: Eerst moeten de home directories in /mnt/home gemount worden, voordat [http://bindfs.org/ BindFS] deze weer in /home kan mounten. Dit wordt gedaan door het script /usr/local/sbin/mount-dirs dat via een service gerund wordt. Deze service start pas nadat netwerk-file systems gemount zijn.&lt;br /&gt;
&lt;br /&gt;
== Custom BindFS patch ==&lt;br /&gt;
&lt;br /&gt;
Met BindFS is het mogelijk om een enkele user en group te forcen, maar in ons geval willen we dit dynamisch doen, afhankelijk van de locatie van het bestand. Er is dus al code om een group-id te force'n, dus het enige wat gedaan moet worden is dit dynamisch te maken. Allereerst wordt bij het opstarten gekeken of de destination van de mount /home/iba, /home/cies, /home/bestuur of /home/extern is en alleen dan gebruiken we permission enforcement (settings.use_permission_enforcement). Er is gekozen om 4 aparte mountpoints te maken, zodat mv's nu cross-file systems zijn en dus geen rename meer zijn. Verder willen we ook geen permissies enforcen op de /home. Daarna wordt in de chown_new_file functie gekeken of de settings.use_permission_enforcement bit geset is en zoja, dan kijken we naar de directory van de file met behulp van een regex en zoeken we de bijbehorende group-id. Hierbij wordt als vuistregel gebruikt dat de naam van de top directory ook de group-name is. Dit levert problemen op als de naam van de homedir van een cie anders is dan de group-name.&lt;br /&gt;
&amp;lt;pre&amp;gt;@@ -63,6 +63,8 @@&lt;br /&gt;
 #ifdef HAVE_SETXATTR&lt;br /&gt;
 #include &amp;lt;sys/xattr.h&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
+#include &amp;lt;linux/limits.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;regex.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;fuse.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;fuse_opt.h&amp;gt;&lt;br /&gt;
@@ -141,6 +143,9 @@ static struct Settings {&lt;br /&gt;
     int ctime_from_mtime;&lt;br /&gt;
     int hide_hard_links;&lt;br /&gt;
 &lt;br /&gt;
+    //Custom made for sysop&lt;br /&gt;
+    int use_permission_enforcement;&lt;br /&gt;
+&lt;br /&gt;
 } settings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -306,6 +311,41 @@ static int getattr_common(const char *pr&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+int get_gid(const char *path) {&lt;br /&gt;
+&lt;br /&gt;
+  regex_t regex;&lt;br /&gt;
+  int reti;&lt;br /&gt;
+&lt;br /&gt;
+  regmatch_t matches[2];&lt;br /&gt;
+&lt;br /&gt;
+//  reti = regcomp(&amp;amp;regex,&amp;quot;^/home/(cies|extern|iba|bestuur)/([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  reti = regcomp(&amp;amp;regex,&amp;quot;^([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  if (reti) {&lt;br /&gt;
+    fprintf(stderr, &amp;quot;Could not compile regex\n&amp;quot;);&lt;br /&gt;
+    regfree(&amp;amp;regex);&lt;br /&gt;
+    return -1;&lt;br /&gt;
+  }&lt;br /&gt;
+  reti = regexec(&amp;amp;regex, path, 2, matches, 0);&lt;br /&gt;
+  int return_value = -1;&lt;br /&gt;
+  if (!reti) {&lt;br /&gt;
+    int match_size = matches[1].rm_eo - matches[1].rm_so;&lt;br /&gt;
+    char *matchgroup = malloc(sizeof(char) * (1+match_size));&lt;br /&gt;
+    matchgroup[match_size] = '\0';&lt;br /&gt;
+    memcpy(matchgroup,&amp;amp;path[matches[1].rm_so],match_size);&lt;br /&gt;
+    struct group *group_info = getgrnam(matchgroup);&lt;br /&gt;
+    if (group_info == NULL) {&lt;br /&gt;
+      return_value = -1;&lt;br /&gt;
+    } else {&lt;br /&gt;
+      return_value = group_info-&amp;gt;gr_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    free(matchgroup);&lt;br /&gt;
+  }&lt;br /&gt;
+  regfree(&amp;amp;regex);&lt;br /&gt;
+  return return_value;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
 /* FIXME: another thread may race to see the old owner before the chown is done.&lt;br /&gt;
           Is there a scenario where this compromises security? Or application correctness? */&lt;br /&gt;
 static void chown_new_file(const char *path, struct fuse_context *fc, int (*chown_func)(const char*, uid_t, gid_t))&lt;br /&gt;
@@ -339,6 +379,14 @@ static void chown_new_file(const char *p&lt;br /&gt;
     if (settings.create_for_gid&amp;amp;nbsp;!= -1)&lt;br /&gt;
         file_group = settings.create_for_gid;&lt;br /&gt;
 &lt;br /&gt;
+    //printf(&amp;quot;Old file permission:&amp;amp;nbsp;%d&amp;amp;nbsp;%d\n&amp;quot;,settings.use_permission_enforcement,file_group);&lt;br /&gt;
+    if (settings.use_permission_enforcement) {&lt;br /&gt;
+        &lt;br /&gt;
+        int new_gid = get_gid(path);&lt;br /&gt;
+        //printf(&amp;quot;New file permssion:&amp;amp;nbsp;%d\n&amp;quot;,new_gid);&lt;br /&gt;
+        file_group = new_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
     if ((file_owner&amp;amp;nbsp;!= -1) || (file_group&amp;amp;nbsp;!= -1)) {&lt;br /&gt;
         if (chown_func(path, file_owner, file_group) == -1) {&lt;br /&gt;
             DPRINTF(&amp;quot;Failed to chown new file or directory (%d)&amp;quot;, errno);&lt;br /&gt;
@@ -1670,6 +1718,13 @@ int main(int argc, char *argv[])&lt;br /&gt;
         bindfs_oper.listxattr = NULL;&lt;br /&gt;
         bindfs_oper.removexattr = NULL;&lt;br /&gt;
     }&lt;br /&gt;
+    if (strcmp(settings.mntdest,&amp;quot;/home/iba&amp;quot;) || &lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/cies&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/bestuur&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/extern&amp;quot;)) {&lt;br /&gt;
+        settings.use_permission_enforcement = 1;&lt;br /&gt;
+    }&lt;br /&gt;
+    &lt;br /&gt;
 &lt;br /&gt;
     /* fuse_main will daemonize by fork()'ing. The signal handler will persist. */&lt;br /&gt;
     setup_signal_handling();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De code is de vinden in /root/bindfs-1.12.6 op elke machine waar&amp;amp;nbsp;[http://bindfs.org/ BindFS] gebruikt wordt. De patch is te vinden in /root/bindfs.patch.&lt;br /&gt;
&lt;br /&gt;
== Compilatie, debuggen, deployment ==&lt;br /&gt;
De code bevat een Makefile, dus kan gewoon gecompileerd worden met de standaard ./configure en make. De binary is een executable met de naam &amp;quot;bindfs&amp;quot;. Als deze neergezet wordt in een locatie in het systeempath zoals /usr/bin/ wordt deze automatisch herkend en gebruikt als je als vstype fuse.bindfs opgeeft met mount.&amp;lt;pre&amp;gt;mount -t fuse.bindfs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor compilatie zijn een standaard c compiler (zowel gcc als clang werkt) nodig en de package fuse-devel. Indien gecompileerd wordt op een CentOS 7 machine dan is deze executable niet te gebruiken op CentOS 6 vanwege een verouderde libc versie, andersom werkt wel. De executable kan ook eenvoudig gedebugd worden door een handmatige mount te doen met de -D optie.&amp;lt;pre&amp;gt;/usr/bin/bindfs -d -o chmod-filter=g+rwD,create-with-perms=g+rwD,perms=g+rwD,chgrp-ignore,nonempty /mnt/home/ /home&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In salt is de config te vinden in /srv/salt/centos7/homedirs. Dit is een losse state die het mounten van de homedirs via [http://bindfs.org/ BindFS] mogelijk maakt.&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs</id>
		<title>Bindfs</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs"/>
				<updated>2015-06-03T13:59:44Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de '''umask''' op ''0002'' te zetten, waardoor bestanden en directories altijd group writeable zijn. Dit gaat echter nog altijd fout in een aantal scenario's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sommige programma's zoals google-chrome downloaden bestanden altijd met rechten 640 als user:primary-group, ongeacht umask en of de directory de set group-id bit heeft. Bij het downloaden van bestanden direct naar een comissiemap gaat dit dan fout.&lt;br /&gt;
*Een mv is in feite een rename en daarbij worden de rechten e.d. niet aangepast. Als iemand een file mv'ed van zijn homedir naar het commissieaccount heeft hij dus nog de oude rechten en kan de commissie er niet bij.&lt;br /&gt;
*Bij een cp wordt er wel gekeken naar zaken als setgid bits, maar worden de rechten wel meegekopieerd, wat een probleem kan zijn als het origineel niet group-writeable is.&lt;br /&gt;
&lt;br /&gt;
De enige manier om bovenstaande problemen structureel op te lossen is om deze permissies hard op file system niveau af te dwingen. Hiervoor wordt [http://bindfs.org/ BindFS] gebruikt. Dit is een [http://fuse.sourceforge.net/ Fuse] file system waarmee een directory op een andere plek gemount kan worden, net zoals bij ''mount --bind'', maar waarbij de permissies ook nog aangepast kunnen worden. Om echter te zorgen dat de permissies van bestanden dynamisch aangepast worden afhankelijk van de locatie was het echter nodig om [http://bindfs.org/ BindFS] te patchen.&lt;br /&gt;
&lt;br /&gt;
== Gebruikte opties van BindFS ==&lt;br /&gt;
&lt;br /&gt;
Als we kijken naar de /etc/fstab van een systeem dat [http://bindfs.org/ BindFS] gebruikt zien we de volgende opties.&lt;br /&gt;
&lt;br /&gt;
*chmod-filter=g+rwD: Zorgt ervoor dat als er een chmod plaats vind op een file altijd de bits g+rw voor files en g+rwx voor directories geset worden. Een chmod 600 wordt dan bijvoorbeeld uitgevoerd als chmod 660 op de achtergrond.&lt;br /&gt;
*create-with-perms=g+rwD: Permissies worden aangemaakt met g+rwD rechten.&lt;br /&gt;
*perms=g+rwD: Bestaande bestanden worden gepresenteerd alsof ze g+rwD rechten hebben, ook al hoeft dat op de originele locatie niet zo te zijn.&lt;br /&gt;
*chgrp-ignore: Negeer chgrp commando's. Dit is nodig omdat programma's als mv of google-chrome anders handmatig de group verkeerd zetten. Dit heeft wel als side effect dat handmatig rechten goedzetten dus ook niet meer kan.&lt;br /&gt;
*nonempty: Zorgt ervoor dat [http://fuse.sourceforge.net/ Fuse] de directory in een niet lege directory kan mounten.&lt;br /&gt;
*noauto: Eerst moeten de home directories in /mnt/home gemount worden, voordat [http://bindfs.org/ BindFS] deze weer in /home kan mounten. Dit wordt gedaan door het script /usr/local/sbin/mount-dirs dat via een service gerund wordt. Deze service start pas nadat netwerk-file systems gemount zijn.&lt;br /&gt;
&lt;br /&gt;
== Custom BindFS patch ==&lt;br /&gt;
&lt;br /&gt;
Met BindFS is het mogelijk om een enkele user en group te forcen, maar in ons geval willen we dit dynamisch doen, afhankelijk van de locatie van het bestand. Er is dus al code om een group-id te force'n, dus het enige wat gedaan moet worden is dit dynamisch te maken. Allereerst wordt bij het opstarten gekeken of de destination van de mount /home/iba, /home/cies, /home/bestuur of /home/extern is en alleen dan gebruiken we permission enforcement (settings.use_permission_enforcement). Er is gekozen om 4 aparte mountpoints te maken, zodat mv's nu cross-file systems zijn en dus geen rename meer zijn. Verder willen we ook geen permissies enforcen op de /home. Daarna wordt in de chown_new_file functie gekeken of de settings.use_permission_enforcement bit geset is en zoja, dan kijken we naar de directory van de file met behulp van een regex en zoeken we de bijbehorende group-id. Hierbij wordt als vuistregel gebruikt dat de naam van de top directory ook de group-name is. Dit levert problemen op als de naam van de homedir van een cie anders is dan de group-name.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@@ -63,6 +63,8 @@&lt;br /&gt;
 #ifdef HAVE_SETXATTR&lt;br /&gt;
 #include &amp;lt;sys/xattr.h&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
+#include &amp;lt;linux/limits.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;regex.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;fuse.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;fuse_opt.h&amp;gt;&lt;br /&gt;
@@ -141,6 +143,9 @@ static struct Settings {&lt;br /&gt;
     int ctime_from_mtime;&lt;br /&gt;
     int hide_hard_links;&lt;br /&gt;
 &lt;br /&gt;
+    //Custom made for sysop&lt;br /&gt;
+    int use_permission_enforcement;&lt;br /&gt;
+&lt;br /&gt;
 } settings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -306,6 +311,41 @@ static int getattr_common(const char *pr&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+int get_gid(const char *path) {&lt;br /&gt;
+&lt;br /&gt;
+  regex_t regex;&lt;br /&gt;
+  int reti;&lt;br /&gt;
+&lt;br /&gt;
+  regmatch_t matches[2];&lt;br /&gt;
+&lt;br /&gt;
+//  reti = regcomp(&amp;amp;regex,&amp;quot;^/home/(cies|extern|iba|bestuur)/([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  reti = regcomp(&amp;amp;regex,&amp;quot;^([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  if (reti) {&lt;br /&gt;
+    fprintf(stderr, &amp;quot;Could not compile regex\n&amp;quot;);&lt;br /&gt;
+    regfree(&amp;amp;regex);&lt;br /&gt;
+    return -1;&lt;br /&gt;
+  }&lt;br /&gt;
+  reti = regexec(&amp;amp;regex, path, 2, matches, 0);&lt;br /&gt;
+  int return_value = -1;&lt;br /&gt;
+  if (!reti) {&lt;br /&gt;
+    int match_size = matches[1].rm_eo - matches[1].rm_so;&lt;br /&gt;
+    char *matchgroup = malloc(sizeof(char) * (1+match_size));&lt;br /&gt;
+    matchgroup[match_size] = '\0';&lt;br /&gt;
+    memcpy(matchgroup,&amp;amp;path[matches[1].rm_so],match_size);&lt;br /&gt;
+    struct group *group_info = getgrnam(matchgroup);&lt;br /&gt;
+    if (group_info == NULL) {&lt;br /&gt;
+      return_value = -1;&lt;br /&gt;
+    } else {&lt;br /&gt;
+      return_value = group_info-&amp;gt;gr_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    free(matchgroup);&lt;br /&gt;
+  }&lt;br /&gt;
+  regfree(&amp;amp;regex);&lt;br /&gt;
+  return return_value;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
 /* FIXME: another thread may race to see the old owner before the chown is done.&lt;br /&gt;
           Is there a scenario where this compromises security? Or application correctness? */&lt;br /&gt;
 static void chown_new_file(const char *path, struct fuse_context *fc, int (*chown_func)(const char*, uid_t, gid_t))&lt;br /&gt;
@@ -339,6 +379,14 @@ static void chown_new_file(const char *p&lt;br /&gt;
     if (settings.create_for_gid != -1)&lt;br /&gt;
         file_group = settings.create_for_gid;&lt;br /&gt;
 &lt;br /&gt;
+    //printf(&amp;quot;Old file permission: %d %d\n&amp;quot;,settings.use_permission_enforcement,file_group);&lt;br /&gt;
+    if (settings.use_permission_enforcement) {&lt;br /&gt;
+        &lt;br /&gt;
+        int new_gid = get_gid(path);&lt;br /&gt;
+        //printf(&amp;quot;New file permssion: %d\n&amp;quot;,new_gid);&lt;br /&gt;
+        file_group = new_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
     if ((file_owner != -1) || (file_group != -1)) {&lt;br /&gt;
         if (chown_func(path, file_owner, file_group) == -1) {&lt;br /&gt;
             DPRINTF(&amp;quot;Failed to chown new file or directory (%d)&amp;quot;, errno);&lt;br /&gt;
@@ -1670,6 +1718,13 @@ int main(int argc, char *argv[])&lt;br /&gt;
         bindfs_oper.listxattr = NULL;&lt;br /&gt;
         bindfs_oper.removexattr = NULL;&lt;br /&gt;
     }&lt;br /&gt;
+    if (strcmp(settings.mntdest,&amp;quot;/home/iba&amp;quot;) || &lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/cies&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/bestuur&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/extern&amp;quot;)) {&lt;br /&gt;
+        settings.use_permission_enforcement = 1;&lt;br /&gt;
+    }&lt;br /&gt;
+    &lt;br /&gt;
 &lt;br /&gt;
     /* fuse_main will daemonize by fork()'ing. The signal handler will persist. */&lt;br /&gt;
     setup_signal_handling();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: Locatie waar de code terug te vinden is. (Wat is een handige plek?)&lt;br /&gt;
&lt;br /&gt;
== Compilatie, debuggen, deployment ==&lt;br /&gt;
De code bevat een Makefile, dus kan gewoon gecompileerd worden met de standaard ./configure en make. De binary is een executable met de naam &amp;quot;bindfs&amp;quot;. Als deze neergezet wordt in een locatie in het systeempath zoals /usr/bin/ wordt deze automatisch herkend en gebruikt als je als vstype fuse.bindfs opgeeft met mount.&amp;lt;pre&amp;gt;mount -t fuse.bindfs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor compilatie zijn een standaard c compiler (zowel gcc als clang werkt) nodig en de package fuse-devel. Indien gecompileerd wordt op een CentOS 7 machine dan is deze executable niet te gebruiken op CentOS 6 vanwege een verouderde libc versie, andersom werkt wel. De executable kan ook eenvoudig gedebugd worden door een handmatige mount te doen met de -D optie.&amp;lt;pre&amp;gt;/usr/bin/bindfs -d -o chmod-filter=g+rwD,create-with-perms=g+rwD,perms=g+rwD,chgrp-ignore,nonempty /mnt/home/ /home&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs</id>
		<title>Bindfs</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs"/>
				<updated>2015-06-03T12:49:25Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de '''umask''' op ''0002'' te zetten, waardoor bestanden en directories altijd group writeable zijn. Dit gaat echter nog altijd fout in een aantal scenario's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sommige programma's zoals google-chrome downloaden bestanden altijd met rechten 640 als user:primary-group, ongeacht umask en of de directory de set group-id bit heeft. Bij het downloaden van bestanden direct naar een comissiemap gaat dit dan fout.&lt;br /&gt;
*Een mv is in feite een rename en daarbij worden de rechten e.d. niet aangepast. Als iemand een file mv'ed van zijn homedir naar het commissieaccount heeft hij dus nog de oude rechten en kan de commissie er niet bij.&lt;br /&gt;
*Bij een cp wordt er wel gekeken naar zaken als setgid bits, maar worden de rechten wel meegekopieerd, wat een probleem kan zijn als het origineel niet group-writeable is.&lt;br /&gt;
&lt;br /&gt;
De enige manier om bovenstaande problemen structureel op te lossen is om deze permissies hard op file system niveau af te dwingen. Hiervoor wordt [http://bindfs.org/ BindFS] gebruikt. Dit is een [http://fuse.sourceforge.net/ Fuse] file system waarmee een directory op een andere plek gemount kan worden, net zoals bij ''mount --bind'', maar waarbij de permissies ook nog aangepast kunnen worden. Om echter te zorgen dat de permissies van bestanden dynamisch aangepast worden afhankelijk van de locatie was het echter nodig om [http://bindfs.org/ BindFS] te patchen.&lt;br /&gt;
&lt;br /&gt;
== Gebruikte opties van BindFS ==&lt;br /&gt;
&lt;br /&gt;
Als we kijken naar de /etc/fstab van een systeem dat [http://bindfs.org/ BindFS] gebruikt zien we de volgende opties.&lt;br /&gt;
&lt;br /&gt;
*chmod-filter=g+rwD: Zorgt ervoor dat als er een chmod plaats vind op een file altijd de bits g+rw voor files en g+rwx voor directories geset worden. Een chmod 600 wordt dan bijvoorbeeld uitgevoerd als chmod 660 op de achtergrond.&lt;br /&gt;
*create-with-perms=g+rwD: Permissies worden aangemaakt met g+rwD rechten.&lt;br /&gt;
*perms=g+rwD: Bestaande bestanden worden gepresenteerd alsof ze g+rwD rechten hebben, ook al hoeft dat op de originele locatie niet zo te zijn.&lt;br /&gt;
*chgrp-ignore: Negeer chgrp commando's. Dit is nodig omdat programma's als mv of google-chrome anders handmatig de group verkeerd zetten. Dit heeft wel als side effect dat handmatig rechten goedzetten dus ook niet meer kan.&lt;br /&gt;
*nonempty: Zorgt ervoor dat [http://fuse.sourceforge.net/ Fuse] de directory in een niet lege directory kan mounten.&lt;br /&gt;
*noauto: Eerst moeten de home directories in /mnt/home gemount worden, voordat [http://bindfs.org/ BindFS] deze weer in /home kan mounten. Dit wordt gedaan door het script /usr/local/sbin/mount-dirs dat via een service gerund wordt. Deze service start pas nadat netwerk-file systems gemount zijn.&lt;br /&gt;
&lt;br /&gt;
== Custom BindFS patch ==&lt;br /&gt;
&lt;br /&gt;
Met BindFS is het mogelijk om een enkele user en group te forcen, maar in ons geval willen we dit dynamisch doen, afhankelijk van de locatie van het bestand. Er is dus al code om een group-id te force'n, dus het enige wat gedaan moet worden is dit dynamisch te maken. Allereerst wordt bij het opstarten gekeken of de destination van de mount /home/iba, /home/cies, /home/bestuur of /home/extern is en alleen dan gebruiken we permission enforcement (settings.use_permission_enforcement). Er is gekozen om 4 aparte mountpoints te maken, zodat mv's nu cross-file systems zijn en dus geen rename meer zijn. Verder willen we ook geen permissies enforcen op de /home. Daarna wordt in de chown_new_file functie gekeken of de settings.use_permission_enforcement bit geset is en zoja, dan kijken we naar de directory van de file met behulp van een regex en zoeken we de bijbehorende group-id. Hierbij wordt als vuistregel gebruikt dat de naam van de top directory ook de group-name is. Dit levert problemen op als de naam van de homedir van een cie anders is dan de group-name.&lt;br /&gt;
&amp;lt;pre&amp;gt;@@ -63,6 +63,8 @@&lt;br /&gt;
 #ifdef HAVE_SETXATTR&lt;br /&gt;
 #include &amp;lt;sys/xattr.h&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
+#include &amp;lt;linux/limits.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;regex.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;fuse.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;fuse_opt.h&amp;gt;&lt;br /&gt;
@@ -141,6 +143,9 @@ static struct Settings {&lt;br /&gt;
     int ctime_from_mtime;&lt;br /&gt;
     int hide_hard_links;&lt;br /&gt;
 &lt;br /&gt;
+    //Custom made for sysop&lt;br /&gt;
+    int use_permission_enforcement;&lt;br /&gt;
+&lt;br /&gt;
 } settings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -306,6 +311,41 @@ static int getattr_common(const char *pr&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+int get_gid(const char *path) {&lt;br /&gt;
+&lt;br /&gt;
+  regex_t regex;&lt;br /&gt;
+  int reti;&lt;br /&gt;
+&lt;br /&gt;
+  regmatch_t matches[2];&lt;br /&gt;
+&lt;br /&gt;
+//  reti = regcomp(&amp;amp;regex,&amp;quot;^/home/(cies|extern|iba|bestuur)/([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  reti = regcomp(&amp;amp;regex,&amp;quot;^([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  if (reti) {&lt;br /&gt;
+    fprintf(stderr, &amp;quot;Could not compile regex\n&amp;quot;);&lt;br /&gt;
+    regfree(&amp;amp;regex);&lt;br /&gt;
+    return -1;&lt;br /&gt;
+  }&lt;br /&gt;
+  reti = regexec(&amp;amp;regex, path, 2, matches, 0);&lt;br /&gt;
+  int return_value = -1;&lt;br /&gt;
+  if (!reti) {&lt;br /&gt;
+    int match_size = matches[1].rm_eo - matches[1].rm_so;&lt;br /&gt;
+    char *matchgroup = malloc(sizeof(char) * (1+match_size));&lt;br /&gt;
+    matchgroup[match_size] = '\0';&lt;br /&gt;
+    memcpy(matchgroup,&amp;amp;path[matches[1].rm_so],match_size);&lt;br /&gt;
+    struct group *group_info = getgrnam(matchgroup);&lt;br /&gt;
+    if (group_info == NULL) {&lt;br /&gt;
+      return_value = -1;&lt;br /&gt;
+    } else {&lt;br /&gt;
+      return_value = group_info-&amp;gt;gr_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    free(matchgroup);&lt;br /&gt;
+  }&lt;br /&gt;
+  regfree(&amp;amp;regex);&lt;br /&gt;
+  return return_value;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
 /* FIXME: another thread may race to see the old owner before the chown is done.&lt;br /&gt;
           Is there a scenario where this compromises security? Or application correctness? */&lt;br /&gt;
 static void chown_new_file(const char *path, struct fuse_context *fc, int (*chown_func)(const char*, uid_t, gid_t))&lt;br /&gt;
@@ -339,6 +379,14 @@ static void chown_new_file(const char *p&lt;br /&gt;
     if (settings.create_for_gid&amp;amp;nbsp;!= -1)&lt;br /&gt;
         file_group = settings.create_for_gid;&lt;br /&gt;
 &lt;br /&gt;
+    //printf(&amp;quot;Old file permission:&amp;amp;nbsp;%d&amp;amp;nbsp;%d\n&amp;quot;,settings.use_permission_enforcement,file_group);&lt;br /&gt;
+    if (settings.use_permission_enforcement) {&lt;br /&gt;
+        &lt;br /&gt;
+        int new_gid = get_gid(path);&lt;br /&gt;
+        //printf(&amp;quot;New file permssion:&amp;amp;nbsp;%d\n&amp;quot;,new_gid);&lt;br /&gt;
+        file_group = new_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
     if ((file_owner&amp;amp;nbsp;!= -1) || (file_group&amp;amp;nbsp;!= -1)) {&lt;br /&gt;
         if (chown_func(path, file_owner, file_group) == -1) {&lt;br /&gt;
             DPRINTF(&amp;quot;Failed to chown new file or directory (%d)&amp;quot;, errno);&lt;br /&gt;
@@ -1670,6 +1718,13 @@ int main(int argc, char *argv[])&lt;br /&gt;
         bindfs_oper.listxattr = NULL;&lt;br /&gt;
         bindfs_oper.removexattr = NULL;&lt;br /&gt;
     }&lt;br /&gt;
+    if (strcmp(settings.mntdest,&amp;quot;/home/iba&amp;quot;) || &lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/cies&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/bestuur&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/extern&amp;quot;)) {&lt;br /&gt;
+        settings.use_permission_enforcement = 1;&lt;br /&gt;
+    }&lt;br /&gt;
+    &lt;br /&gt;
 &lt;br /&gt;
     /* fuse_main will daemonize by fork()'ing. The signal handler will persist. */&lt;br /&gt;
     setup_signal_handling();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: Locatie waar de code terug te vinden is. (Wat is een handige plek?)&lt;br /&gt;
&lt;br /&gt;
== Compilatie, debuggen, deployment ==&lt;br /&gt;
De code bevat een Makefile, dus kan gewoon gecompileerd worden met de standaard ./configure en make. De binary is een executable met de naam &amp;quot;bindfs&amp;quot;. Als deze neergezet wordt in een locatie in het systeempath zoals /usr/bin/ wordt deze automatisch herkend en gebruikt als je als vstype fuse.bindfs opgeeft met mount.&amp;lt;pre&amp;gt;mount -t fuse.bindfs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor compilatie zijn een standaard c compiler (zowel gcc als clang werkt) nodig en de package fuse-devel. Indien gecompileerd wordt op een CentOS 7 machine dan is deze executable niet te gebruiken op CentOS 6 vanwege een verouderde libc versie, andersom werkt wel. De executable kan ook eenvoudig gedebugd worden door een handmatige mount te doen met de -D optie.&amp;lt;pre&amp;gt;/usr/bin/bindfs -d -o chmod-filter=g+rwD,create-with-perms=g+rwD,perms=g+rwD,chgrp-ignore,nonempty /mnt/home/ /home&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs</id>
		<title>Bindfs</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs"/>
				<updated>2015-06-03T12:06:33Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:BindFS}} Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de '''umask''' op ''0002'' te zetten, waardoor bestanden en directories altijd group writeable zijn. Dit gaat echter nog altijd fout in een aantal scenario's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sommige programma's zoals google-chrome downloaden bestanden altijd met rechten 640 als user:primary-group, ongeacht umask en of de directory de set group-id bit heeft. Bij het downloaden van bestanden direct naar een comissiemap gaat dit dan fout.&lt;br /&gt;
*Een mv is in feite een rename en daarbij worden de rechten e.d. niet aangepast. Als iemand een file mv'ed van zijn homedir naar het commissieaccount heeft hij dus nog de oude rechten en kan de commissie er niet bij.&lt;br /&gt;
*Bij een cp wordt er wel gekeken naar zaken als setgid bits, maar worden de rechten wel meegekopieerd, wat een probleem kan zijn als het origineel niet group-writeable is.&lt;br /&gt;
&lt;br /&gt;
De enige manier om bovenstaande problemen structureel op te lossen is om deze permissies hard op file system niveau af te dwingen. Hiervoor wordt [http://bindfs.org/ BindFS] gebruikt. Dit is een [http://fuse.sourceforge.net/ Fuse] file system waarmee een directory op een andere plek gemount kan worden, net zoals bij ''mount --bind'', maar waarbij de permissies ook nog aangepast kunnen worden. Om echter te zorgen dat de permissies van bestanden dynamisch aangepast worden afhankelijk van de locatie was het echter nodig om [http://bindfs.org/ BindFS] te patchen.&lt;br /&gt;
&lt;br /&gt;
== Gebruikte opties van BindFS ==&lt;br /&gt;
&lt;br /&gt;
Als we kijken naar de /etc/fstab van een systeem dat [http://bindfs.org/ BindFS] gebruikt zien we de volgende opties.&lt;br /&gt;
&lt;br /&gt;
*chmod-filter=g+rwD: Zorgt ervoor dat als er een chmod plaats vind op een file altijd de bits g+rw voor files en g+rwx voor directories geset worden. Een chmod 600 wordt dan bijvoorbeeld uitgevoerd als chmod 660 op de achtergrond.&lt;br /&gt;
*create-with-perms=g+rwD: Permissies worden aangemaakt met g+rwD rechten.&lt;br /&gt;
*perms=g+rwD: Bestaande bestanden worden gepresenteerd alsof ze g+rwD rechten hebben, ook al hoeft dat op de originele locatie niet zo te zijn.&lt;br /&gt;
*chgrp-ignore: Negeer chgrp commando's. Dit is nodig omdat programma's als mv of google-chrome anders handmatig de group verkeerd zetten. Dit heeft wel als side effect dat handmatig rechten goedzetten dus ook niet meer kan.&lt;br /&gt;
*nonempty: Zorgt ervoor dat [http://fuse.sourceforge.net/ Fuse] de directory in een niet lege directory kan mounten.&lt;br /&gt;
*noauto: Eerst moeten de home directories in /mnt/home gemount worden, voordat [http://bindfs.org/ BindFS] deze weer in /home kan mounten. Dit wordt gedaan door het script /usr/local/sbin/mount-dirs dat via een service gerund wordt. Deze service start pas nadat netwerk-file systems gemount zijn.&lt;br /&gt;
&lt;br /&gt;
== Custom BindFS patch ==&lt;br /&gt;
&lt;br /&gt;
Met BindFS is het mogelijk om een enkele user en group te forcen, maar in ons geval willen we dit dynamisch doen, afhankelijk van de locatie van het bestand. Er is dus al code om een group-id te force'n, dus het enige wat gedaan moet worden is dit dynamisch te maken. Allereerst wordt bij het opstarten gekeken of de destination van de mount /home/iba, /home/cies, /home/bestuur of /home/extern is en alleen dan gebruiken we permission enforcement (settings.use_permission_enforcement). Er is gekozen om 4 aparte mountpoints te maken, zodat mv's nu cross-file systems zijn en dus geen rename meer zijn. Verder willen we ook geen permissies enforcen op de /home. Daarna wordt in de chown_new_file functie gekeken of de settings.use_permission_enforcement bit geset is en zoja, dan kijken we naar de directory van de file met behulp van een regex en zoeken we de bijbehorende group-id. Hierbij wordt als vuistregel gebruikt dat de naam van de top directory ook de group-name is. Dit levert problemen op als de naam van de homedir van een cie anders is dan de group-name.&lt;br /&gt;
&amp;lt;pre&amp;gt;@@ -63,6 +63,8 @@&lt;br /&gt;
 #ifdef HAVE_SETXATTR&lt;br /&gt;
 #include &amp;lt;sys/xattr.h&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
+#include &amp;lt;linux/limits.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;regex.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;fuse.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;fuse_opt.h&amp;gt;&lt;br /&gt;
@@ -141,6 +143,9 @@ static struct Settings {&lt;br /&gt;
     int ctime_from_mtime;&lt;br /&gt;
     int hide_hard_links;&lt;br /&gt;
 &lt;br /&gt;
+    //Custom made for sysop&lt;br /&gt;
+    int use_permission_enforcement;&lt;br /&gt;
+&lt;br /&gt;
 } settings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -306,6 +311,41 @@ static int getattr_common(const char *pr&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+int get_gid(const char *path) {&lt;br /&gt;
+&lt;br /&gt;
+  regex_t regex;&lt;br /&gt;
+  int reti;&lt;br /&gt;
+&lt;br /&gt;
+  regmatch_t matches[2];&lt;br /&gt;
+&lt;br /&gt;
+//  reti = regcomp(&amp;amp;regex,&amp;quot;^/home/(cies|extern|iba|bestuur)/([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  reti = regcomp(&amp;amp;regex,&amp;quot;^([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  if (reti) {&lt;br /&gt;
+    fprintf(stderr, &amp;quot;Could not compile regex\n&amp;quot;);&lt;br /&gt;
+    regfree(&amp;amp;regex);&lt;br /&gt;
+    return -1;&lt;br /&gt;
+  }&lt;br /&gt;
+  reti = regexec(&amp;amp;regex, path, 2, matches, 0);&lt;br /&gt;
+  int return_value = -1;&lt;br /&gt;
+  if (!reti) {&lt;br /&gt;
+    int match_size = matches[1].rm_eo - matches[1].rm_so;&lt;br /&gt;
+    char *matchgroup = malloc(sizeof(char) * (1+match_size));&lt;br /&gt;
+    matchgroup[match_size] = '\0';&lt;br /&gt;
+    memcpy(matchgroup,&amp;amp;path[matches[1].rm_so],match_size);&lt;br /&gt;
+    struct group *group_info = getgrnam(matchgroup);&lt;br /&gt;
+    if (group_info == NULL) {&lt;br /&gt;
+      return_value = -1;&lt;br /&gt;
+    } else {&lt;br /&gt;
+      return_value = group_info-&amp;gt;gr_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    free(matchgroup);&lt;br /&gt;
+  }&lt;br /&gt;
+  regfree(&amp;amp;regex);&lt;br /&gt;
+  return return_value;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
 /* FIXME: another thread may race to see the old owner before the chown is done.&lt;br /&gt;
           Is there a scenario where this compromises security? Or application correctness? */&lt;br /&gt;
 static void chown_new_file(const char *path, struct fuse_context *fc, int (*chown_func)(const char*, uid_t, gid_t))&lt;br /&gt;
@@ -339,6 +379,14 @@ static void chown_new_file(const char *p&lt;br /&gt;
     if (settings.create_for_gid&amp;amp;nbsp;!= -1)&lt;br /&gt;
         file_group = settings.create_for_gid;&lt;br /&gt;
 &lt;br /&gt;
+    //printf(&amp;quot;Old file permission:&amp;amp;nbsp;%d&amp;amp;nbsp;%d\n&amp;quot;,settings.use_permission_enforcement,file_group);&lt;br /&gt;
+    if (settings.use_permission_enforcement) {&lt;br /&gt;
+        &lt;br /&gt;
+        int new_gid = get_gid(path);&lt;br /&gt;
+        //printf(&amp;quot;New file permssion:&amp;amp;nbsp;%d\n&amp;quot;,new_gid);&lt;br /&gt;
+        file_group = new_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
     if ((file_owner&amp;amp;nbsp;!= -1) || (file_group&amp;amp;nbsp;!= -1)) {&lt;br /&gt;
         if (chown_func(path, file_owner, file_group) == -1) {&lt;br /&gt;
             DPRINTF(&amp;quot;Failed to chown new file or directory (%d)&amp;quot;, errno);&lt;br /&gt;
@@ -1670,6 +1718,13 @@ int main(int argc, char *argv[])&lt;br /&gt;
         bindfs_oper.listxattr = NULL;&lt;br /&gt;
         bindfs_oper.removexattr = NULL;&lt;br /&gt;
     }&lt;br /&gt;
+    if (strcmp(settings.mntdest,&amp;quot;/home/iba&amp;quot;) || &lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/cies&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/bestuur&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/extern&amp;quot;)) {&lt;br /&gt;
+        settings.use_permission_enforcement = 1;&lt;br /&gt;
+    }&lt;br /&gt;
+    &lt;br /&gt;
 &lt;br /&gt;
     /* fuse_main will daemonize by fork()'ing. The signal handler will persist. */&lt;br /&gt;
     setup_signal_handling();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: Locatie waar de code terug te vinden is. (Wat is een handige plek?)&lt;br /&gt;
&lt;br /&gt;
== Compilatie, debuggen, deployment ==&lt;br /&gt;
De code bevat een Makefile, dus kan gewoon gecompileerd worden met de standaard ./configure en make. De binary is een executable met de naam &amp;quot;bindfs&amp;quot;. Als deze neergezet wordt in een locatie in het systeempath zoals /usr/bin/ wordt deze automatisch herkend en gebruikt als je als vstype fuse.bindfs opgeeft met mount.&amp;lt;pre&amp;gt;mount -t fuse.bindfs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor compilatie zijn een standaard c compiler (zowel gcc als clang werkt) nodig en de package fuse-devel. Indien gecompileerd wordt op een CentOS 7 machine dan is deze executable niet te gebruiken op CentOS 6 vanwege een verouderde libc versie, andersom werkt wel. De executable kan ook eenvoudig gedebugd worden door een handmatige mount te doen met de -D optie.&amp;lt;pre&amp;gt;/usr/bin/bindfs -d -o chmod-filter=g+rwD,create-with-perms=g+rwD,perms=g+rwD,chgrp-ignore,nonempty /mnt/home/ /home&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs</id>
		<title>Bindfs</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs"/>
				<updated>2015-06-03T12:05:34Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:BindFS}}&lt;br /&gt;
Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de '''umask''' op ''0002'' te zetten, waardoor bestanden en directories altijd group writeable zijn. Dit gaat echter nog altijd fout in een aantal scenario's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sommige programma's zoals google-chrome downloaden bestanden altijd met rechten 640 als user:primary-group, ongeacht umask en of de directory de set group-id bit heeft. Bij het downloaden van bestanden direct naar een comissiemap gaat dit dan fout.&lt;br /&gt;
*Een mv is in feite een rename en daarbij worden de rechten e.d. niet aangepast. Als iemand een file mv'ed van zijn homedir naar het commissieaccount heeft hij dus nog de oude rechten en kan de commissie er niet bij.&lt;br /&gt;
*Bij een cp wordt er wel gekeken naar zaken als setgid bits, maar worden de rechten wel meegekopieerd, wat een probleem kan zijn als het origineel niet group-writeable is.&lt;br /&gt;
&lt;br /&gt;
De enige manier om bovenstaande problemen structureel op te lossen is om deze permissies hard op file system niveau af te dwingen. Hiervoor wordt [http://bindfs.org/ BindFS] gebruikt. Dit is een [http://fuse.sourceforge.net/ Fuse] file system waarmee een directory op een andere plek gemount kan worden, net zoals bij ''mount --bind'', maar waarbij de permissies ook nog aangepast kunnen worden. Om echter te zorgen dat de permissies van bestanden dynamisch aangepast worden afhankelijk van de locatie was het echter nodig om [http://bindfs.org/ BindFS] te patchen.&lt;br /&gt;
&lt;br /&gt;
== Gebruikte opties van BindFS ==&lt;br /&gt;
&lt;br /&gt;
Als we kijken naar de /etc/fstab van een systeem dat [http://bindfs.org/ BindFS] gebruikt zien we de volgende opties.&lt;br /&gt;
&lt;br /&gt;
*chmod-filter=g+rwD: Zorgt ervoor dat als er een chmod plaats vind op een file altijd de bits g+rw voor files en g+rwx voor directories geset worden. Een chmod 600 wordt dan bijvoorbeeld uitgevoerd als chmod 660 op de achtergrond.&lt;br /&gt;
*create-with-perms=g+rwD: Permissies worden aangemaakt met g+rwD rechten.&lt;br /&gt;
*perms=g+rwD: Bestaande bestanden worden gepresenteerd alsof ze g+rwD rechten hebben, ook al hoeft dat op de originele locatie niet zo te zijn.&lt;br /&gt;
*chgrp-ignore: Negeer chgrp commando's. Dit is nodig omdat programma's als mv of google-chrome anders handmatig de group verkeerd zetten. Dit heeft wel als side effect dat handmatig rechten goedzetten dus ook niet meer kan.&lt;br /&gt;
*nonempty: Zorgt ervoor dat [http://fuse.sourceforge.net/ Fuse] de directory in een niet lege directory kan mounten.&lt;br /&gt;
*noauto: Eerst moeten de home directories in /mnt/home gemount worden, voordat [http://bindfs.org/ BindFS] deze weer in /home kan mounten. Dit wordt gedaan door het script /usr/local/sbin/mount-dirs dat via een service gerund wordt. Deze service start pas nadat netwerk-file systems gemount zijn.&lt;br /&gt;
&lt;br /&gt;
== Custom BindFS patch ==&lt;br /&gt;
&lt;br /&gt;
Met BindFS is het mogelijk om een enkele user en group te forcen, maar in ons geval willen we dit dynamisch doen, afhankelijk van de locatie van het bestand. Er is dus al code om een group-id te force'n, dus het enige wat gedaan moet worden is dit dynamisch te maken. Allereerst wordt bij het opstarten gekeken of de destination van de mount /home/iba, /home/cies, /home/bestuur of /home/extern is en alleen dan gebruiken we permission enforcement (settings.use_permission_enforcement). Er is gekozen om 4 aparte mountpoints te maken, zodat mv's nu cross-file systems zijn en dus geen rename meer zijn. Verder willen we ook geen permissies enforcen op de /home. Daarna wordt in de chown_new_file functie gekeken of de settings.use_permission_enforcement bit geset is en zoja, dan kijken we naar de directory van de file met behulp van een regex en zoeken we de bijbehorende group-id. Hierbij wordt als vuistregel gebruikt dat de naam van de top directory ook de group-name is. Dit levert problemen op als de naam van de homedir van een cie anders is dan de group-name.&lt;br /&gt;
&amp;lt;pre&amp;gt;@@ -63,6 +63,8 @@&lt;br /&gt;
 #ifdef HAVE_SETXATTR&lt;br /&gt;
 #include &amp;lt;sys/xattr.h&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
+#include &amp;lt;linux/limits.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;regex.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;fuse.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;fuse_opt.h&amp;gt;&lt;br /&gt;
@@ -141,6 +143,9 @@ static struct Settings {&lt;br /&gt;
     int ctime_from_mtime;&lt;br /&gt;
     int hide_hard_links;&lt;br /&gt;
 &lt;br /&gt;
+    //Custom made for sysop&lt;br /&gt;
+    int use_permission_enforcement;&lt;br /&gt;
+&lt;br /&gt;
 } settings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -306,6 +311,41 @@ static int getattr_common(const char *pr&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+int get_gid(const char *path) {&lt;br /&gt;
+&lt;br /&gt;
+  regex_t regex;&lt;br /&gt;
+  int reti;&lt;br /&gt;
+&lt;br /&gt;
+  regmatch_t matches[2];&lt;br /&gt;
+&lt;br /&gt;
+//  reti = regcomp(&amp;amp;regex,&amp;quot;^/home/(cies|extern|iba|bestuur)/([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  reti = regcomp(&amp;amp;regex,&amp;quot;^([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  if (reti) {&lt;br /&gt;
+    fprintf(stderr, &amp;quot;Could not compile regex\n&amp;quot;);&lt;br /&gt;
+    regfree(&amp;amp;regex);&lt;br /&gt;
+    return -1;&lt;br /&gt;
+  }&lt;br /&gt;
+  reti = regexec(&amp;amp;regex, path, 2, matches, 0);&lt;br /&gt;
+  int return_value = -1;&lt;br /&gt;
+  if (!reti) {&lt;br /&gt;
+    int match_size = matches[1].rm_eo - matches[1].rm_so;&lt;br /&gt;
+    char *matchgroup = malloc(sizeof(char) * (1+match_size));&lt;br /&gt;
+    matchgroup[match_size] = '\0';&lt;br /&gt;
+    memcpy(matchgroup,&amp;amp;path[matches[1].rm_so],match_size);&lt;br /&gt;
+    struct group *group_info = getgrnam(matchgroup);&lt;br /&gt;
+    if (group_info == NULL) {&lt;br /&gt;
+      return_value = -1;&lt;br /&gt;
+    } else {&lt;br /&gt;
+      return_value = group_info-&amp;gt;gr_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    free(matchgroup);&lt;br /&gt;
+  }&lt;br /&gt;
+  regfree(&amp;amp;regex);&lt;br /&gt;
+  return return_value;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
 /* FIXME: another thread may race to see the old owner before the chown is done.&lt;br /&gt;
           Is there a scenario where this compromises security? Or application correctness? */&lt;br /&gt;
 static void chown_new_file(const char *path, struct fuse_context *fc, int (*chown_func)(const char*, uid_t, gid_t))&lt;br /&gt;
@@ -339,6 +379,14 @@ static void chown_new_file(const char *p&lt;br /&gt;
     if (settings.create_for_gid&amp;amp;nbsp;!= -1)&lt;br /&gt;
         file_group = settings.create_for_gid;&lt;br /&gt;
 &lt;br /&gt;
+    //printf(&amp;quot;Old file permission:&amp;amp;nbsp;%d&amp;amp;nbsp;%d\n&amp;quot;,settings.use_permission_enforcement,file_group);&lt;br /&gt;
+    if (settings.use_permission_enforcement) {&lt;br /&gt;
+        &lt;br /&gt;
+        int new_gid = get_gid(path);&lt;br /&gt;
+        //printf(&amp;quot;New file permssion:&amp;amp;nbsp;%d\n&amp;quot;,new_gid);&lt;br /&gt;
+        file_group = new_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
     if ((file_owner&amp;amp;nbsp;!= -1) || (file_group&amp;amp;nbsp;!= -1)) {&lt;br /&gt;
         if (chown_func(path, file_owner, file_group) == -1) {&lt;br /&gt;
             DPRINTF(&amp;quot;Failed to chown new file or directory (%d)&amp;quot;, errno);&lt;br /&gt;
@@ -1670,6 +1718,13 @@ int main(int argc, char *argv[])&lt;br /&gt;
         bindfs_oper.listxattr = NULL;&lt;br /&gt;
         bindfs_oper.removexattr = NULL;&lt;br /&gt;
     }&lt;br /&gt;
+    if (strcmp(settings.mntdest,&amp;quot;/home/iba&amp;quot;) || &lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/cies&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/bestuur&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/extern&amp;quot;)) {&lt;br /&gt;
+        settings.use_permission_enforcement = 1;&lt;br /&gt;
+    }&lt;br /&gt;
+    &lt;br /&gt;
 &lt;br /&gt;
     /* fuse_main will daemonize by fork()'ing. The signal handler will persist. */&lt;br /&gt;
     setup_signal_handling();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: Locatie waar de code terug te vinden is. (Wat is een handige plek?)&lt;br /&gt;
&lt;br /&gt;
== Compilatie, debuggen, deployment ==&lt;br /&gt;
De code bevat een Makefile, dus kan gewoon gecompileerd worden met de standaard ./configure en make. De binary is een executable met de naam &amp;quot;bindfs&amp;quot;. Als deze neergezet wordt in een locatie in het systeempath zoals /usr/bin/ wordt deze automatisch herkend en gebruikt als je als vstype fuse.bindfs opgeeft met mount.&amp;lt;pre&amp;gt;mount -t fuse.bindfs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor compilatie zijn een standaard c compiler (zowel gcc als clang werkt) nodig en de package fuse-devel. Indien gecompileerd wordt op een CentOS 7 machine dan is deze executable niet te gebruiken op CentOS 6 vanwege een verouderde libc versie, andersom werkt wel. De executable kan ook eenvoudig gedebugd worden door een handmatige mount te doen met de -D optie.&amp;lt;pre&amp;gt;/usr/sbin/bindfs -d -o chmod-filter=g+rwD,create-with-perms=g+rwD,perms=g+rwD,chgrp-ignore,nonempty /mnt/home/ /home&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Sysop]]&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs</id>
		<title>Bindfs</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bindfs"/>
				<updated>2015-06-03T12:04:06Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: Created page with &amp;quot;Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de ''...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Op een aantal plekken op het A-Eskwadraat systeem wordt [http://bindfs.org/ BindFS] gebruikt om permissies van commissies e.d. goed te houden. Eerst werd dit gedaan door de '''umask''' op ''0002'' te zetten, waardoor bestanden en directories altijd group writeable zijn. Dit gaat echter nog altijd fout in een aantal scenario's.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*Sommige programma's zoals google-chrome downloaden bestanden altijd met rechten 640 als user:primary-group, ongeacht umask en of de directory de set group-id bit heeft. Bij het downloaden van bestanden direct naar een comissiemap gaat dit dan fout.&lt;br /&gt;
*Een mv is in feite een rename en daarbij worden de rechten e.d. niet aangepast. Als iemand een file mv'ed van zijn homedir naar het commissieaccount heeft hij dus nog de oude rechten en kan de commissie er niet bij.&lt;br /&gt;
*Bij een cp wordt er wel gekeken naar zaken als setgid bits, maar worden de rechten wel meegekopieerd, wat een probleem kan zijn als het origineel niet group-writeable is.&lt;br /&gt;
&lt;br /&gt;
De enige manier om bovenstaande problemen structureel op te lossen is om deze permissies hard op file system niveau af te dwingen. Hiervoor wordt [http://bindfs.org/ BindFS] gebruikt. Dit is een [http://fuse.sourceforge.net/ Fuse] file system waarmee een directory op een andere plek gemount kan worden, net zoals bij ''mount --bind'', maar waarbij de permissies ook nog aangepast kunnen worden. Om echter te zorgen dat de permissies van bestanden dynamisch aangepast worden afhankelijk van de locatie was het echter nodig om [http://bindfs.org/ BindFS] te patchen.&lt;br /&gt;
&lt;br /&gt;
== Gebruikte opties van BindFS ==&lt;br /&gt;
&lt;br /&gt;
Als we kijken naar de /etc/fstab van een systeem dat [http://bindfs.org/ BindFS] gebruikt zien we de volgende opties.&lt;br /&gt;
&lt;br /&gt;
*chmod-filter=g+rwD: Zorgt ervoor dat als er een chmod plaats vind op een file altijd de bits g+rw voor files en g+rwx voor directories geset worden. Een chmod 600 wordt dan bijvoorbeeld uitgevoerd als chmod 660 op de achtergrond.&lt;br /&gt;
*create-with-perms=g+rwD: Permissies worden aangemaakt met g+rwD rechten.&lt;br /&gt;
*perms=g+rwD: Bestaande bestanden worden gepresenteerd alsof ze g+rwD rechten hebben, ook al hoeft dat op de originele locatie niet zo te zijn.&lt;br /&gt;
*chgrp-ignore: Negeer chgrp commando's. Dit is nodig omdat programma's als mv of google-chrome anders handmatig de group verkeerd zetten. Dit heeft wel als side effect dat handmatig rechten goedzetten dus ook niet meer kan.&lt;br /&gt;
*nonempty: Zorgt ervoor dat [http://fuse.sourceforge.net/ Fuse] de directory in een niet lege directory kan mounten.&lt;br /&gt;
*noauto: Eerst moeten de home directories in /mnt/home gemount worden, voordat [http://bindfs.org/ BindFS] deze weer in /home kan mounten. Dit wordt gedaan door het script /usr/local/sbin/mount-dirs dat via een service gerund wordt. Deze service start pas nadat netwerk-file systems gemount zijn.&lt;br /&gt;
&lt;br /&gt;
== Custom BindFS patch ==&lt;br /&gt;
&lt;br /&gt;
Met BindFS is het mogelijk om een enkele user en group te forcen, maar in ons geval willen we dit dynamisch doen, afhankelijk van de locatie van het bestand. Er is dus al code om een group-id te force'n, dus het enige wat gedaan moet worden is dit dynamisch te maken. Allereerst wordt bij het opstarten gekeken of de destination van de mount /home/iba, /home/cies, /home/bestuur of /home/extern is en alleen dan gebruiken we permission enforcement (settings.use_permission_enforcement). Er is gekozen om 4 aparte mountpoints te maken, zodat mv's nu cross-file systems zijn en dus geen rename meer zijn. Verder willen we ook geen permissies enforcen op de /home. Daarna wordt in de chown_new_file functie gekeken of de settings.use_permission_enforcement bit geset is en zoja, dan kijken we naar de directory van de file met behulp van een regex en zoeken we de bijbehorende group-id. Hierbij wordt als vuistregel gebruikt dat de naam van de top directory ook de group-name is. Dit levert problemen op als de naam van de homedir van een cie anders is dan de group-name.&lt;br /&gt;
&amp;lt;pre&amp;gt;@@ -63,6 +63,8 @@&lt;br /&gt;
 #ifdef HAVE_SETXATTR&lt;br /&gt;
 #include &amp;lt;sys/xattr.h&amp;gt;&lt;br /&gt;
 #endif&lt;br /&gt;
+#include &amp;lt;linux/limits.h&amp;gt;&lt;br /&gt;
+#include &amp;lt;regex.h&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;lt;fuse.h&amp;gt;&lt;br /&gt;
 #include &amp;lt;fuse_opt.h&amp;gt;&lt;br /&gt;
@@ -141,6 +143,9 @@ static struct Settings {&lt;br /&gt;
     int ctime_from_mtime;&lt;br /&gt;
     int hide_hard_links;&lt;br /&gt;
 &lt;br /&gt;
+    //Custom made for sysop&lt;br /&gt;
+    int use_permission_enforcement;&lt;br /&gt;
+&lt;br /&gt;
 } settings;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
@@ -306,6 +311,41 @@ static int getattr_common(const char *pr&lt;br /&gt;
     return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
+int get_gid(const char *path) {&lt;br /&gt;
+&lt;br /&gt;
+  regex_t regex;&lt;br /&gt;
+  int reti;&lt;br /&gt;
+&lt;br /&gt;
+  regmatch_t matches[2];&lt;br /&gt;
+&lt;br /&gt;
+//  reti = regcomp(&amp;amp;regex,&amp;quot;^/home/(cies|extern|iba|bestuur)/([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  reti = regcomp(&amp;amp;regex,&amp;quot;^([^/]+)&amp;quot;, REG_EXTENDED);&lt;br /&gt;
+  if (reti) {&lt;br /&gt;
+    fprintf(stderr, &amp;quot;Could not compile regex\n&amp;quot;);&lt;br /&gt;
+    regfree(&amp;amp;regex);&lt;br /&gt;
+    return -1;&lt;br /&gt;
+  }&lt;br /&gt;
+  reti = regexec(&amp;amp;regex, path, 2, matches, 0);&lt;br /&gt;
+  int return_value = -1;&lt;br /&gt;
+  if (!reti) {&lt;br /&gt;
+    int match_size = matches[1].rm_eo - matches[1].rm_so;&lt;br /&gt;
+    char *matchgroup = malloc(sizeof(char) * (1+match_size));&lt;br /&gt;
+    matchgroup[match_size] = '\0';&lt;br /&gt;
+    memcpy(matchgroup,&amp;amp;path[matches[1].rm_so],match_size);&lt;br /&gt;
+    struct group *group_info = getgrnam(matchgroup);&lt;br /&gt;
+    if (group_info == NULL) {&lt;br /&gt;
+      return_value = -1;&lt;br /&gt;
+    } else {&lt;br /&gt;
+      return_value = group_info-&amp;gt;gr_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
+    free(matchgroup);&lt;br /&gt;
+  }&lt;br /&gt;
+  regfree(&amp;amp;regex);&lt;br /&gt;
+  return return_value;&lt;br /&gt;
+}&lt;br /&gt;
+&lt;br /&gt;
+&lt;br /&gt;
 /* FIXME: another thread may race to see the old owner before the chown is done.&lt;br /&gt;
           Is there a scenario where this compromises security? Or application correctness? */&lt;br /&gt;
 static void chown_new_file(const char *path, struct fuse_context *fc, int (*chown_func)(const char*, uid_t, gid_t))&lt;br /&gt;
@@ -339,6 +379,14 @@ static void chown_new_file(const char *p&lt;br /&gt;
     if (settings.create_for_gid&amp;amp;nbsp;!= -1)&lt;br /&gt;
         file_group = settings.create_for_gid;&lt;br /&gt;
 &lt;br /&gt;
+    //printf(&amp;quot;Old file permission:&amp;amp;nbsp;%d&amp;amp;nbsp;%d\n&amp;quot;,settings.use_permission_enforcement,file_group);&lt;br /&gt;
+    if (settings.use_permission_enforcement) {&lt;br /&gt;
+        &lt;br /&gt;
+        int new_gid = get_gid(path);&lt;br /&gt;
+        //printf(&amp;quot;New file permssion:&amp;amp;nbsp;%d\n&amp;quot;,new_gid);&lt;br /&gt;
+        file_group = new_gid;&lt;br /&gt;
+    }&lt;br /&gt;
+&lt;br /&gt;
     if ((file_owner&amp;amp;nbsp;!= -1) || (file_group&amp;amp;nbsp;!= -1)) {&lt;br /&gt;
         if (chown_func(path, file_owner, file_group) == -1) {&lt;br /&gt;
             DPRINTF(&amp;quot;Failed to chown new file or directory (%d)&amp;quot;, errno);&lt;br /&gt;
@@ -1670,6 +1718,13 @@ int main(int argc, char *argv[])&lt;br /&gt;
         bindfs_oper.listxattr = NULL;&lt;br /&gt;
         bindfs_oper.removexattr = NULL;&lt;br /&gt;
     }&lt;br /&gt;
+    if (strcmp(settings.mntdest,&amp;quot;/home/iba&amp;quot;) || &lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/cies&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/bestuur&amp;quot;) ||&lt;br /&gt;
+        strcmp(settings.mntdest,&amp;quot;/home/extern&amp;quot;)) {&lt;br /&gt;
+        settings.use_permission_enforcement = 1;&lt;br /&gt;
+    }&lt;br /&gt;
+    &lt;br /&gt;
 &lt;br /&gt;
     /* fuse_main will daemonize by fork()'ing. The signal handler will persist. */&lt;br /&gt;
     setup_signal_handling();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: Locatie waar de code terug te vinden is. (Wat is een handige plek?)&lt;br /&gt;
&lt;br /&gt;
== Compilatie, debuggen, deployment ==&lt;br /&gt;
De code bevat een Makefile, dus kan gewoon gecompileerd worden met de standaard ./configure en make. De binary is een executable met de naam &amp;quot;bindfs&amp;quot;. Als deze neergezet wordt in een locatie in het systeempath zoals /usr/bin/ wordt deze automatisch herkend en gebruikt als je als vstype fuse.bindfs opgeeft met mount.&amp;lt;pre&amp;gt;mount -t fuse.bindfs&amp;lt;/pre&amp;gt;&lt;br /&gt;
Voor compilatie zijn een standaard c compiler (zowel gcc als clang werkt) nodig en de package fuse-devel. Indien gecompileerd wordt op een CentOS 7 machine dan is deze executable niet te gebruiken op CentOS 6 vanwege een verouderde libc versie, andersom werkt wel. De executable kan ook eenvoudig gedebugd worden door een handmatige mount te doen met de -D optie.&amp;lt;pre&amp;gt;/usr/sbin/bindfs -d -o chmod-filter=g+rwD,create-with-perms=g+rwD,perms=g+rwD,chgrp-ignore,nonempty /mnt/home/ /home&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-02-09T21:30:30Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}}&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
[http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_%28operating_system%29 Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29 LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden. Deze pool werkt ongeveer hetzelfde als bij LVM. Er is een pool met data beschikbaar en deze kan vervolgens weer gesplitst worden in datasets. Elke dataset heeft een aantal properties. Veel opties die bij andere dingen als mount opties in de fstab staan zijn in ZFS properties (mountpoint/extended attributes/atime/compressie). Er is ook een ZFS service en die regelt bij het opstarten alles zelf met betrekking tot mounten en sharen van file systems, dus er is niets van zfs te zien in /etc/fstab.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
ZFS draait in een zogehete raidz1. Dit is in feite een raid 5 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogehete [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;br /&gt;
&lt;br /&gt;
== Do's and Don't == &lt;br /&gt;
&lt;br /&gt;
=== Do's ===&lt;br /&gt;
De man pages van de commando's zfs en zpool zijn zeer uitgebreid. In het geval dat je niet helemaal weet hoe iets werkt, kijk eerst in de man page.&lt;br /&gt;
  man zpool&lt;br /&gt;
  man zfs&lt;br /&gt;
&lt;br /&gt;
=== Dont's ===&lt;br /&gt;
Doe nooit iets met zpool labelclear, dit doet enge dingen met je partities.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-02-03T16:22:38Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}}&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
[http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_%28operating_system%29 Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29 LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden. Deze pool werkt ongeveer hetzelfde als bij LVM. Er is een pool met data beschikbaar.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
ZFS draait in een zogehete raidz1. Dit is in feite een raid 5 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogehete [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;br /&gt;
&lt;br /&gt;
== Do's and Don't == &lt;br /&gt;
&lt;br /&gt;
=== Do's ===&lt;br /&gt;
De man pages van de commando's zfs en zpool zijn zeer uitgebreid. In het geval dat je niet helemaal weet hoe iets werkt, kijk eerst in de man page.&lt;br /&gt;
  man zpool&lt;br /&gt;
  man zfs&lt;br /&gt;
&lt;br /&gt;
=== Dont's ===&lt;br /&gt;
Doe nooit iets met zpool labelclear, dit doet enge dingen met je partities.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-01-28T20:24:27Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}}&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
[http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_%28operating_system%29 Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29 LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden. Deze pool werkt ongeveer hetzelfde als bij LVM. Er is een pool met data beschikbaar.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
ZFS draait in een zogehete raidz1. Dit is in feite een raid 5 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogehete [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-01-28T20:21:50Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}}&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
[http://en.wikipedia.org/wiki/ZFS ZFS] is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_%28operating_system%29 Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;br /&gt;
&lt;br /&gt;
== Volume Manager vs File System ==&lt;br /&gt;
ZFS is niet alleen een file system, het is ook een volume manager, zoals [http://en.wikipedia.org/wiki/Logical_Volume_Manager_%28Linux%29 LVM]. Het is belangrijk om dit verschil tussen deze 2 lagen in het achterhoofd te houden. De bovenste laag heet bij ZFS de pool. De pool bestaat uit een aantal disks. Deze kunnen dan gemirrored worden, of in een willekeurige raid gezet worden.&lt;br /&gt;
&lt;br /&gt;
== Raid Configuratie ==&lt;br /&gt;
ZFS draait in een zogehete raidz1. Dit is in feite een raid 5 met wat extra voordelen, vanwege de integratie. Raidz's hebben geen last van het zogehete [http://www.raid-recovery-guide.com/raid5-write-hole.aspx Write Hole] probleem.&lt;br /&gt;
&lt;br /&gt;
== Caching ==&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS</id>
		<title>ZFS</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/ZFS"/>
				<updated>2015-01-28T19:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: Created page with &amp;quot;{{DISPLAYTITLE:ZFS}} category:sysop ZFS is het file system dat gebruikt wordt om alle actieve data in op te slaan op Haskell. Oorspronkelijk is het ontwikkeld door Sun...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ZFS}}&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
ZFS is het file system dat gebruikt wordt om alle actieve data in op te slaan op [[Haskell]]. Oorspronkelijk is het ontwikkeld door Sun Microsystems voor [http://en.wikipedia.org/wiki/Solaris_%28operating_system%29 Solaris]. Vervolgens is het geport naar onder andere [https://wiki.freebsd.org/ZFS FreeBSD] en [http://zfsonlinux.org/ Linux]. Omdat het ontwikkeld is onder de [http://en.wikipedia.org/wiki/Common_Development_and_Distribution_License CDDL] license en daarom is [http://zfsonlinux.org/ ZFS on Linux] geen onderdeel van de kernel, maar een losse module die via dkms apart ingeladen moet worden. Op [[Haskell]] draait ZFS dus ook niet voor zijn root partitie, maar alleen voor data partities. Het zou anders kunnen dat bij een kernel of zfs update de kernel modules niet goed gebouwd worden je uberhaupt niet kan booten en dit is vrij problematisch.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Quota</id>
		<title>Quota</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Quota"/>
				<updated>2015-01-19T14:28:32Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
Om het gebruik van schrijfruimte te beperken gebruiken we een quota systeem dat gebouwd is op de faciliteiten die zfs biedt als filesystem. Momenteel gebruiken we alleen userquota en geen groupquota. &lt;br /&gt;
&lt;br /&gt;
Als mensen direct bestanden kunnen aanpassen bij comissieaccounts worden zij wel owner van die files. Om dit probleem te vermijden zullen groupquota's gebruikt moeten gaan worden, maar dit zal een relatief kleine aanpassing zijn mits de permissies goed staan. De zfs dataset(s) waarop userquota gebruikt worden is storage/home. &lt;br /&gt;
&lt;br /&gt;
De quota worden opgeslagen in een sqlite3 file ''/home/quota.db''. Het is niet de bedoeling dat deze file direct gemanipuleerd wordt, maar er is een wrapper beschikbaar in de vorm van het script ''changequota'' Elke nacht wordt aan de hand van deze file met een cronjob de userquota ingesteld op de dataset(s). Mocht er accuut iets aangepast moeten worden, dan moet dit ook nog handmatig aangepast worden op haskell.&lt;br /&gt;
&lt;br /&gt;
In het hypotetische geval dat de ''spocie'' op hard quotum zit dan moeten er 2 dingen gedaan worden. Voer ''changequota'' uit als root:&lt;br /&gt;
&lt;br /&gt;
 sudo changequota $user&lt;br /&gt;
&lt;br /&gt;
Toevoegen Quotum&lt;br /&gt;
# Bij het toevoegen van quota vul hier de hoeveelheid extra quota in (bv. 42MB, 1.5G, etc).&lt;br /&gt;
# Het is ook mogelijk om een tijdslimiet hierop te zetten (bv. serious quotum), doe dit preferabel in een formaat als ''dd-mm-yyyy''.&lt;br /&gt;
# Vul de reden in waarom de gebruiker meer quotum behoeft&lt;br /&gt;
&lt;br /&gt;
Verwijderen Quotum&lt;br /&gt;
# Bij het verwijderen van quota wordt er een lijst getoond van entries in de database en hoeveel extra quotum deze entry de gebruiker geeft. Deze lijst is 0 indexed. Standaard heeft elke gebruiker/comissie 1Gb quotum. &lt;br /&gt;
# Vul hier het getal in van de entry die je wilt verwijderen. Zou je dus je standaard quotum willen verwijderen dan vul je hier 0 in.&lt;br /&gt;
&lt;br /&gt;
ZFS werkt met hard quotum. Het harde quotum is standaard quotum +10GB. Wanneer de grace periode van 2 weken over is wordt het quotum op 1 bit gezet.&lt;br /&gt;
Standaard quota worden elke nacht gegenereerd en in de database gezet, mocht deze per ongeluk verwijderd worden dan is het handiger om deze automatisch te laten genereren in plaats van dit weer handmatig te fixen.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Svn</id>
		<title>Svn</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Svn"/>
				<updated>2014-11-07T15:57:40Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
[[category:software]]&lt;br /&gt;
Op de vm-gitsvn staan alle svn-repos zoals bijv de Sysop-svn.&lt;br /&gt;
&lt;br /&gt;
== Svn en websvn installeren ==&lt;br /&gt;
=== IPA/Kerberos ===&lt;br /&gt;
Installeer svn, websvn en de bijbehorende modules om het goed met kerberos te laten werken:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install subversion websvn mod_auth_kerb mod_dav_svn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zorg ervoor dat het bestand /etc/httpd/conf.d/websvn.conf er als volgt uit ziet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alias /websvn /usr/share/websvn/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /usr/share/websvn/&amp;gt;&lt;br /&gt;
   Options MultiViews Indexes FollowSymLinks Includes ExecCGI&lt;br /&gt;
   DirectoryIndex wsvn.php&lt;br /&gt;
   AuthType Kerberos&lt;br /&gt;
   AuthName &amp;quot;Kerberos Login&amp;quot;&lt;br /&gt;
   KrbMethodNegotiate On&lt;br /&gt;
   KrbMethodK5Passwd On&lt;br /&gt;
   KrbAuthRealms A-ESKWADRAAT.NL&lt;br /&gt;
   Krb5KeyTab /etc/httpd/krb5.keytab&lt;br /&gt;
   Require valid-user&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en restart de httpd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zorg er nu voor dat je svn-server met kerberos-credentials kan gebruiken. Maak in de ipaserver de service HTTP/&amp;quot;svnserver&amp;quot; aan. Voer dan op de svnserver het volgende uit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ipa-getkeytab -s &amp;lt;ipa-server&amp;gt; -p HTTP/&amp;lt;svnserver&amp;gt; -k /etc/httpd/krb5.keytab&lt;br /&gt;
chown apache:apache /etc/httpd/krb5.keytab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maak de map /var/lib/svn aan en zet de selinux-context goed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/svn&lt;br /&gt;
restorecon -Rvv /var/lib/svn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
Installeer svn, websvn en de bijbehorende modules om het goed met kerberos te laten werken:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install subversion websvn mod_authz_ldap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zorg ervoor dat het bestand /etc/httpd/conf.d/websvn.conf er als volgt uit ziet:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Alias /websvn /usr/share/websvn/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Directory /usr/share/websvn/&amp;gt;&lt;br /&gt;
   Options MultiViews Indexes FollowSymLinks Includes ExecCGI&lt;br /&gt;
   DirectoryIndex wsvn.php&lt;br /&gt;
   AuthType Basic&lt;br /&gt;
   AuthBasicProvider ldap&lt;br /&gt;
   AuthLDAPURL ldap://ldap/ou=mensjes,ou=accounts,dc=a-eskwadraat,dc=nl?uid&lt;br /&gt;
   AuthName 'WebSVN'&lt;br /&gt;
   Require valid-user&lt;br /&gt;
&amp;lt;/Directory&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en restart de httpd:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service httpd restart&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maak de map /var/lib/svn aan en zet de selinux-context goed:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/svn&lt;br /&gt;
restorecon -Rvv /var/lib/svn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Nieuwe repo toevoegen ==&lt;br /&gt;
Om een repo toe te voegen voeg je aan het bestand /etc/httpd/conf.d/subversion.conf het volgende toe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location /websvn/wsvn/*reponaam*&amp;gt;&lt;br /&gt;
        Require user user1@AESKWADRAAT user2@AESKWADRAAT ...&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en voeg je aan /etc/httpd/conf.d/subversion.conf toe&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location /svn/*reponaam*&amp;gt;&lt;br /&gt;
  DAV svn&lt;br /&gt;
  SVNPath /var/lib/svn/*reponaam*&lt;br /&gt;
  Options MultiViews Indexes FollowSymLinks Includes ExecCGI&lt;br /&gt;
  AuthType Kerberos&lt;br /&gt;
  AuthName &amp;quot;Kerberos Login&amp;quot;&lt;br /&gt;
  KrbMethodNegotiate On&lt;br /&gt;
  KrbMethodK5Passwd On&lt;br /&gt;
  KrbAuthRealms AESKWADRAAT&lt;br /&gt;
  Krb5KeyTab /etc/httpd/krb5.keytab&lt;br /&gt;
  Require user user1@AESKWADRAAT ...&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en voor ldap&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Location /svn/*reponaam*&amp;gt;&lt;br /&gt;
  DAV svn&lt;br /&gt;
  SVNPath /var/lib/svn/*reponaam*&lt;br /&gt;
  Options MultiViews Indexes FollowSymLinks Includes ExecCGI&lt;br /&gt;
  AuthType Basic&lt;br /&gt;
  AuthBasicProvider ldap&lt;br /&gt;
  AuthLDAPURL ldap://ldap/ou=mensjes,ou=accounts,dc=a-eskwadraat,dc=nl?uid&lt;br /&gt;
  AuthName 'WebSVN'&lt;br /&gt;
  Require ldap-group cn=...&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
en reload httpd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service httpd reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Maak nu de nieuwe repo aan:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /var/lib/svn&lt;br /&gt;
svnadmin create *repodir*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zet ook de user en de groep van de repo goed.&lt;br /&gt;
&lt;br /&gt;
Zorg er nu voor dat de repo in het websvn overzicht staat. Voeg hiervoor toe aan /etc/websvn/config.php de volgende regel:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$config-&amp;gt;addRepository(&amp;quot;reponaam&amp;quot;, &amp;quot;file:///var/lib/svn/repodir&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SVN Checkout maken ==&lt;br /&gt;
Om nu een checkout van een repository *reponaam* te maken voer je het volgende uit:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
svn co http://*svnserver*/svn/*reponaam*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Quota</id>
		<title>Quota</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Quota"/>
				<updated>2014-08-11T11:46:49Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
Om het gebruik van schrijfruimte te beperken gebruiken we het quota systeem bovenop de faciliteiten gebouwd die zfs bied als filesystem. We gebruiken alleen userquota en geen groupquota, al kan dit in de toekomst misschien nog veranderen, aangezien dit problemen kan geven in de toekomst. Als mensen direct bestanden kunnen aanpassen bij comissieaccounts worden zij wel owner van die files. Om dit probleem te vermijden zullen groupquota's gebruikt moeten gaan worden, maar dit zal een relatief kleine aanpassing zijn mits de permissies goed staan. De zfs dataset(s) waarop userquota gebruikt worden is storage/home. &lt;br /&gt;
&lt;br /&gt;
De quota worden opgeslagen in een sqlite3 file ''/home/quota.db''. Het is niet de bedoeling dat deze file direct gemanipuleerd wordt, maar er is een wrapperdje beschikbaar in de vorm van het script ''changequota'' Elke nacht wordt aan de hand van deze file met een cronjob de bijbehorende userquota ingesteld op de dataset(s). Mocht er accuut iets aangepast moeten worden, dan moet dit ook nog handmatig aangepast worden op haskell.&lt;br /&gt;
&lt;br /&gt;
In het hypotetische geval dat de ''spocie'' op hard quotum zit dan moeten er 2 dingen gedaan worden. Voer ''changequota'' uit als root/sysop gebruiker.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;s sysop&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;changequota &amp;lt;user&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indien geen gebruiker opgegeven dan zal nog gevraagd worden deze in te voeren.&lt;br /&gt;
Toevoegen Quotum&lt;br /&gt;
# Bij het toevoegen van quota vul hier de hoeveelheid extra quota in (bv. 42MB, 1.5G, etc).&lt;br /&gt;
# Het is ook mogelijk om een tijdslimiet hierop te zetten (bv. serious quotum), doe dit preferabel in een formaat als ''dd-mm-yyyy''.&lt;br /&gt;
# Vul de reden in waarom de gebruiker meer quotum behoeft&lt;br /&gt;
&lt;br /&gt;
Verwijderen Quotum&lt;br /&gt;
# Bij het verwijderen van quota wordt er een lijst getoond van entries in de database en hoeveel extra quotum deze entry de gebruiker geeft. Deze lijst is 0 indexed. Standaard heeft elke gebruiker/comissie 1Gb quotum. &lt;br /&gt;
# Vul hier het getal in van de entry die je wilt verwijderen. Zou je dus je standaard quotum willen verwijderen dan vul je hier 0 in.&lt;br /&gt;
&lt;br /&gt;
ZFS werkt met hard quotum. Het harde quotum is standaard quotum +1GB. Wanneer de grace periode van 2 weken over is wordt het quotum op 1 bit gezet.&lt;br /&gt;
Standaard quota worden elke nacht gegenereerd en in de database gezet, mocht deze per ongeluk verwijdert worden dan is het handiger om deze automatisch te laten genereren in plaats van dit weer handmatig te fixen.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T19:57:00Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Versies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
* Console. Dit is een simpel programmaatje die verbinding maakt met de Director en op die manier dingen kan doen als bestanden terugzetten en dergelijke.&lt;br /&gt;
&lt;br /&gt;
=== Configuratie Bestanden ===&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
=== Versies === &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;br /&gt;
&lt;br /&gt;
== Bestanden terug zetten ==&lt;br /&gt;
&lt;br /&gt;
Bestanden kunnen teruggezet worden door eerst de console te openen met het commmando bconsole op een machine waar dit geinstaleerd is. Een uitgebreide documentatie hierover is te vinden op [http://www.bacula.org/en/dev-manual/main/main/Restore_Command.html]&lt;br /&gt;
&lt;br /&gt;
 $ bconsole&lt;br /&gt;
&lt;br /&gt;
Dit start de Console op van Bacula. Om een bestand te restoren typ restore&lt;br /&gt;
&lt;br /&gt;
 *restore&lt;br /&gt;
&lt;br /&gt;
Hier kan je op verschillende manieren de backups selecteren die je wilt restoren. Houd hierbij rekening dat je alleen data uit een backup kan terugzetten die hij gebackupt heeft. Het is wel mogelijk om meerdere backups tegelijk te selecteren, om data over verschillende backups terug te zetten.&lt;br /&gt;
&lt;br /&gt;
Nadat je de backups hebt geselecteerd waarin de data staat die je wilt terugzetten maakt bacula een index van alle files die gebackupt zijn in de geselecteerde backups. In de shell waarin je terecht komt kan je gewoon simpele commando's als ls en cd gebruiken om te navigeren. Standaard worden geen files teruggezet en je kan zelf bestanden toevoegen die teruggezet moeten worden.&lt;br /&gt;
&lt;br /&gt;
 * mark &amp;lt;wildcard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * mark *&lt;br /&gt;
&lt;br /&gt;
zal bijvoorbeeld alle files terugzetten in de directory waar je je dan in bevind. Bestanden deselecteren kan met het unmark.&lt;br /&gt;
&lt;br /&gt;
Als alle gewenste files geselecteerd zijn kan je aangeven dat je klaar bent met done.&lt;br /&gt;
&lt;br /&gt;
 * done&lt;br /&gt;
&lt;br /&gt;
Nu kan je selecteren naar welke File Daemon de backup gerestored moet worden.&lt;br /&gt;
&lt;br /&gt;
Aan het einde komt een overzicht te staan van alle opties en kan je nog dingen aanpassen zoals het filepath waar de backup naar toe gerestored moet worden. Zet hier / neer als je de files op hun originele plek terug wilt hebben. Standaard is dit /tmp/bacula-restore.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T19:56:35Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Bestanden terug zetten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
* Console. Dit is een simpel programmaatje die verbinding maakt met de Director en op die manier dingen kan doen als bestanden terugzetten en dergelijke.&lt;br /&gt;
&lt;br /&gt;
=== Configuratie Bestanden ===&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;br /&gt;
&lt;br /&gt;
== Bestanden terug zetten ==&lt;br /&gt;
&lt;br /&gt;
Bestanden kunnen teruggezet worden door eerst de console te openen met het commmando bconsole op een machine waar dit geinstaleerd is. Een uitgebreide documentatie hierover is te vinden op [http://www.bacula.org/en/dev-manual/main/main/Restore_Command.html]&lt;br /&gt;
&lt;br /&gt;
 $ bconsole&lt;br /&gt;
&lt;br /&gt;
Dit start de Console op van Bacula. Om een bestand te restoren typ restore&lt;br /&gt;
&lt;br /&gt;
 *restore&lt;br /&gt;
&lt;br /&gt;
Hier kan je op verschillende manieren de backups selecteren die je wilt restoren. Houd hierbij rekening dat je alleen data uit een backup kan terugzetten die hij gebackupt heeft. Het is wel mogelijk om meerdere backups tegelijk te selecteren, om data over verschillende backups terug te zetten.&lt;br /&gt;
&lt;br /&gt;
Nadat je de backups hebt geselecteerd waarin de data staat die je wilt terugzetten maakt bacula een index van alle files die gebackupt zijn in de geselecteerde backups. In de shell waarin je terecht komt kan je gewoon simpele commando's als ls en cd gebruiken om te navigeren. Standaard worden geen files teruggezet en je kan zelf bestanden toevoegen die teruggezet moeten worden.&lt;br /&gt;
&lt;br /&gt;
 * mark &amp;lt;wildcard&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 * mark *&lt;br /&gt;
&lt;br /&gt;
zal bijvoorbeeld alle files terugzetten in de directory waar je je dan in bevind. Bestanden deselecteren kan met het unmark.&lt;br /&gt;
&lt;br /&gt;
Als alle gewenste files geselecteerd zijn kan je aangeven dat je klaar bent met done.&lt;br /&gt;
&lt;br /&gt;
 * done&lt;br /&gt;
&lt;br /&gt;
Nu kan je selecteren naar welke File Daemon de backup gerestored moet worden.&lt;br /&gt;
&lt;br /&gt;
Aan het einde komt een overzicht te staan van alle opties en kan je nog dingen aanpassen zoals het filepath waar de backup naar toe gerestored moet worden. Zet hier / neer als je de files op hun originele plek terug wilt hebben. Standaard is dit /tmp/bacula-restore.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T19:36:20Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Bestanden terug zetten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
* Console. Dit is een simpel programmaatje die verbinding maakt met de Director en op die manier dingen kan doen als bestanden terugzetten en dergelijke.&lt;br /&gt;
&lt;br /&gt;
=== Configuratie Bestanden ===&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;br /&gt;
&lt;br /&gt;
== Bestanden terug zetten ==&lt;br /&gt;
&lt;br /&gt;
Bestanden kunnen teruggezet worden door de Console te openen met het commmando &lt;br /&gt;
&lt;br /&gt;
 $ bconsole&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T19:35:29Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Bestanden terug zetten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
* Console. Dit is een simpel programmaatje die verbinding maakt met de Director en op die manier dingen kan doen als bestanden terugzetten en dergelijke.&lt;br /&gt;
&lt;br /&gt;
=== Configuratie Bestanden ===&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;br /&gt;
&lt;br /&gt;
== Bestanden terug zetten ==&lt;br /&gt;
&lt;br /&gt;
Bestanden kunnen teruggezet worden door de Console te openen met het commmando &lt;br /&gt;
&lt;br /&gt;
$ bconsole&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T19:05:26Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
* Console. Dit is een simpel programmaatje die verbinding maakt met de Director en op die manier dingen kan doen als bestanden terugzetten en dergelijke.&lt;br /&gt;
&lt;br /&gt;
=== Configuratie Bestanden ===&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;br /&gt;
&lt;br /&gt;
== Bestanden terug zetten ==&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T18:54:32Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
&lt;br /&gt;
=== Configuratie Bestanden ===&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;/div&gt;</summary>
		<author><name>Johand</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>2013-06-19T18:51:35Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Nieuwe Systeem */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
Elke dag worden er '''backups''' gemaakt van een groot deel van het systeem. Onder andere de homedirectories, de mail en de webpages worden gebackupt. [[Scratch]] wordt niet gebackupt.&lt;br /&gt;
&lt;br /&gt;
== Interne backups ==&lt;br /&gt;
De interne backups zijn bedoeld om bestanden terug te kunnen halen die per ongeluk verwijderd zijn. De backups staan onder `/backup` in subdirectories met als naam de datum en tijd van de backup. Op den duur worden oude backups automatisch verwijderd, maar normaal kun je hier data terugvinden van 1 dag tot ongeveer een maand geleden. De subdirectory latest verwijst altijd naar de laatste backup (normaal van de afgelopen nacht).&lt;br /&gt;
&lt;br /&gt;
Binnen een backup directory staan de bestanden op exact dezelfde plaats en met dezelfde permissies als in het gewone bestandssysteem, dus om bijvoorbeeld het bestand `bla.txt` op het Sysopaccount terug te zetten, zou je het volgende commando gebruiken:&lt;br /&gt;
&lt;br /&gt;
 $ cp /backup/latest/home/iba/sysop/bla.txt ~sysop&lt;br /&gt;
&lt;br /&gt;
== Externe backups ==&lt;br /&gt;
Iedere nacht wordt er ook een off-site snapshot gemaakt naar [[claude]].&lt;br /&gt;
&lt;br /&gt;
== Manier van backuppen ==&lt;br /&gt;
&lt;br /&gt;
De backup scripts zitten in de [[Sysop scripts|Sysop SVN]]. Een korte uitleg per bestand:&lt;br /&gt;
&lt;br /&gt;
* `bu-mksnapshot`: maakt met behulp van `rsync` een snapshot naar `/backup`. Door het gebruik van een hardlink copy is de benodigde diskruimte zeer beperkt (een overhead van 100 tot 200 MB voor directorystructuur, plus alle gewijzigde files).&lt;br /&gt;
* `bu-rmsnapshots`: ruimt een aantal snapshots op om te voorkomen dat `/backup` vol raakt.&lt;br /&gt;
* `bu-extern`: externe backup door claude.a-eskwadraat.nl. Typ 'bu-extern' voor built-in help inclusief setupinformatie. Op claude staat een kopie van dit script.&lt;br /&gt;
&lt;br /&gt;
== Nieuwe Systeem ==&lt;br /&gt;
&lt;br /&gt;
In het nieuwe systeem worden backups gemaakt met behulp van [[Bacula]]. Op dit moment worden twee dingen gebackupt.&lt;br /&gt;
* Alle snapshots die Proxmox maakt worden gebackupt.&lt;br /&gt;
* De /home van de MailNFS vm wordt apart gebackupt.&lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine Backup Schema ===&lt;br /&gt;
Van de virtual machine's ziet het backup schema er als volgt uit:SpaceWalk, IPA, GitSVN en WWW ziet het backup schema er&lt;br /&gt;
* Van de vm's SpaceWalk, IPA, GitSVN en WWW wordt maandag t/m zaterdag een dagelijkse backup gemaakt.&lt;br /&gt;
* Elke zondag, behalve op 1ste zondagen, wordt een wekelijkse backup gemaakt voor alle vm's&lt;br /&gt;
* Elke 1ste zondag van de maand wordt een maandelijkse backup gemaakt van alle vm's&lt;br /&gt;
&lt;br /&gt;
=== MailNFS Backup Schema ===&lt;br /&gt;
Van de /home van MailnFS ziet het backup schema er als volgt uit:&lt;br /&gt;
* Elke maandag t/m zaterdag wordt dagelijks een incrementele backup gemaakt.&lt;br /&gt;
* Elke zondag, behalve op 1ste zondagen, wordt een wekelijkse differentiele backup gemaakt.&lt;br /&gt;
* Elke 1ste zondag van de maand wordt een maandelijkse volledige backup gemaakt.&lt;br /&gt;
&lt;br /&gt;
=== Soorten Backups ===&lt;br /&gt;
Er wordt gebruik gemaakt van 3 verschillende soorten backups.&lt;br /&gt;
* Incrementele backups zijn backups die alleen veranderingen tot de vorige backup (ongeacht het soort)&lt;br /&gt;
* Differentiele backups zijn backups die alle veranderingen tot de vorige full backup opslaan.&lt;br /&gt;
* Full backups zijn backups die alles opslaan.&lt;br /&gt;
&lt;br /&gt;
=== Retention ===&lt;br /&gt;
Backups worden niet voor eeuwig bewaard.&lt;br /&gt;
* Dagelijkse backups worden na een week verwijdert.&lt;br /&gt;
* Wekelijkse backups worden na een maand verwijdert.&lt;br /&gt;
* Maandelijkse backups worden na 3 maanden verwijdert.&lt;/div&gt;</summary>
		<author><name>Johand</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>2013-06-19T18:50:03Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
Elke dag worden er '''backups''' gemaakt van een groot deel van het systeem. Onder andere de homedirectories, de mail en de webpages worden gebackupt. [[Scratch]] wordt niet gebackupt.&lt;br /&gt;
&lt;br /&gt;
== Interne backups ==&lt;br /&gt;
De interne backups zijn bedoeld om bestanden terug te kunnen halen die per ongeluk verwijderd zijn. De backups staan onder `/backup` in subdirectories met als naam de datum en tijd van de backup. Op den duur worden oude backups automatisch verwijderd, maar normaal kun je hier data terugvinden van 1 dag tot ongeveer een maand geleden. De subdirectory latest verwijst altijd naar de laatste backup (normaal van de afgelopen nacht).&lt;br /&gt;
&lt;br /&gt;
Binnen een backup directory staan de bestanden op exact dezelfde plaats en met dezelfde permissies als in het gewone bestandssysteem, dus om bijvoorbeeld het bestand `bla.txt` op het Sysopaccount terug te zetten, zou je het volgende commando gebruiken:&lt;br /&gt;
&lt;br /&gt;
 $ cp /backup/latest/home/iba/sysop/bla.txt ~sysop&lt;br /&gt;
&lt;br /&gt;
== Externe backups ==&lt;br /&gt;
Iedere nacht wordt er ook een off-site snapshot gemaakt naar [[claude]].&lt;br /&gt;
&lt;br /&gt;
== Manier van backuppen ==&lt;br /&gt;
&lt;br /&gt;
De backup scripts zitten in de [[Sysop scripts|Sysop SVN]]. Een korte uitleg per bestand:&lt;br /&gt;
&lt;br /&gt;
* `bu-mksnapshot`: maakt met behulp van `rsync` een snapshot naar `/backup`. Door het gebruik van een hardlink copy is de benodigde diskruimte zeer beperkt (een overhead van 100 tot 200 MB voor directorystructuur, plus alle gewijzigde files).&lt;br /&gt;
* `bu-rmsnapshots`: ruimt een aantal snapshots op om te voorkomen dat `/backup` vol raakt.&lt;br /&gt;
* `bu-extern`: externe backup door claude.a-eskwadraat.nl. Typ 'bu-extern' voor built-in help inclusief setupinformatie. Op claude staat een kopie van dit script.&lt;br /&gt;
&lt;br /&gt;
== Nieuwe Systeem ==&lt;br /&gt;
&lt;br /&gt;
In het nieuwe systeem worden backups gemaakt met behulp van [Bacula]. Op dit moment worden twee dingen gebackupt.&lt;br /&gt;
* Alle snapshots die Proxmox maakt worden gebackupt.&lt;br /&gt;
* De /home van de MailNFS vm wordt apart gebackupt.&lt;br /&gt;
&lt;br /&gt;
=== Virtual Machine Backup Schema ===&lt;br /&gt;
Van de virtual machine's ziet het backup schema er als volgt uit:SpaceWalk, IPA, GitSVN en WWW ziet het backup schema er&lt;br /&gt;
* Van de vm's SpaceWalk, IPA, GitSVN en WWW wordt maandag t/m zaterdag een dagelijkse backup gemaakt.&lt;br /&gt;
* Elke zondag, behalve op 1ste zondagen, wordt een wekelijkse backup gemaakt voor alle vm's&lt;br /&gt;
* Elke 1ste zondag van de maand wordt een maandelijkse backup gemaakt van alle vm's&lt;br /&gt;
&lt;br /&gt;
=== MailNFS Backup Schema ===&lt;br /&gt;
Van de /home van MailnFS ziet het backup schema er als volgt uit:&lt;br /&gt;
* Elke maandag t/m zaterdag wordt dagelijks een incrementele backup gemaakt.&lt;br /&gt;
* Elke zondag, behalve op 1ste zondagen, wordt een wekelijkse differentiele backup gemaakt.&lt;br /&gt;
* Elke 1ste zondag van de maand wordt een maandelijkse volledige backup gemaakt.&lt;br /&gt;
&lt;br /&gt;
=== Soorten Backups ===&lt;br /&gt;
Er wordt gebruik gemaakt van 3 verschillende soorten backups.&lt;br /&gt;
* Incrementele backups zijn backups die alleen veranderingen tot de vorige backup (ongeacht het soort)&lt;br /&gt;
* Differentiele backups zijn backups die alle veranderingen tot de vorige full backup opslaan.&lt;br /&gt;
* Full backups zijn backups die alles opslaan.&lt;br /&gt;
&lt;br /&gt;
=== Retention ===&lt;br /&gt;
Backups worden niet voor eeuwig bewaard.&lt;br /&gt;
* Dagelijkse backups worden na een week verwijdert.&lt;br /&gt;
* Wekelijkse backups worden na een maand verwijdert.&lt;br /&gt;
* Maandelijkse backups worden na 3 maanden verwijdert.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T18:23:30Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
Uitgebreide informatie van Bacula zelf kan gevonden worden op [http://www.bacula.org/en/?page=documentation].&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
&lt;br /&gt;
== Configuratie Bestanden ==&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Haskell</id>
		<title>Haskell</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Haskell"/>
				<updated>2013-06-19T18:22:10Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Extra geïnstalleerd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Haskell}}&lt;br /&gt;
[[category:hardware]]&lt;br /&gt;
[[category:sysop]]&lt;br /&gt;
'''Haskell''' is een server die gekocht is voor gebruik bij het [http://2012.bapc.eu BAPC 2012]. De machine is inmiddels overgedragen aan A–Eskwadraat en zal op termijn [[max]] vervangen. Hij is vernoemd naar de Amerikaanse wiskundige en logicus [http://nl.wikipedia.org/wiki/Haskell_Curry Haskell Brooks Curry].&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
Haskell is in tegenstelling tot [[max]] een zelf samengestelde computer, maar wel met serverwaardige onderdelen. Te noemen:&lt;br /&gt;
* 1x Chieftec UNI BX-02B-B-B Zwart (behuizing)&lt;br /&gt;
* 1x Zalman ZM660-XT (voeding)&lt;br /&gt;
* 1x Intel Server Board S2600CP4 (moederbord)&lt;br /&gt;
* 1x Intel Xeon E5-2620 (processor)&lt;br /&gt;
* 1x Intel Thermal Solution RTS2011LC (processor waterkoeling)&lt;br /&gt;
* 4x Kingston ValueRAM 8G (ram)&lt;br /&gt;
* 4x Seagate Barracuda 7200 2TB (hardeschijven)&lt;br /&gt;
&lt;br /&gt;
== Software ==&lt;br /&gt;
Haskell draait [http://www.proxmox.com/proxmox-ve Proxmox VE], een debian-distributie gericht op virtualisatie.&lt;br /&gt;
Deze server hangt dan ook niet in spacewalk of andere systemen.&lt;br /&gt;
&lt;br /&gt;
Om de virtuele omgevingen te beheren kan alleen ingelogd worden als root op [http://haskell:8006/ de site].&lt;br /&gt;
&lt;br /&gt;
=== Extra geïnstalleerd ===&lt;br /&gt;
 [[dnsmasq]]&lt;br /&gt;
 [[Bacula]] File Daemon&lt;br /&gt;
&lt;br /&gt;
=== APT ===&lt;br /&gt;
Debian gebruikt apt als package manager.&lt;br /&gt;
Beheer van de package op haskell valt niet zoals de andere systemen onder spacewalk.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T18:07:52Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: /* Configuratie files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
&lt;br /&gt;
== Configuratie Bestanden ==&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T18:07:40Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
&lt;br /&gt;
== Configuratie files ==&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;br /&gt;
&lt;br /&gt;
== Versies == &lt;br /&gt;
Omdat op verschillende plekken Bacula geinstaleerd wordt zijn er op dit moment 2 versies die gebruikt worden en (nog) zonder problemen met elkaar praten. Op machines waar CentOS 6.4 draait is versie 5.0.0 geinstaleerd.&lt;br /&gt;
Op Haskell draait Proxmox waar een nieuwere versie van Bacula in de repositories staat, dus hier is versie 5.2.6 geinstaleerd.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula</id>
		<title>Bacula</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Bacula"/>
				<updated>2013-06-19T17:55:30Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: Created page with &amp;quot;category:sysop  Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.  == Onderdelen == Bac…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:sysop]]&lt;br /&gt;
&lt;br /&gt;
Om backups te maken in het nieuwe systeem wordt gebruik gemaakt van Bacula. Dit is een open source, netwerk gebaseerd backup proggramma.&lt;br /&gt;
&lt;br /&gt;
== Onderdelen ==&lt;br /&gt;
Bacula bestaat uit een aantal onderdelen die op verschillende plekken op een netwerk kunnen draaien.&lt;br /&gt;
&lt;br /&gt;
* Director. De Director is degene die bijhoudt waar alle andere onderdelen zich bevinden en coordineert en dirigeert '''alle''' andere onderdelen. De Director gaat draaien op Claude.&lt;br /&gt;
* Storage Daemon. De Storage Daemon draait op de machine waar alle backups fysiek opgeslagen worden. De Storage Daemon praat met de database voor het opslaan van metadata en de File Daemons zodat deze direct hun data kunnen sturen naar de plek waar het opgeslagen wordt. De Storage Daemon gaat draaien op Claude.&lt;br /&gt;
* Database. Alle metadata over de backups wordt opgeslagen in een MySQL database. Deze hoeft alleen te praten met de Director en de Storage daemon. Omdat deze beide al op Claude draaien en de database zelf ook op Claude draait is deze niet open gesteld naar buiten toe.&lt;br /&gt;
* File Daemon. Dit zijn de clients die gebackupt worden. Op dit moment draaien deze op haskell zelf en in de MailNFS VM.&lt;br /&gt;
&lt;br /&gt;
== Configuratie files ==&lt;br /&gt;
De configuratiebestanden van elk apart onderdeel is te vinden in de map /etc/bacula op de machine waar deze geinstaleerd is. Voor de Director, Storage Daemon en File Daemon heten deze bestanden respectievelijk bacula-dir.conf, bacula-sd.conf en bacula-fd.conf. Het gros van de configuratie, zoals wat gebackupt wordt en waar naartoe wordt gedaan in de Director.&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Sysop</id>
		<title>Sysop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Sysop"/>
				<updated>2013-05-08T15:44:15Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Commissie&lt;br /&gt;
| naam         = Sysop&lt;br /&gt;
| plaatje      = &lt;br /&gt;
| type         = commissie&lt;br /&gt;
| jaren_actief = 1997-heden&lt;br /&gt;
| email        = sysop[dingetje]a-eskwadraat.nl&lt;br /&gt;
| website      = http://a-eskwadraat.nl/sysop&lt;br /&gt;
| voorzitter   = Lennaert Bel&lt;br /&gt;
| leden        = Rob Franken&amp;lt;br /&amp;gt;Rob van de Werken&amp;lt;br /&amp;gt;Lennaert Bel&amp;lt;br /&amp;gt;Leon Oostrum&amp;lt;br /&amp;gt;Gordian Zomer&amp;lt;br /&amp;gt;Pepijn Overbeeke&amp;lt;br /&amp;gt;Marten Spoor&amp;lt;br /&amp;gt;Jitse Klomp&amp;lt;br /&amp;gt;Johan Dorland&lt;br /&gt;
}}&lt;br /&gt;
'''Sysop''' is de A–Eskwadraatcommissie die verantwoordelijk is voor het beheer van het [[computerpark]] en alle andere [[:category:hardware|hardware]]. Sysop valt onder [[IBA]]. Ze zijn te bereiken op [mailto:sysop@A-Eskwadraat.nl].&lt;br /&gt;
&lt;br /&gt;
De Sysophandleidingen staan in de categorie [[:category:sysop|Sysop]]. De documentatie van scripts staat in de categorie [[:category:sysop scripts|Scripts]].&lt;br /&gt;
&lt;br /&gt;
== Leden ==&lt;br /&gt;
In willekeurige volgorde van chronologie:&lt;br /&gt;
&lt;br /&gt;
* DrBob&lt;br /&gt;
* RobRob&lt;br /&gt;
* Lennaert (voorzitter)&lt;br /&gt;
* Leon&lt;br /&gt;
* Gordian&lt;br /&gt;
* Pepijn&lt;br /&gt;
* Marten&lt;br /&gt;
* Jitse&lt;br /&gt;
* Johan&lt;br /&gt;
&lt;br /&gt;
=== Gedeactiveerde leden ===&lt;br /&gt;
Leden van Sysop zijn leden van IBA, zodoende kunnen ze niet lid-af worden. Dit is de lijst van gedeactiveerde leden:&lt;br /&gt;
&lt;br /&gt;
* Lars&lt;br /&gt;
* Waltmeister&lt;br /&gt;
* Loekie&lt;br /&gt;
* A4z&lt;br /&gt;
* Scotty&lt;br /&gt;
* Steven&lt;br /&gt;
* Sjeik&lt;br /&gt;
* Stukjes Peer&lt;br /&gt;
* Bash&lt;br /&gt;
* Yoerin&lt;br /&gt;
* Ctrlsoft&lt;br /&gt;
* Neus&lt;br /&gt;
* Kurk&lt;br /&gt;
* (CPU) Killer&lt;br /&gt;
* Lachebekje&lt;br /&gt;
* Jef&lt;br /&gt;
* SysV&lt;br /&gt;
* Tobin&lt;br /&gt;
* Baz&lt;br /&gt;
* Ronalz&lt;br /&gt;
* Baard&lt;br /&gt;
* Frnk&lt;br /&gt;
* Pretzel&lt;br /&gt;
* Helga&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	<entry>
		<id>https://mediawiki.a-eskwadraat.nl/wiki/index.php/Sysop</id>
		<title>Sysop</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.a-eskwadraat.nl/wiki/index.php/Sysop"/>
				<updated>2013-05-08T15:40:09Z</updated>
		
		<summary type="html">&lt;p&gt;Johand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Commissie&lt;br /&gt;
| naam         = Sysop&lt;br /&gt;
| plaatje      = &lt;br /&gt;
| type         = commissie&lt;br /&gt;
| jaren_actief = 1997-heden&lt;br /&gt;
| email        = sysop[dingetje]a-eskwadraat.nl&lt;br /&gt;
| website      = http://a-eskwadraat.nl/sysop&lt;br /&gt;
| voorzitter   = Lennaert Bel&lt;br /&gt;
| leden        = Rob Franken&amp;lt;br /&amp;gt;Rob van de Werken&amp;lt;br /&amp;gt;Lennaert Bel&amp;lt;br /&amp;gt;Leon Oostrum&amp;lt;br /&amp;gt;Gordian Zomer&amp;lt;br /&amp;gt;Pepijn Overbeeke&amp;lt;br /&amp;gt;Marten Spoor&amp;lt;br /&amp;gt;Jitse Klomp&lt;br /&gt;
}}&lt;br /&gt;
'''Sysop''' is de A–Eskwadraatcommissie die verantwoordelijk is voor het beheer van het [[computerpark]] en alle andere [[:category:hardware|hardware]]. Sysop valt onder [[IBA]]. Ze zijn te bereiken op [mailto:sysop@A-Eskwadraat.nl].&lt;br /&gt;
&lt;br /&gt;
De Sysophandleidingen staan in de categorie [[:category:sysop|Sysop]]. De documentatie van scripts staat in de categorie [[:category:sysop scripts|Scripts]].&lt;br /&gt;
&lt;br /&gt;
== Leden ==&lt;br /&gt;
In willekeurige volgorde van chronologie:&lt;br /&gt;
&lt;br /&gt;
* DrBob&lt;br /&gt;
* RobRob&lt;br /&gt;
* Lennaert (voorzitter)&lt;br /&gt;
* Leon&lt;br /&gt;
* Gordian&lt;br /&gt;
* Pepijn&lt;br /&gt;
* Marten&lt;br /&gt;
* Jitse&lt;br /&gt;
* Johan&lt;br /&gt;
&lt;br /&gt;
=== Gedeactiveerde leden ===&lt;br /&gt;
Leden van Sysop zijn leden van IBA, zodoende kunnen ze niet lid-af worden. Dit is de lijst van gedeactiveerde leden:&lt;br /&gt;
&lt;br /&gt;
* Lars&lt;br /&gt;
* Waltmeister&lt;br /&gt;
* Loekie&lt;br /&gt;
* A4z&lt;br /&gt;
* Scotty&lt;br /&gt;
* Steven&lt;br /&gt;
* Sjeik&lt;br /&gt;
* Stukjes Peer&lt;br /&gt;
* Bash&lt;br /&gt;
* Yoerin&lt;br /&gt;
* Ctrlsoft&lt;br /&gt;
* Neus&lt;br /&gt;
* Kurk&lt;br /&gt;
* (CPU) Killer&lt;br /&gt;
* Lachebekje&lt;br /&gt;
* Jef&lt;br /&gt;
* SysV&lt;br /&gt;
* Tobin&lt;br /&gt;
* Baz&lt;br /&gt;
* Ronalz&lt;br /&gt;
* Baard&lt;br /&gt;
* Frnk&lt;br /&gt;
* Pretzel&lt;br /&gt;
* Helga&lt;/div&gt;</summary>
		<author><name>Johand</name></author>	</entry>

	</feed>