====== Switche versenken ======
Switche versenken ist eine Variante von Schiffe versenken, bei der zunächst virtuelle Schiffe gesetzt und dann durch Kabelstecken versenkt werden müssen.
Das hier ist eine **neue** Version des Switche versenken Spieles. Die alte Version befindet sich [[public:sonstiges:unterhaltung:spiele:switche_versenken_alt|hier]].
===== Hardwarevoraussetzungen =====
* Beliebige HP-Switches (die Software ist getestet mit mehreren 2650er Switchen oder jeweils einem 54er Switch)
* Ein Server zum Hosten des Spiels und zum Abfangen der SNMP-Traps (ein einfacher Raspberry Pi zum Beispiel)
* 2 Laptops für die Spieler
* Einige Patchkabel
* Ein weiterer Switch, um alle Switche und die Laptops und den Server miteinander zu verbinden
===== Einrichtung der Switche =====
Allgemein ist es vorgesehen, dass das Spielfeld jedes Spielers aus einer 12x6 Matrix aus Switchports besteht. Bei einem 54er Switch sind das beispielsweise 3 übereinander liegende Module (in diesem Beispiel jeweils immer die Module A, C und E) oder falls keine 54er Switche zur Verfügung stehen, können auch mehrere 1HE-Switche mit mindestens 24 Ports gestacked werden. Für die Einrichtung beider Szenarien folgt nun eine Anleitung:
==== Mit jeweils 3 1HE Switchen pro Spieler ====
- Zunächst sollten die Switche alle eine statische IP im Netz des Servers zugeordnet bekommen
* In diesem Beispiel wird nun davon ausgegangen, dass die Switche die IPs ''10.135.1.20/24-10.135.1.25/24'' haben
* Weiterhin hat in diesem Beispiel der Server die IP ''10.135.1.5/24'' und die SNMP-Community heißt ''swvcom'' (diese wird später bei der Einrichtung des Servers noch auf diesen Wert gesetzt)
- Nun sollte noch die maximale VLAN-Grenze der Switche auf 100 erhöht werden, da jeder Spiele-Port ein eigenes VLAN bekommt, damit es nicht schlimm ist, wenn Loops gesteckt werden
* Dies kann man am einfachsten tun, indem man ''menu'' in der Switch-CLI eingibt und es dort in den VLAN-Einstellungen ändert
- Wenn das getan ist, muss der Switch einmal rebooten, um das VLAN-Limit zu erhöhen
- Wenn er wieder an ist, kann die restliche Konfiguration automatisch erledigt werden, da es sonst sehr mühsam ist, an 3*24 Ports ein eigenes VLAN anzulegen
* Dafür gibt es [[https://gitlab.fem-net.de/swv/swv-scripts/-/blob/main/switchconfig/configure_switch.py|dieses Python-Script]], welches die VLANs anlegt und auch gleich den SNMP-Server einrichtet
* Zum Benutzen des Scripts muss der ausführende Rechner die Switche erreichen können und die Software ''expect'' muss installiert sein
* Wenn diese Voraussetzungen erfüllt sind, kann das Script mit ''./configure_switch.py [switch_ip] [server_ip] [snmp_community] [anzahl_switchports_zum_isolieren]'' ausgeführt werden
* Für einen 2650er 50 Port Switch, bei dem die Ports 1-24 als Spielfeld und 25-48 als Linkerzeuger dienen und 49-50 zum Uplink vorgesehen sind, kann mit oben erwähnten Beispiel-Werten Switch 1 konfiguriert werden:
* ''./configure_switch.py 10.135.1.20 10.135.1.5 swvcom 48'' (das muss jetzt noch für die Switche 2-6 ausgeführt werden und ja 24 isolierte Ports würden prinzipiell auch reichen)
==== Mit jeweils einem 54er Switch pro Spieler ====
- Als erstes wird hierbei vorausgesetzt, dass als Spielfeld die Module A, C und E in den Switchen verwendet werden. Sind noch mehr Module im Switch können diese als Linkerzeuger genutzt werden (oder auch für den Uplink)
- Zunächst sollten die Switche alle eine statische IP im Netz des Servers zugeordnet bekommen
* In diesem Beispiel wird nun davon ausgegangen, dass die Switche die IPs ''10.135.1.20/24'' und ''10.135.1.30/24'' haben
* Weiterhin hat in diesem Beispiel der Server die IP ''10.135.1.5/24'' und die SNMP-Community heißt ''swvcom'' (diese wird später bei der Einrichtung des Servers noch auf diesen Wert gesetzt)
- Nun sollte noch die maximale VLAN-Grenze der Switche auf 100 erhöht werden, da jeder Spiele-Port ein eigenes VLAN bekommt, damit es nicht schlimm ist, wenn Loops gesteckt werden
* Dies kann man am einfachsten tun, indem man ''menu'' in der Switch-CLI eingibt und es dort in den VLAN-Einstellungen ändert
- Wenn das getan ist, muss der Switch einmal rebooten, um das VLAN-Limit zu erhöhen
- Wenn er wieder an ist, kann die restliche Konfiguration automatisch erledigt werden, da es sonst sehr mühsam ist, an 3*24 Ports ein eigenes VLAN anzulegen
* Dafür gibt es [[https://gitlab.fem-net.de/swv/swv-scripts/-/blob/main/switchconfig/configure_switch_54.py|dieses Python-Script]], welches die VLANs anlegt und auch gleich den SNMP-Server einrichtet
* Zum Benutzen des Scripts muss der ausführende Rechner die Switche erreichen können und die Software ''expect'' muss installiert sein
* Wenn diese Voraussetzungen erfüllt sind, kann das Script mit ''./configure_switch_54.py [switch_ip] [server_ip] [snmp_community]'' ausgeführt werden
* Nun kann mit oben genannten Beispielwerten der erste Switch so konfiguriert werden:
* ''./configure_switch.py 10.135.1.20 10.135.1.5 swvcom'' (das muss jetzt noch für den anderen Switch mit der anderen IP ausgeführt werden)
===== Einrichtung des Servers =====
Für die Erklärung wird von folgenden Beispielwerten ausgegangen (Erläuterungen folgen unten):
* Der Server hat die IP ''10.135.1.5/24''
* Die SNMP-Community lautet ''swvcom''
* Der SNMP-Trap-Handler liegt unter ''/etc/snmp/handle.py''
* Das Frontend wird unter ''/var/www/swv/frontend'' ausgecheckt
* Das Backend wird unter ''/var/www/swv/backend/files'' ausgecheckt
* Das venv für das Backend liegt unter ''/var/www/swv/backend/venv''
* Der WSGI-Socket liegt unter ''/var/www/swv/backend/socket/wsgi.sock''
* Die systemd-Unit für das Backend liegt unter ''/etc/systemd/system/swv-backend.service''
Die Einrichtung erfolgt nun so:
- Software installieren:
* ''apt install python3-dev default-libmysqlclient-dev libssl-dev python3 python3-venv mariadb-server nginx snmptrapd nodejs npm''
- snmptrapd einrichten:
- Das passende Handle-Script aus [[https://gitlab.fem-net.de/swv/swv-scripts/-/tree/main/snmptrapd|dem Repo]] nach Beispielsweise ''/etc/snmp/handle.py'' kopieren
* Hier liegen aktuell Handle-Scripts für 2650er und 54er Switche vor. Falls andere Switche verwendet werden, kann mithilfe des dev-handle-Scripts nachgeschaut werden, wie die OIDs für das Linkup-Event und die Portnummer heißen und dann kann entsprechend ein Script abgewandelt werden.
- Die snmptrapd.conf unter ''/etc/snmp/snmptrapd.conf'' kann dann mit unseren Beispielwerten so aussehen:
*
authCommunity log,execute,net swvcom
traphandle default /etc/snmp/handle.py
- snmptrapd aktivieren und starten ''systemctl enable --now snmptrapd''
- Installieren und Konfigurieren des Backends
- Das [[https://gitlab.fem-net.de/swv/swv-backend|Backend]] nach Beispielsweise ''/var/www/swv/backend/files'' auschecken
- Eine MySQL-Datenbank anlegen und mit dem Datenbank-Schema aus dem Backend-Repo befüllen und auch gleich einen MySQL-Benutzer mit Zugriff auf diese DB anlegen
- Ein venv für das Backend anlegen
- ''cd /var/www/swv/backend''
- ''python3 -m venv venv''
- ''source venv/bin/activate''
- ''pip install wheel''
- ''pip install -r files/requirements.txt''
- ''pip install uwsgi''
- Unter Beispielsweise ''/var/www/swv/backend/files/wsgi.py'' eine WSGI-Config mit folgendem Inhalt anlegen:
*
from flaskapp.app import app
if __name__ == "__main__":
app.run()
- Unter Beispielsweise ''/var/www/swv/backend/wsgi.ini'' die WSGI-INI mit folgendem Inhalt anlegen (Pfade bei Bedarf anpassen):
*
[uwsgi]
chdir = /var/www/swv/backend/files
wsgi-file = wsgi.py
callable = app
master = true
processes = 5
socket = /var/www/swv/backend/socket/wsgi.sock
chmod-socket = 660
vacuum = true
die-on-term = true
- Socket-Verzeichnis unter Beispielsweise ''/var/www/swv/backend/socket/'' anlegen
- Backend-Beispielconfig kopieren und anpassen
* Die Config befindet sich in diesem Beispiel unter ''/var/www/swv/backend/files/flaskapp/config''
* Am Ende muss dort eine Datei namens ''secret.py'' liegen
* Die ''secret.example.py'' ist das Beispiel für mehrere 1HE Switche und ''secret.example_54.py'' ist das Beispiel für 54er Switche (die Ports sollten jeweils immer so bleiben können)
- Die systemd-Unit für das Backend anlegen (mit unseren Beispielpfaden):
*
[Unit]
Description=uWSGI Instanz für swv-backend
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/swv/backend/
Environment="PATH=/var/www/swv/backend/venv/bin"
ExecStart=/var/www/swv/backend/venv/bin/uwsgi --ini wsgi.ini --enable-threads
[Install]
WantedBy=multi-user.target
- Die systemd-Unit aktivieren und starten:
* ''systemctl enable --now swv-backend''
- Installieren und Konfigurieren des Frontends
- Das [[https://gitlab.fem-net.de/swv/swv-frontend|Frontend]] nach Beispielsweise ''/var/www/swv/frontend'' auschecken
- Im ausgecheckten Repo unter ''src/config.ts'' die ''BASE_URL'' in unserem Beispiel auf ''http://10.135.1.5'' abändern
- Frontend bauen:
* ''cd /var/www/swv/frontend''
* ''npm i''
* ''npm run build''
- Den nginx Konfigurieren:
* Erneut mit unseren Beispielwerten:
*
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/swv/frontend/build;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location /api/ {
uwsgi_pass unix:///var/www/swv/backend/socket/wsgi.sock;
include uwsgi_params;
}
}
- Den nginx reloaden:
* ''systemctl reload nginx''
- Fertig (Wenn alles geklappt hat, dann sollte das Spiel nun von beiden Laptops aus unter ''http://10.135.1.5/'' erreichbar sein)
- Wenn eine Runde fertig ist, kann das Spiel händisch durch das aufrufen von ''http://10.135.1.5/api/reset'' zurückgesetzt werden (von einem beliebigen Laptop aus)