Tips en Trucs 2015

OpenSUSE router

Nieuwe versie

Nu de schoolvakantie halverwege is, zijn de voorbereidingen voor het nieuwe schooljaar ook halfweg. M.a.w. de router configuratie voor de klassen heeft een nieuwe versie gekregen. Dit is nodig omdat de netwerkbehoeften van verschillende cursussen en gebruikte software software elk jaar evolueren. Deze router is gebaseerd op openSUSE 13.2 waarin op netwerkgebied heel wat is verandert. Zo wordt voor de netwerkconfiguratie nu Wicked gebruikt. Wicked kan netwerkinterfaces maar initialiseren als ze actief zijn, m.a.w. zorg dat alle netwerkverbindingen gemaakt zijn en alle netwerkapparaten (routers en switches) die rechtstreeks op de router aangesloten zijn opgestart zijn. Daarenboven werk ik met hardware zonder WiFi-interface, waardoor we USB WiFi-dongles gebruiken. Wicked gebruikt echter geen (of nog niet) startscripts bij het inpluggen van netwerkinterfaces. Dit heb ik omzeilt door elke minuut te controleren of er een WiFi USB-dongle werd aangesloten, waarbij een script wordt gestart om een draadloos Access Point op te zetten. Bij het verwijderen van de WiFi USB-dongle wordt het Access Point terug uitgeschakeld. Daarbij maak ik geen gebruik van Cron, maar van systemd timers.

Nieuw is de PXE ondersteuning met een TFTP server. Daardoor kunnen computers opstarten vanaf de router, handig om besturingssystemen of een backup-systeem te installeren.

De router en zijn gedeelde Windows mappen zijn nu ook in een Windows netwerkomgeving zichtbaar.

En last but not least gebruiken we voor de andere diensten recentere versies en zijn er hier en daar verbeteringen aangebracht aan de manier van configureren.

Inleiding

De basis van de router is een minimale openSUSE 13.2 installatie. Let wel, deze router wordt opgenomen in een reeds afgeschermde beveiligde omgeving. M.a.w. gebruik deze router niet zonder aanpassingen voor rechtstreekse toegang op het internet. Zo gebruik ik voor alle wachtwoorden hetzelfde niet veilige wachtwoord snt+4567. Aangezien deze router gebruikt wordt om een klas met computers te bedienen en eveneens als oefenrouter voor de lessen Thuisnetwerken wordt gebruikt, is een standaard wachtwoord wel gemakkelijk.

De router is getest bij het opmaken van de cursus Thuisnetwerken bij mij thuis, wordt in de aanloop van het schooljaar in het schoolnetwerk opgenomen en gebruikt om alle computers in de klas te installeren en wordt uiteindelijk in september echt op de proef gesteld door het gebruik van de cursisten in klas.

De router kan niet zomaar klakkeloos overgenomen worden, zo gebruik ik hier een bepaald type USB WLAN stick. Bij het gebruik van een andere stick, ga je waarschijnlijk zowel de USB WLAN stick configuratie als de hostapd configuratie voor het ter beschikking stellen van een WiFi Access Point moeten aanpassen. Je hoeft ook niet alles over te nemen, gebruik wat je nodig hebt. Heb je geen geïntegreerde FTP-server nodig, laat die dan weg. Hoe minder servers draaien, hoe eenvoudiger het onderhoud en beveiliging wordt.

De configuratie gebeurt bij mij via een SSH-verbinding waardoor ik de hier gepubliceerde opdrachten gewoon via kopiëren en plakken kan uitvoeren.

Zorg dat het openSUSE systeem up to date is.

zypper up
shutdown -r now

Om de router snel te kunnen opnemen in het schoolnetwerk beginnen we met het definiëren van enkele instellingen voor de router. Deze instellingen plaatsen we in variabelen.

# Router Instellingen
wan=enp2s0
lan=enp10s9
lanip=192.168.0.1     # SNT: 192.168.2.1
lansubnet=192.168.0.0 # SNT: 192.168.2.0
lanrange='192.168.0.100,192.168.0.200'  # SNT: 192.168.2.100,192.168.2.200
wlans="wlp0s29f7u"    # Netwerkverbinding naar het LAN (WiFi met WLAN USB stick), laatste cijfer ontbreekt om alle USB poorten te kunnen gebruiken
wlanip=192.168.2.1    # SNT: 192.168.3.1
wlansubnet=192.168.2.0   # SNT: 192.168.3.0
wlanrange='192.168.2.100,192.168.2.200'   # SNT: 192.168.3.100,192.168.3.200
ntpserver=`dig be.pool.ntp.org | grep ^be.pool.ntp.org | head -1 | awk '{print $5}'`
gateway=192.168.1.1   # SNT: 10.10.0.1
wachtwoord=snt+4567
domein='pindanet.home'     # SNT: snt.local
dnsserver1=$gateway    # SNT: 10.10.0.240
dnsserver2='8.8.8.8'   # Google Public DNS
dnsserver3='208.67.220.220'   # OpenDNS

