Of Factorio

In my free time, amongst other things, I like to play a round of Factorio.
In a nutshell Factorio is a game centered around automating production.

I think this Video explains the concept of the game quite well.

https://www.youtube.com/watch?v=KVvXv1Z6EY8

This game can be played by multiple players on a server.
There is a nice Docker Container for Factorio that allows you to have your own server up and running in no time.

 

Unfortunately there is no easy way to allow other players uploading maps to the server.
So I came up with a solution using nextcloud.

What you need:

  • A Docker Host that is running the dtandersen/factorio container
  • A resource (like a nextcloud) that you can check a file from, download a savegame from and share with others

The Idea:

  • The Docker Host is running a script (see below) every minute

Add the following line to the /etc/crontab and use the path were you dropped that script.

* * * * * root /path/to/script.sh

  • This script checks the content of a textfile at a resource of your choice using ssh
  • In case the text file does not contain a 1, nothing happens
  • In case the file does contain a 1 the script will be run

The script:

  • Stops docker
  • Moves the currently running map in a backup directory
  • Then deletes the current savegame
  • Connects to a ressource, downloads *.zip and places them in the savegame directory
  • Changes the owner of the savegame so the docker container can work with it
  • Restarts docker
  • Writes into a logfile at the ressource

Directories:

  • The savegame directorz, mounted by the container is  /opt/factorio/save

You will have to change the script by hand, and generate the ssh keys.
It is not pretty but it does work.

 

Cheers,
Ori

 

#!/bin/bash
factorio=$(ssh root@IP 'cat path/to/Checkme.txt')