Daarna initialiseren we de LAN netwerkverbindingen. De WAN netwerkverbinding wordt automatisch geïnitialiseerd met behulp van DHCP op het bestaande schoolnetwerk.

  # LAN verbinding initialiseren (07/2015 de netwerkaart moet actief zijn bij het opstarten van de computer)
  echo "BOOTPROTO='static'" > /etc/sysconfig/network/ifcfg-$lan
  echo "BROADCAST=''" >> /etc/sysconfig/network/ifcfg-$lan
  echo "ETHTOOL_OPTIONS=''" >> /etc/sysconfig/network/ifcfg-$lan
  echo "IPADDR='$lanip/24'" >> /etc/sysconfig/network/ifcfg-$lan
  echo "MTU=''" >> /etc/sysconfig/network/ifcfg-$lan
  echo "NAME='RTL-8169 Gigabit Ethernet'" >> /etc/sysconfig/network/ifcfg-$lan
  echo "NETWORK=''" >> /etc/sysconfig/network/ifcfg-$lan
  echo "REMOTE_IPADDR=''" >> /etc/sysconfig/network/ifcfg-$lan
  echo "STARTMODE='auto'" >> /etc/sysconfig/network/ifcfg-$lan

  # WLAN verbindingen initialiseren
  for wlan in 1 2 3 4 5 6 7 8; do
    echo "BOOTPROTO='static'" > /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "BROADCAST=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "ETHTOOL_OPTIONS=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "IPADDR='$wlanip/24'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "MTU=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "NAME='802.11 n WLAN'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "NETWORK=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "REMOTE_IPADDR=''" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
    echo "STARTMODE='hotplug'" >> /etc/sysconfig/network/ifcfg-$wlans$wlan
  done

Het doorsturen van de netwerkpakketten naar de juiste netwerkkaarten gebeurt via het instellen van routes en de firewall. De Gateway (toegangspoort) tot de rest van de wereld, kan je op een bestaand systeem opvragen met de opdracht route.

  # Routering
  echo "default $gateway - -" > /etc/sysconfig/network/routes

  # Firewall
  sed -i.ori "s|^\(FW_ROUTE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2
  wlan=""
  for usb in 1 2 3 4 5 6 7 8; do
    wlan+=" $wlans$usb"
  done
  sed -i "s|^\(FW_DEV_INT=\).*$|\1\"$lan$wlan\"|" /etc/sysconfig/SuSEfirewall2
  sed -i "s|^\(FW_MASQUERADE=\).*$|\1\"yes\"|" /etc/sysconfig/SuSEfirewall2
# Netwerkverkeer tussen draadloos en bekabeld intern netwerk toelaten
  sed -i "s|^\(FW_FORWARD=\).*$|\1\"$lansubnet/24,$wlansubnet/24 $wlansubnet/24,$lansubnet/24\"|" /etc/sysconfig/SuSEfirewall2

Om de LAN computers te voorzien van IP adressen hebben we een DHCP-server nodig. Daarvoor gebruiken we dsnmasq die naast een DHCP-server ook zorgt voor een DNS-server en proxy. De DNS-proxy zorgt voor een ontlasten van het netwerk, waardoor bijvoorbeeld het surfen op internet veel vlotter verloopt. Ondertussen geven we de router de netwerknaam router.pindanet.home.

  # DNS proxy en DHCP server http://www.linux.com/learn/tutorials/516220-dnsmasq-for-easy-lan-name-services
  zypper --non-interactive install dnsmasq
  cp /etc/dnsmasq.conf /etc/dnsmasq.conf.ori
  echo 'domain-needed' > /etc/dnsmasq.conf
  echo 'bogus-priv' >> /etc/dnsmasq.conf
  echo "domain=$domein" >> /etc/dnsmasq.conf
  echo 'expand-hosts' >> /etc/dnsmasq.conf
  echo "local=/$domein/" >> /etc/dnsmasq.conf
  echo 'listen-address=127.0.0.1' >> /etc/dnsmasq.conf
  echo "listen-address=$lanip" >> /etc/dnsmasq.conf
  echo 'bind-interfaces' >> /etc/dnsmasq.conf
  echo "dhcp-range=lan,$lanrange,4h" >> /etc/dnsmasq.conf
  echo "dhcp-range=wlan,$wlanrange,4h" >> /etc/dnsmasq.conf
# standaard gateway (0.0.0.0) gebruiken om de interne netwerken te verbinden (12/01/2015)
  echo '#set default gateway' >> /etc/dnsmasq.conf
  echo "dhcp-option=lan,3,0.0.0.0" >> /etc/dnsmasq.conf
  echo "dhcp-option=wlan,3,0.0.0.0" >> /etc/dnsmasq.conf
  echo '#set DNS server' >> /etc/dnsmasq.conf
  echo "dhcp-option=lan,6,$lanip" >> /etc/dnsmasq.conf
  echo "dhcp-option=wlan,6,$wlanip" >> /etc/dnsmasq.conf
  echo "server=$dnsserver1" >> /etc/dnsmasq.conf
  echo "server=$dnsserver2" >> /etc/dnsmasq.conf
  echo "server=$dnsserver3" >> /etc/dnsmasq.conf

Om computers via het netwerk te laten opstarten, gebruiken we een TFTP boot server. Via DHCP wordt de computer op de hoogte gebracht dat er vanaf het netwerk gestart kan worden. Daarenboven moeten we zorgen voor een netwerk bootmanager (PXElinux) en besturingssystemen (WinPE voor de installatie van Windows 10 en SystemRescueCD voor de installatie van een backupsysteem).

  # TFTP boot server 07/2015
  echo "dhcp-boot=pxelinux.0" >> /etc/dnsmasq.conf
  echo "enable-tftp" >> /etc/dnsmasq.conf
  echo "tftp-root=/srv/tftpboot" >> /etc/dnsmasq.conf
  
  chmod o+rx /srv/tftpboot/
  
  wget https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.tar.gz
  tar xfz syslinux-6.03.tar.gz
  rm syslinux-6.03.tar.gz
  cp syslinux-6.03/bios/core/pxelinux.0 /srv/tftpboot/
  cp syslinux-6.03/bios/com32/elflink/ldlinux/ldlinux.c32 /srv/tftpboot/
  cp syslinux-6.03/bios/com32/lib/libcom32.c32 /srv/tftpboot/
  cp syslinux-6.03/bios/com32/libutil/libutil.c32 /srv/tftpboot/
  cp syslinux-6.03/bios/com32/menu/vesamenu.c32 /srv/tftpboot/
  cp syslinux-6.03/bios/memdisk/memdisk /srv/tftpboot/
  rm -r syslinux-6.03/

  mount /dev/sda1 /mnt
  cp /mnt/WinPE_amd64.iso /srv/tftpboot/
  cp /mnt/sysrcd/{rescue64,initram.igz} /srv/tftpboot/
  mkdir /srv/www/htdocs/tftpboot/
  cp /mnt/sysrcd/{sysrcd.dat,sysrcd.md5} /srv/www/htdocs/tftpboot/
  umount /mnt
  echo "wget -P /root/ users.snt.be/dany.p/public_html/installatie/part.sh" > /srv/www/htdocs/tftpboot/autorun

  mkdir /srv/tftpboot/pxelinux.cfg
  echo "UI vesamenu.c32" > /srv/tftpboot/pxelinux.cfg/default
  echo "" >> /srv/tftpboot/pxelinux.cfg/default

  echo "label winpe" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        menu label ^1) WinPE" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        kernel memdisk" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        append iso raw" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        initrd WinPE_amd64.iso" >> /srv/tftpboot/pxelinux.cfg/default

  echo "LABEL systemrescuecd" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        MENU LABEL ^2) SystemRescueCD" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        KERNEL rescue64" >> /srv/tftpboot/pxelinux.cfg/default
  echo "        APPEND initrd=initram.igz dodhcp netboot=http://router.$domein/tftpboot/sysrcd.dat setkmap=be ar_source=http://router.$domein/tftpboot" >> /srv/tftpboot/pxelinux.cfg/default
  
  # Router intern bereikbaar via router.pindanet.home
  echo "$lanip     router.$domein router" >> /etc/hosts

  systemctl enable dnsmasq.service

Om de router verder te kunnen opbouwen, moet je deze nu herstarten.

  # herstart noodzakelijk
  shutdown -r now

Na deze herstart, moet de router reeds werken via de ethernet verbinding. Het WiFi Access Point werkt nog niet. Let op: door de herstart moeten de variabelen met de router instellingen terug geïnitialiseerd worden.

# Variabelen met routerinstellingen heruitvoeren

Je kunt de router ook gebruiken om bestanden te delen. Dit wordt op school gebruikt om oefenbestanden ter beschikking van de cursisten te stellen. We gebruiken daarvoor een Samba server. Elk besturingssysteem kan met Samba gedeelde mappen en bestanden bereiken.

# Samba server
  zypper --non-interactive remove patterns-openSUSE-minimal_base-conflicts
  zypper --non-interactive install samba
  mkdir /home/sntbeheerder/public
  echo -e '[SNTcursist]\n\tcomment = Public\n\tpath = /home/sntbeheerder/public\n\tread only = yes\n\tpublic = yes\n\thide dot files = no\n' >> /etc/samba/smb.conf
  (echo $wachtwoord; echo $wachtwoord) | smbpasswd -a sntbeheerder -s
  chown -R sntbeheerder:users /home/sntbeheerder/public/
  # Enkel nodig als je via WAN toegang tot smb wilt
  yast2 firewall services add zone=EXT service=service:samba-server

  systemctl start smb.service
  systemctl enable smb.service
  # Netbios naam 07/2015
  sed -i -e "/\[global\]/anetbios name = router" /etc/samba/smb.conf
  systemctl start nmb.service
  systemctl enable nmb.service

  # schrijftoegang via smb://sntbeheerder@router.pindanet.home/users/sntbeheerder/public/