if (echo $factorio | grep -q "1")
then
service docker stop
cp /opt/factorio/saves/save.zip /opt/factorio/backup_save/save.zip
rm -rf /opt/factorio/saves/*
scp root@IP:/path/to/savegame/\*.zip /opt/factorio/saves/.
chown -R 845:845 /opt/factorio/saves

service docker start

ssh root@192.168.122.79 'echo "0" > path/to/Checkme.txt'
ssh root@192.168.122.79 'echo "Server rebooted at $(date +\%d-\%m-\%Y-\%H-\%M-\%S)" >> path/to/RebootLog.txt'
factorio=0
else
echo "DEBUG ME SEMPAI"
fi


Orca MSI Editor

The Orca MSI Editor is part of the Windows 10 SDK and enables you to edit the settings of an MSI file.
In the default settings the 4.4 MB lightweight SDK gets installed at C:\Program Files (x86)\Windows Kits\10 installiert.

In order to be able to edit MSI files we simply need to install the MSI Tools.

In the installation path you will find the subfolder WindowsSDK\Installers that contain the file Orca-x86_en-us.msi.
The full path in a default install is:

C:\Program Files (x86)\Windows Kits\10\WindowsSDK\Installers\Orca-x86_en-us.msi

After you have run this, in the context menu of right klicking an MSI file, you will find the option to  edit with Orca.

Using this tool you can do a lot of finetuning before rolling out a MSI.

Cheers,
Ori


Azure

Placeholder


[HP / Aruba ] Troubleshooting V-Lan issues / finding physical devices

In this article I want to show you how to find out where physical devices are connected to in a network using HP Switches.
Typical scenario, will happen from time to time:

  • A customer reports that a user cannot access resource X
  • You check his IP and see that he or she has a lease from a wrong network

Usually this means that the user is connected to a port configured with a wrong v-lan on it.
If there is a clean documentation that issue should be quite easy to solve.
Unfortunately you sometimes have to deal with customers that seem to have guerilla cabeling written in thier company policy or that have taken over a bad IT infrastructure. You will find a cable that runs into a (hopefully) labeled port in the wall and then ends up somewhere in some switch.
How do you find out what port has to be reconfigured in order for the customer to be able to work?

First find out the MAC Address of the device you want to find in your network.
At a windows machine use ipconfig, on Linux / Apple use ifconfig or ip.

Now login to one of the customers switches using SSH.
Check if LLDP is active.

show lldp config

If not you should enable LLDP on all devices first.
More details can be found here.

Then check the MAC Address Table of the Switch for the MAC Address of the device you are looking for.

show mac-address <MAC>

The Switch knows that MAC on port 49...
Port 49 on a 48 Port Switch is quite a Dead Giveaway that you are looking at a glas uplink to another switch.

Lets look at the MAC Table of port 49.
(Or rather filter for devices at that port)

show mac-address ethernet <Interface>

As expected there are quite a lot of devices there.
Lets check LLDP what is behind Port 49.

show lldp info remote-device ethernet <Interface>

Aha, another switch.
This way you can hop from device to device until you found out what port this device is connected to.

The you can change the v-lan config of that interface and everything should work as expected for the user.

THINK TWICE ABOUT WHAT YOU ARE DOING!
IF YOU MESS UP THE V-LAN CONFIG OF AN UPLINK YOU CAN END UP CRASHING THE ENTIRE NETWORK OR PARTS OF IT!

... and if in that case you are not on-site, good night!

Cheers,
Ori


[HP / Aruba ] V-Lan Probleme beheben / Physische Geräte hinter Ports finden

In diesem Artikel möchte ich euch kurz zeigen, wie Ihr ein angeschlossenes Physisches Gerät in einem Netz findet, dass auf HP Switches setzt.
Typisches Scenario, tritt immer wieder auf:

  • Ein Kunde meldet sich, da er auf Ressource X nicht zugreifen kann
  • Ihr schaut euch seine IP an und er hat einen Lease aus einem Falschen Netz

In der Regel bedeutet das, dass auf dem Port an dem er angeschlossen ist eine falsche V-Lan Konfiguration liegt.
Wenn es eine saubere Dokumentation gibt sollte das Problem schnell gelöst sein.
Leider hat man es ab und zu mit Kunden zu tun, bei denen Guerillaverkabelung Firmenpolitik zu sein scheint oder die einfach beim Einzug eine Schrott IT übernommen haben. Da geht dann ein Kabel in eine (hoffentlich) beschriftete Dose in der Wand die dann irgendwie irgendwo in einem der vielen Switche im Haus endet.
Wie bekommt man also raus, welchen Port man umkonfigurieren muss um den Anwender arbeitsfähig zu bekommen?

Zunächst schaut Ihr euch die MAC Adresse des Gerätes an, das Ihr finden wollt.
Unter Windows nutzt Ihr dazu ipconfig, auf Linux / Apple nutzt Ihr ifconfig oder ip.

Jetzt loggt ihr euch auf einem der HP Switche des Kunden per SSH ein.
Prüft, ob LLDP aktiv ist.

show lldp config

Falls nicht, sollte Ihr zunächst auf allen Geräten LLDP einschalten.
Details dazu findet Ihr hier.

Sucht dann im MAC Address Table des Switches nach der MAC Adresse des Gerätes das Ihr sucht.

show mac-address <MAC>

Das Gerät ist dem Switch auf Port 49 bekannt...
Port 49 ist auf einem 48 Port Switch ein ziemlicher Dead Giveaway dafür, dass es sich um einen Glas Uplink zu einem anderen Switch handelt.

Schauen wir uns mal den MAC Address Table von Port 49 an.

show mac-address ethernet <Interface>

Wie erwartet tümmelt sich hier einiges.
Schauen wir doch mal mit LLDP was sich hinter Port 49 befindet.

show lldp info remote-device ethernet <Interface>

Aha, ein weiterer Switch.
So könnt Ihr euch von Gerät zu Gerät hangeln, bis ihr gefunden habt auf welchem Port euer Gerät hängt.

Dann könnt Ihr die V-Lan config anpassen und schon klaptts auch mit den Nachbarn.

DENKT ZWEI MAL DARÜBER NACH WAS IHR MACHT!
WENN IHR DIE V-LAN KONFIG VON EINEM UPLINK VERKONFIGURIERT, KÖNNT IHR IM ZWEIFEL DAS GANZE NETZ ZUSAMMENBRECHEN LASSEN!

... wenn ihr dann nicht vor Ort seid, gute Nacht.

Cheers,
Ori


RegKeys überwachen

In diesem Artikel möchte ich euch zeigen, wie Ihr mit dem Process Monitor aus den Sysinternals von Microsoft die Veränderung von RegKeys überwachen könnt.
Außerdem solltet verwende ich den Process Explorer, was ein aufgemotzter Taskmanager ist. Der Taskmanager tut es in diesem Fall aber auch.

Wenn Ihr den Process Monitor (procmon.exe) startet, werdet Ihr mit einem Filter Pop-Up begrüßt.
Danke, sehr aufdringlich von Ihnen.

Hier könnt Ihr filtern, welche Aktivitäten Ihr überwachen wollt.
Ich möchte mir mal den Installationsprozess von WinRAR ansehen.

Startet die Installation und sucht euch die PID (Process ID) Raus.

Wählt dann in der Kopfzeile des Filterdialoges PID is <PID> then include aus.

Da in dieser Liste auch angegeben wird, welche Ereignisse NICHT beobachtet werden sollen, müssen wir die RegKey Changes explizit ausnehmen.
Doppelte Verneinung und so.

Nach etwa 30 Sekunden hat der Procmon aus 2.5 Millionen events die Im Betriebssystem ausgelöst wurden, etwa 2600 für uns interessante herausgefiltert.

Schon nicht schlecht aber noch nicht gut genug.
Ich speichere die Ergebnisse als CSV Datei (Strg + S) .

Und öffne Sie dann in Excel um sie ein bisschen näher zu untersuchen.
Hier importiere ich die selben Daten dann nochmal aus der CSV. Weil.

Hier lasse ich alle Werte im Default und sage damit, dass das Trennzeichen der CSV (Comma Seperated Value) ein Komma sein soll.
Jetzt kann ich einfach nach einzelnen Registry Events filtern.

Schauen wir uns mal die interessantesten Events an.
RegCreateKey
RegSetInfoKey

Da waren's nur noch vier.
Startet mit Windows + R den Windows Ausführen dialog und gebt dort RegEdit ein.

Damit könnt Ihr die Windows Registry editieren.
Internet Explorer\BrowserEmulation interessiert mich nicht wirklich.

Wenn Ihr mehr über die Windows Registry lernen wollt, schaut euch folgenden techconsumerguide Artikel an.

Schauen wir uns also Software\WinRAR SFX an.
Der RegKey hält nur den Pfad zu der WinRAR.exe.

Schauen wir uns mal an, was so im SyncRootManager steht.

Nicht sehr spannend aber ich denke das Prinzip ist klar geworden.

Cheers,
Ori


Von Factorio

Ich spiele in meiner Freizeit unter Anderem ein Spiel namens Factorio.
Kurz zusammengefasst ist Factorio ein Spiel in dem es darum geht eine Produktion zu automatisieren.

Dieses Video erklärt das Konzept des Spiels sehr gut.

https://www.youtube.com/watch?v=KVvXv1Z6EY8

Das Spiel lässt sich mit mehreren Spielern auf einem Server spielen.
Es gibt einen super Docker Container für Factorio, der es einem erlaubt im Handumdrehen einen Server aufzusetzen.

Leider gibt es kein einfaches Feature andere Spieler Maps auf den Server laden zu lassen, also habe ich mit Nextcloud mal eine Lösung zusammengeklöppelt.

Was Ihr braucht:

  • Einen Docker Host auf dem der dtandersen/factorio Container läuft
  • Eine ressource, von der Ihr Savegames herunterladen und eine Datei prüfen könnt

Die Idee:

  • Der Docker Host führt jede Minute ein script (siehe unten) aus

Fügt hierzu in der /etc/crontab folgende Zeile hinzu und benutzt den Pfad, wo Ihr das script abgelegt habt.

* * * * * root /path/to/script.sh

  • In diesem Script wird der Inhalt einer Textdatei in einer Ressource eurer Wahl über ssh geprüft
  • Ist der Inhalt dieser Datei nicht 1, passiert nichts
  • Ist der Inhalt dieser Datei 1 wird das Script ausgeführt

Das Script:

  • Stoppt docker
  • Verschiebt die aktuelle map in ein Backupverzeichnis
  • löscht das aktuelle Savegame
  • Vebindet sich mit einer ressource, *.zip herunter und legt es in das Savegameverzeichnis
  • Ändert den Owner des Savegames, so dass der Docker Container damit arbeiten kann
  • Startet docker wieder
  • Schreibt ein Log in die Ressource

Verzeichnisse:

  • Savegame location, gemounted vom Container /opt/factorio/save

Ihr müsst das Script noch von Hand anpassen, genauso wie ssh keys generieren.
Es ist nicht schön, es ist nicht sauber aber es funktioniert.

 

Cheers,
Ori

 

#!/bin/bash
factorio=$(ssh root@IP 'cat path/to/Checkme.txt')

if (echo $factorio | grep -q "1")
then
service docker stop
cp /opt/factorio/saves/save.zip /opt/factorio/backup_save/save.zip
rm -rf /opt/factorio/saves/*
scp root@IP:/path/to/savegame/\*.zip /opt/factorio/saves/.
chown -R 845:845 /opt/factorio/saves

service docker start

ssh root@192.168.122.79 'echo "0" > path/to/Checkme.txt'
ssh root@192.168.122.79 'echo "Server rebooted at $(date +\%d-\%m-\%Y-\%H-\%M-\%S)" >> path/to/RebootLog.txt'
factorio=0
else
echo "DEBUG ME SEMPAI"
fi


Orca MSI Editor

Der Orca MSI Editor ist teil des Windows 10 SDK und erlaubt es, die Eigenschaften von MSI Dateien zu bearbeiten.
Im default wird das mit 4.4 MB echt leichtgewichtige SDK unter C:\Program Files (x86)\Windows Kits\10 installiert.

Uns recht für das Editieren von MSI Paketen die Installation des MSI Tools.

In dem Installationsverzeichnis gibt es in dem Unterordner WindowsSDK\Installers die Datei Orca-x86_en-us.msi.
Der Volle Pfad lautet also im default:

C:\Program Files (x86)\Windows Kits\10\WindowsSDK\Installers\Orca-x86_en-us.msi

Wenn Ihr dieses ausgeführt habt, findet Ihr in eurem Rechtsklick Kontextmenü auf eine MSI Datei den Menüpunkt edit with Orca.

Mit diesem könnt ihr jetzt sehr viel Finetuning betreiben, bevor Ihr eine MSI ausrollt.

Cheers,
Ori


00_Git

Git ist ein open source distributed version control system.
Was bedeuetet das?

Die Aufgabe eines Version Control System ist es, Dateien zu speichern, zur Verfügung zu stellen und Änderungen an Ihnen zu dokumentieren.
Erfasst werden dabei wer was wann geändert hat. In der Regel werden diese Systeme verwendet um Quelltext zu verwalten, es können aber genauso gut andere Dateitypen mit einer Versionierung gepflegt werden. Oft wird so ein System nicht als VCS sondern als CVS bezeichnet, meint aber das gleiche.

Sollte es nötig werden, den Stand von vor einer bestimmten Änderung wiederherzustellen, ist dies mit Git oder einem anderen VCS ohne Probleme möglich.
In Firmen gibt es in der Regel einen Server auf dem ein VCS läuft und die Mitarbeiter verbinden sich mit dieser Ressource um Änderungen am Code einzuspielen.

Ein Problem dabei ist es, dass diese Ressource nur aus dem Firmennetz erreichbar ist und wenn man kein VPN in das Firmennetz hat oder das Internet an einem Standort ausfällt, können keine Changes commited werden.

Bevor ich aber auf die gängigsten Begriffe und die dahinterstehenden Konzepte von Verhaltenskontrolle eingehen werde noch kurz ein Wort zu dem eingangs erwähnten distrubuted. In einem klassischen VCS hat ein zentraler Server Informationen über die Änderungen und damit die älteren Versionen.

Distributed (eng. verteilt) in diese Fall bedeutet, dass jeder Nutzer eine lokale Kopie der Dateien und eine Historie aller Änderungen hält.
Der Vorteil davon ist, dass die meisten Aktionen durchgeführt werden können, ohne das eine Verbindung zu einem Server hergestellt werden muss.

Ihr seht bereits, Versionsverwaltung hat eine eingene Lingo.
Anfangs sprach ich davon, Änderungen am Code einzuspielen und jetzt verwendete ich den Ausdruck changes committen.
(Was sich zugegebenermaßen ziemlich komisch liest)

Lasst mich euch die gängigsten Begriffe vorstellen und was sie bedeuten.

Git Lingo
Pull - das herunterladen bzw. aktualisieren bereits heruntergeladener Dateien und der Änderungshistorie
Commit - das hochladen von Dateien bzw. das Einspielen von Änderungen an Dateien

Ja git läuft auch auf Windows und läuft auch mit GUI.
Damit werde ich mich aber nicht beschäftigen.

Jetzt, da das aus dem Weg ist, lasst uns beginnen.
Ob git bereits installiert ist könnt Ihr prüfen mit git --version

(Um git wie in dem Screenshot zu sehen direkt in die shell zu integrieren, seht euch OhMyZsh Post 1 und Post 2 an.)

Falls git nicht installiert ist könnt Ihr es auf fast allen Distros einfach mit apt oder yum installieren.

apt install git

Cheers,
Ori