Hoewel de router in normale omstandigheden zonder scherm werkt, schakelen we de schermbeveiliging toch uit en plaatsen we wat extra informatie op het scherm.

  # Uitschakelen schermbeveiliging
  echo -ne "\033[9;0]" >> /etc/issue

  # IP adres op het scherm tonen
  echo '[Unit]' > /usr/lib/systemd/system/pinda.service
  echo 'Description=Login message' >> /usr/lib/systemd/system/pinda.service
  echo 'After=syslog.target network.target time-sync.target' >> /usr/lib/systemd/system/pinda.service
  echo >> /usr/lib/systemd/system/pinda.service
  echo '[Service]' >> /usr/lib/systemd/system/pinda.service
  echo 'Type=simple' >> /usr/lib/systemd/system/pinda.service
  echo 'ExecStart=/bin/sh -c "/root/bin/pindaExecStart.sh"' >> /usr/lib/systemd/system/pinda.service

  echo '[Install]' >> /usr/lib/systemd/system/pinda.service
  echo 'WantedBy=multi-user.target' >> /usr/lib/systemd/system/pinda.service

  echo '# wacht tot netwerkverbinding klaar is' > /root/bin/pindaExecStart.sh
  echo 'sleep 15' >> /root/bin/pindaExecStart.sh
  echo "IPadres=\`/sbin/ip -f inet -oneline addr show $wan | cut -d \" \" -f7\`" >> /root/bin/pindaExecStart.sh
  echo '# plaats het IP adres op het scherm' >> /root/bin/pindaExecStart.sh
  echo 'echo -ne "\n\nWelkom op de router\nDeze router is bereikbaar via SSH op $IPadres\n2015 Dany Pinoy voor SNT Brugge\n\nusers login: " > /dev/tty1' >> /root/bin/pindaExecStart.sh

  chmod +x /root/bin/pindaExecStart.sh
  systemctl start pinda.service
  systemctl enable pinda.service

Voor verschillende diensten (waaronder mail) hebben we gebruikers nodig.

  # Gebruikers aanmaken
  for gebruiker in pc01 pc02 pc03 pc04 pc05 pc06 pc07 pc08 pc09 pc10 pc11 pc12 pc13 pc14 pc15 pc16 pc17 pc18 pc19 pc20 pc21 pc22 pc23 pc24 pc25 pc26 pc27 pc28 pc29 pc30; do
  useradd $gebruiker -p $wachtwoord -d /srv/www/htdocs/$gebruiker -s /bin/false;
  passwd $gebruiker <<EOF
$wachtwoord
$wachtwoord
EOF
  mkdir /srv/www/htdocs/$gebruiker
  chown $gebruiker:users /srv/www/htdocs/$gebruiker
  done

Om mails op de router te kunnen ontvangen, hebben we een mail server nodig.

# Mailserver
  zypper --non-interactive remove postfix
  zypper --non-interactive install exim mailx
  sed -i.ori "s/# primary_hostname =/primary_hostname = $domein/" /etc/exim/exim.conf
  sed -i 's/  require verify        = sender/#  require verify        = sender/' /etc/exim/exim.conf
  systemctl enable exim.service
  systemctl start exim.service
  # Mailboxen initialiseren (07/2015)
  for gebruiker in pc01 pc02 pc03 pc04 pc05 pc06 pc07 pc08 pc09 pc10 pc11 pc12 pc13 pc14 pc15 pc16 pc17 pc18 pc19 pc20 pc21 pc22 pc23 pc24 pc25 pc26 pc27 pc28 pc29 pc30; do
    echo "Veel plezier met uw electronische Mailbox." | mail -s "Welkom" $gebruiker@$domein
  done
  # # Mailserver testen vanaf andere computer
  # echo "Bericht van dany" | mail -S smtp=smtp://router.pindanet.home:25 -s "Testbericht" pc01@pindanet.home
  # # Ontvangen mails opvragen op de router
  # mail -u pc01

Om de ontvangen mails ter beschikking van een mail client te stellen, hebben we een IMAP server nodig.

# IMAP server
  zypper --non-interactive install dovecot
  sed -i.ori "s/#mail_location =/mail_location = mbox:~\/Mail:INBOX=\/var\/spool\/mail\/%u/" /etc/dovecot/conf.d/10-mail.conf
  systemctl enable dovecot.service
  systemctl start dovecot.service
  # # Testen
  # telnet localhost 143
  #   1 login pc01 snt+4567
  #   1 select inbox
  #   1 logout

Om mails via een webinterface te kunnen beheren, hebben we een webserver nodig.

# Webserver
  zypper --non-interactive install apache2 apache2-mod_fcgid php5-bcmath php5-bz2 php5-calendar php5-ctype php5-curl php5-dom php5-ftp php5-gd php5-gettext php5-gmp php5-iconv php5-imap php5-ldap php5-mbstring php5-mcrypt php5-mysql php5-odbc php5-openssl php5-pcntl php5-pgsql php5-posix php5-shmop php5-snmp php5-soap php5-sockets php5-sqlite php5-sysvsem php5-tokenizer php5-wddx php5-xmlrpc php5-xsl php5-zlib php5-exif php5-fastcgi php5-pear php5-sysvmsg php5-sysvshm ImageMagick curl apache2-mod_php5
#  echo "APACHE_MODULES=\"actions php5 alias auth_basic authn_file authz_host authz_groupfile authz_user autoindex cgi dir env expires include log_config mime negotiation setenvif ssl userdir reqtimeout authn_core authz_core\"" >> /etc/sysconfig/apache2
  systemctl enable apache2.service
  systemctl start apache2.service
  yast2 firewall services add zone=EXT service=service:apache2
  # # Test Webserver met PHP
  # echo "<?php phpinfo(); ?>" > /srv/www/htdocs/info.php
  # rm /srv/www/htdocs/info.php

De door ons gebruikte webinterface voor mails gebruikt een mysql database.

# MariaDB server
  zypper --non-interactive install mariadb phpmyadmin
  systemctl enable mysql.service
  systemctl start mysql.service
  # mysqladmin -u root password "$wachtwoord"
  # Alternatief voor mysql_secure_installation --use-default op http://howtolamp.com/lamp/mysql/5.6/securing/
  /usr/bin/mysql -e "set password for 'root'@'localhost' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "set password for 'root'@'127.0.0.1' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "set password for 'root'@'::1' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "set password for 'root'@'$HOSTNAME' = password('$wachtwoord');"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  /usr/bin/mysql --password=$wachtwoord -e "update mysql.user set password = password('$wachtwoord') where user = '';"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  /usr/bin/mysql --password=$wachtwoord -e "delete from mysql.db where Db like 'test%';"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  /usr/bin/mysql --password=$wachtwoord -e "drop user ''@'localhost';"
  /usr/bin/mysql --password=$wachtwoord -e "drop user ''@'$HOSTNAME';"

  /usr/bin/mysql --password=$wachtwoord -e "drop database test;"

#  rm $HOME/.mysql_history
#  ln -s /dev/null $HOME/.mysql_history

  sed -i.ori "/# skip-networking/askip-networking" /etc/my.cnf
  service mysql restart

  # /usr/bin/mysql --password=$wachtwoord -e "update mysql.user set user="sqlbeheerder" where user="root";"
  # /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"

  for gebruiker in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do
    query="CREATE USER 'pc$gebruiker'@'localhost' IDENTIFIED BY '$wachtwoord';"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
    query="GRANT USAGE ON * . * TO 'pc$gebruiker'@'localhost' IDENTIFIED BY '$wachtwoord' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
    query="CREATE DATABASE IF NOT EXISTS \`database$gebruiker\`;"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
    query="GRANT ALL PRIVILEGES ON \`database$gebruiker\` . * TO 'pc$gebruiker'@'localhost';"
    /usr/bin/mysql --password=$wachtwoord -e "$query"
  done
  
  # ToDo phpMyAdmin geavanceerde functies instellen

En uiteindelijk kunnen we de RoundCube webmail installeren.

# Webmail http://trac.roundcube.net/wiki/Howto_Install
  zypper --non-interactive install php5-pear-Auth_SASL php5-pear-Net_SMTP php5-pear-Net_IDNA2 php5-pear-Mail_mimeDecode php5-fileinfo php5-intl
  wget http://downloads.sourceforge.net/project/roundcubemail/roundcubemail/1.1.2/roundcubemail-1.1.2.tar.gz
  tar xfz roundcubemail-1.1.2.tar.gz -C /srv/www/htdocs/
  rm roundcubemail-1.1.2.tar.gz
  mv /srv/www/htdocs/roundcubemail-1.1.2/ /srv/www/htdocs/webmail/
  chown -R wwwrun /srv/www/htdocs/webmail/temp/
  chown -R wwwrun /srv/www/htdocs/webmail/logs/

  # zypper --non-interactive install roundcubemail
  systemctl restart apache2.service
  /usr/bin/mysql --password=$wachtwoord -e "CREATE USER 'roundcube'@'localhost' IDENTIFIED BY '$wachtwoord';"
  /usr/bin/mysql --password=$wachtwoord -e "GRANT USAGE ON * . * TO 'roundcube'@'localhost' IDENTIFIED BY '$wachtwoord' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;"
  /usr/bin/mysql --password=$wachtwoord -e "CREATE DATABASE IF NOT EXISTS \`roundcubemail\`;"
  /usr/bin/mysql --password=$wachtwoord -e "GRANT ALL PRIVILEGES ON \`roundcubemail\` . * TO 'roundcube'@'localhost';"
  /usr/bin/mysql --password=$wachtwoord -e "flush privileges;"
  mysql -u root --password=$wachtwoord 'roundcubemail' < /srv/www/htdocs/webmail/SQL/mysql.initial.sql
  cp /srv/www/htdocs/webmail/config/config.inc.php.sample /srv/www/htdocs/webmail/config/config.inc.php
  sed -i.ori "s|^\(\$config\['default_host'\] =\).*$|\1 \'localhost\';|" /srv/www/htdocs/webmail/config/config.inc.php
  sed -i "s|^\(\$config\['db_dsnw'\] =\).*$|\1 \'mysqli://roundcube:${wachtwoord}@localhost/roundcubemail\';|" /srv/www/htdocs/webmail/config/config.inc.php
  sed -i.ori "s|^\(\$config\['mail_domain'\] =\).*$|\1 \'$domein\';|" /srv/www/htdocs/webmail/config/defaults.inc.php
  # 07/2015 Aanmaken standaard postvakken
  sed -i "s|^\(\$config\['create_default_folders'\] =\).*$|\1 true;|" /srv/www/htdocs/webmail/config/defaults.inc.php
  rm -rf /srv/www/htdocs/webmail/installer

Om draadloze apparaten te kunnen bedienen, hebben we een WiFi Access Point nodig. Let op: aangezien ik hier werk met een USB WLAN stick, maak ik met behulp van systemd timers een eigen hotplug systeem. Een hotplugsysteem kan je ook opzetten met behulp van udev of cron.

  echo '#!/bin/bash' > hotplugSoftAp.sh
  echo "INTERFACE=\`ip a | grep $wlans | head -1 | awk '{print \$2}' |  sed 's/[:]//g'\`" >> hotplugSoftAp.sh
  echo "if [ -n \"\$INTERFACE\" ]; then  # Wifi aanwezig" >> hotplugSoftAp.sh
  echo "  grep listen-address=$wlanip /etc/dnsmasq.conf" >> hotplugSoftAp.sh
  echo "  if [ \$? == 1 ]; then # SoftAp activeren" >> hotplugSoftAp.sh
  echo "    /usr/bin/echo 'listen-address=$wlanip' >> /etc/dnsmasq.conf" >> hotplugSoftAp.sh
  echo "    /sbin/ip addr add $wlanip/24 dev \$INTERFACE" >> hotplugSoftAp.sh
  echo "    /usr/bin/systemctl restart dnsmasq.service" >> hotplugSoftAp.sh
  echo "    /usr/sbin/iw list | grep HT20/HT40" >> hotplugSoftAp.sh
  echo "    if [ \$? == 0 ]; then" >> hotplugSoftAp.sh
  echo "      /usr/bin/echo \"ieee80211n=1\" >> /etc/hostapd.conf" >> hotplugSoftAp.sh
  echo "    else" >> hotplugSoftAp.sh
  echo "      /usr/bin/sed -i '/ieee80211n=1/d' /etc/hostapd.conf" >> hotplugSoftAp.sh
  echo "    fi" >> hotplugSoftAp.sh
  echo "    /usr/bin/sed -i \"s|^\\(interface=\\).*\$|\\1\$INTERFACE|\" /etc/hostapd.conf" >> hotplugSoftAp.sh
  echo "    /usr/bin/systemctl start hostapd.service" >> hotplugSoftAp.sh
  echo "    /usr/bin/sed -i \"s|^\\(network_interface=$lan\\).*\$|\\1,\$INTERFACE|\" /etc/minidlna.conf" >> hotplugSoftAp.sh
  echo "    /usr/bin/systemctl restart minidlna.service" >> hotplugSoftAp.sh
  echo "  fi" >> hotplugSoftAp.sh
  echo "else # Wifi niet aanwezig" >> hotplugSoftAp.sh
  echo "  grep listen-address=$wlanip /etc/dnsmasq.conf" >> hotplugSoftAp.sh
  echo "  if [ \$? == 0 ]; then # SoftAp uitschakelen" >> hotplugSoftAp.sh
  echo "    /usr/bin/sed -i '/listen-address=$wlanip/d' /etc/dnsmasq.conf" >> hotplugSoftAp.sh
  echo "    /usr/bin/systemctl restart dnsmasq.service" >> hotplugSoftAp.sh
  echo "    /usr/bin/systemctl stop hostapd.service" >> hotplugSoftAp.sh
  echo "  fi" >> hotplugSoftAp.sh
  echo "fi" >> hotplugSoftAp.sh

  chmod a+x hotplugSoftAp.sh
  
  cat <<EOF > /etc/systemd/system/minute-timer.timer
[Unit]
Description=Minute Timer

[Timer]
OnBootSec=1min
OnCalendar=*:0/1
Unit=minute-timer.target

[Install]
WantedBy=basic.target
EOF

  cat <<EOF > /etc/systemd/system/minute-timer.target
[Unit]
Description=Minute Timer Target
StopWhenUnneeded=yes
EOF

  cat <<EOF > /etc/systemd/system/hotplugSoftAp.service
[Unit]
Description=Check wifi hotspot every minute
Wants=minute-timer.timer

[Service]
ExecStart=/root/hotplugSoftAp.sh

[Install]
WantedBy=minute-timer.target
EOF
  
  systemctl enable /etc/systemd/system/minute-timer.timer
  systemctl start minute-timer.timer
  systemctl enable /etc/systemd/system/hotplugSoftAp.service

  # volgen met 
  # journalctl -f -u hotplugSoftAp.servic
  
  zypper --non-interactive install hostapd iw
  cp /etc/hostapd.conf /etc/hostapd.conf.ori
  echo "interface=$wlan" > /etc/hostapd.conf
  echo "driver=nl80211" >> /etc/hostapd.conf
  echo "channel=6" >> /etc/hostapd.conf
  echo "ssid=SoftAP-SNT" >> /etc/hostapd.conf
  echo "hw_mode=g" >> /etc/hostapd.conf
  echo "auth_algs=1" >> /etc/hostapd.conf
  echo "wmm_enabled=1" >> /etc/hostapd.conf
  # enkel voor moderne WLAN kaarten
  # echo "ieee80211n=1" >> /etc/hostapd.conf
  echo "ht_capab=[HT40-][SHORT-GI-20][SHORT-GI-40]" >> /etc/hostapd.conf
  echo "wpa=2" >> /etc/hostapd.conf
  echo "wpa_passphrase=$wachtwoord" >> /etc/hostapd.conf
  echo "wpa_key_mgmt=WPA-PSK" >> /etc/hostapd.conf
  echo "wpa_pairwise=TKIP CCMP" >> /etc/hostapd.conf
  echo "rsn_pairwise=CCMP" >> /etc/hostapd.conf
  systemctl start hostapd.service
  systemctl enable hostapd.service

Om muziek en films te delen, gebruiken we een DLNA server. Ondertussen plaatsen we twee kleine mediabestanden op de DLNA server. Handig om te testen.

# ReadyMedia
  wget http://downloads.sourceforge.net/project/minidlna/minidlna/1.1.4/minidlna-1.1.4_static.tar.gz
  tar xvzf minidlna-1.1.4_static.tar.gz -C /
  sed -i.ori "/#network_interface=eth0/anetwork_interface=$lan" /etc/minidlna.conf
  sed -i "/#user=jmaggard/auser=root" /etc/minidlna.conf
  sed -i "s/media_dir=\/opt/#media_dir=\/opt/" /etc/minidlna.conf
  sed -i "/#media_dir=\/opt/amedia_dir=A,\/home\/sntbeheerder\/Music" /etc/minidlna.conf
  sed -i "/#media_dir=\/opt/amedia_dir=V,\/home\/sntbeheerder\/Videos" /etc/minidlna.conf
  sed -i "/#friendly_name=My DLNA Server/afriendly_name=Pinda DLNA Server" /etc/minidlna.conf

  mkdir /home/sntbeheerder/Videos
  chown sntbeheerder:users /home/sntbeheerder/Videos
  mkdir /home/sntbeheerder/Music
  chown sntbeheerder:users /home/sntbeheerder/Music
  wget --directory-prefix=/home/sntbeheerder/Music/ https://webdesign.pindanet.be/deel2/Linecraft/muziek/erotic_dream.mp3
  wget --output-document=/home/sntbeheerder/Music/erotic_dream.jpg https://webdesign.pindanet.be/deel2/Linecraft/muziek/speedsound.jpg
  wget --output-document=/home/sntbeheerder/Videos/kajimba.mp4 https://webdesign.pindanet.be/deel2/Linecraft/films/kajimba_-_snippets_640x368.mp4
  wget --directory-prefix=/home/sntbeheerder/Videos/ https://webdesign.pindanet.be/deel2/Linecraft/films/kajimba.jpg

  echo '[Unit]' > /usr/lib/systemd/system/minidlna.service
  echo 'Description=MiniDLNA UPnP-A/V and DLNA media server' >> /usr/lib/systemd/system/minidlna.service
  echo 'After=network.target' >> /usr/lib/systemd/system/minidlna.service
  echo '' >> /usr/lib/systemd/system/minidlna.service
  echo '[Service]' >> /usr/lib/systemd/system/minidlna.service
  echo 'Type=forking' >> /usr/lib/systemd/system/minidlna.service
  echo 'PIDFile=/var/run/minidlna.pid' >> /usr/lib/systemd/system/minidlna.service
  echo 'ExecStart=/usr/sbin/minidlnad -P /var/run/minidlna.pid -f /etc/minidlna.conf' >> /usr/lib/systemd/system/minidlna.service
  echo '' >> /usr/lib/systemd/system/minidlna.service
  echo '[Install]' >> /usr/lib/systemd/system/minidlna.service
  echo 'WantedBy=multi-user.target' >> /usr/lib/systemd/system/minidlna.service
  systemctl start minidlna.service
  systemctl enable minidlna.service

Een goede oude FTP server om bestanden uit te wisselen mag ook niet ontbreken.

# FTP server
  zypper --non-interactive install vsftpd
  sed -i.ori "s|^\(anonymous_enable=\).*$|\1NO|" /etc/vsftpd.conf
  # sed -i "s|^\(local_enable=\).*$|\1YES|" /etc/vsftpd.conf
  sed -i "s|^\(write_enable=\).*$|\1YES|" /etc/vsftpd.conf
  sed -i "s/#chroot_local_user=YES/chroot_local_user=YES/" /etc/vsftpd.conf
  sed -i "s/#chroot_list_enable=YES/chroot_list_enable=NO/" /etc/vsftpd.conf
  echo 'allow_writeable_chroot=YES' >> /etc/vsftpd.conf
  echo 'user_config_dir=/home' >> /etc/vsftpd.conf
  for gebruiker in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do
    echo "local_root=/srv/www/htdocs/pc$gebruiker" > /home/pc$gebruiker
    echo 'dirlist_enable=YES' >> /home/pc$gebruiker
    echo 'download_enable=YES' >> /home/pc$gebruiker
    echo 'write_enable=YES' >> /home/pc$gebruiker
  done
  systemctl start vsftpd
  systemctl enable vsftpd
  yast2 firewall services add zone=EXT service=service:vsftpd

Om met onze tijd mee te zijn installeren we ownCloud.

# OwnCloud
  zypper addrepo http://download.opensuse.org/repositories/isv:ownCloud:community/openSUSE_13.2/isv:ownCloud:community.repo
  zypper --gpg-auto-import-keys refresh
  zypper --non-interactive install owncloud php5-fileinfo

  # Surf naar router.pinda.snt/owncloud
  curl --request POST "http://router.$domein/owncloud/index.php" --data-urlencode "install=true" --data-urlencode "adminlogin=root" --data-urlencode "adminpass=$wachtwoord" --data-urlencode "adminpass-clone=$wachtwoord" --data-urlencode "directory=/srv/www/htdocs/owncloud/data" --data-urlencode "dbtype=sqlite" --data-urlencode "dbuser=" --data-urlencode "dbpass=" --data-urlencode "dbpass-clone=" --data-urlencode "dbname=" --data-urlencode "dbhost=localhost"

  # https://doc.owncloud.org/server/8.0/admin_manual/configuration_server/occ_command.html
  # Laat het gebruik van ENV Variabelen in PHP cli toe
  sed -i.ori "s|^\(variables_order =\).*$|\1 \"EGPCS\"|" /etc/php5/cli/php.ini
  for gebruiker in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30; do
    sudo -u wwwrun sh -c "export OC_PASS=$wachtwoord; /srv/www/htdocs/owncloud/occ user:add --password-from-env pc$gebruiker"
  done
  sudo -u wwwrun /srv/www/htdocs/owncloud/occ user:report

Om de prestaties van de router in de gaten te houden installeren we de monitor Linux Dash.

# Monitor Linux Dash
  wget https://github.com/afaqurk/linux-dash/archive/master.zip
  unzip master.zip -d /srv/www/htdocs/
  # bekijken via http://router.pindanet.home/linux-dash-master/
Linux Dash

De router werk je af door te herstarten, waardoor je deze direct in dienst kunt nemen, of door deze af te sluiten tot het begin van het schooljaar.

shutdown -h now

Een router is nooit klaar, is steeds voor verbetering vatbaar en kan steeds verder uitgebreid worden.

# ToDo
# WebYast toevoegen om de router te configureren via een webpagina.

Hoewel het maken van een WinPE omgeving hier niet echt op zijn plaats is, publiceer ik hier mijn notities.

# Aanmaken Windows 10 RTM iso: http://answers.microsoft.com/en-us/insider/wiki/insider_wintp-insider_install/how-to-upgrade-from-the-windows-10-insider-preview/3a482b9c-553d-47e0-b6a4-1916e70d9b3d
WinPE aanmaken met Windows 10 ADK
---------------------------------
Windows 10 ADK downloaden en installeren
Start > Deployment and Imaging Tools Environment
copype.cmd amd64 c:\WinPE_amd64

# https://gverswijvel.wordpress.com/
# Als administrator
Dism /mount-image /imagefile:C:\winpe_amd64\media\sources\boot.wim /index:1 /mountdir:C:\winpe_amd64\mount
REG LOAD HKLM\WINFE2 C:\winpe_amd64\mount\Windows\System32\config\DEFAULT
REG DELETE "HKLM\WINFE2\Keyboard Layout\Preload" /f
REG ADD "HKLM\WINFE2\Keyboard Layout\Preload" /v 1 /t REG_MULTI_SZ /D "0001080c" /f
REG UNLOAD HKLM\WINFE2

# toevoegen met notepad
notepad C:\WinPE_amd64\mount\Windows\System32\startnet.cmd
:TEST
ping -n 1 router | find "TTL=" >nul
if errorlevel 1 (
    goto RETRY
) else (
    goto DOSTUFF
)

:RETRY
ping 127.0.0.1 -n 10>nul REM waits given amount of time, set to 10 seconds
goto TEST

:DOSTUFF
net use s: \\router\sntbeheerder snt+4567 /user:sntbeheerder
s:

Dism /unmount-image /mountdir:C:\winpe_amd64\mount\ /commit
# terug in Deployment and imaging Tools Environment
MakeWinPEMedia /ISO C:\WinPE_amd64 C:\WinPE_amd64\WinPE_amd64.iso

Het tijdelijk beschikbaar maken van de Windows installatiebestanden gebeurt met de volgende opdrachten:

  # Windows 10 installatiebestanden eenmalig ter beschikbaar stellen
  mount /dev/sda1 /mnt
  mkdir /home/sntbeheerder/public/windows10
  lodev=`losetup --partscan --find --show /mnt/Windows10Home.img`
  mount $lodev /home/sntbeheerder/public/windows10/ -o ro

  mkdir /home/sntbeheerder/windows7
  lodev=`losetup --partscan --find --show /mnt/window7aio.img`
  # 
  # USB image aanmaken met dd if=/dev/sdb1 of=/mnt/window7aio.img
  mount $lodev /home/sntbeheerder/windows7/ -o ro
  # terug vrijmaken met
  # umount /dev/loop0
  # losetup -d /dev/loop0