Process management from the CLI

#sudo kill $(ps aux|sed -e 's/[ ]* / /g'|cut -f2 -d' ')

 


Identifying Interfaces by flashing thier led's

You can use the ethtool to identify a network interface.
ethtool -p <interface>

You can see the result at the yellow blinking LED below.

Unfortunately not every network interface supports this feature.

Cheers,
Ori


Interfaces blinken lassen per ethtool

Um eine Netzwerkkarte zu identifizieren, kann man das ethtool benutzen.
ethtool -p <interface>

Zu sehen an der gelben LED neben dem Interface.

Leider unterstützt nicht jede Netzwerkkarte dieses feature.

Cheers,
Ori


00_Git

Git is a open source distributed version control system.
What does that mean?

The job of a Version Control System is to save files, provide access to them and document changes made to those files. Documented changes are what has been changed when by whom. Normally these systems get used to manage source code, however other types of data can get versionized in that manner as well. Often systems like this get referred to as a CVS rather then a VCS. It means the same.

In case it gets necessary to rollback to a version prioror to a specific change using Git or another VCS it is not a hard task. In software development companys there usually is a server that is running a VCS and the employees are connecting to that resource to apply changes to the code.

One problem with this is that this resource is only available inside the company network. If you are not in, have no VPN to the company network or the internet on one of the branches fails, you cannot commit changes to the code.

Before diving into the most common git terms and the concepts underneath them lets take a look at the distrubuted I mentioned in the beginning. In a classic VCS there is a centralized server that keeps track of code changes.

Distributed in this case means that EVERY user has a local copy of ALL changes. The advantage of this is that most of gits functions can be used without connecting to any server.

You are probably already realizing that versioning has a lingo in itself.
Earlier I was speaking of applying changes to code then I used the term committig changes.

Let me show you the most frequent terms you will face and what they mean.

Git Lingo
Pull - to download or refresh files that have been downloaded in the past and the related change history for those files

Commit - uploading or applying changes to files

Yes GIT does run on windows and it has a GUI.
No I will not get into that.

Now that this is out of the way, let us begin.
If git is already installed on your system you can find out by typing git --version

(To get git integrated into the shell, like in the screenshot above, take a look at my OhMyZsh Post 1 and Post 2.)

If git is not installed in your distro, you can install it using apt, yum, rpm etc.

apt install git

Cheers,
Ori


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


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


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


02_OhMyZsh Plugins and Themes

OhMyZsh comes with a lot of Plugins that change the way the ZSH handels.
There is a Wiki on the official github page of the project, that only covers these plugins.

If you have a look into the .zshrc in your home directory you will find the part about plugins.

You can add any number of plugins you want from the above mentioned resource.
Now change into the directory .oh-my-zsh/
You will notice a couple of things.

The Tilde (~) that has shown you that you are in your home directory has changed to .oh-my-zsh.
So far so self explanatory.

ZSH has been, as shown in the above .zshrc screenshot, been started with the git plugin.
Since .oh-my-zsh is a pulled git repository, the prompt now shows git:
And since you are in the master branch of the repo, the promt reads git:(master).

In here you will find the directory themes that is containing (shocker) OhMyZsh's themes library.
These themes define what the zsh looks like.

If you want to know what to expect look at this.
To apply one of the themes to go your .zshrc and edit the line ZSH_THEME.
Just replace the default theme robbyrussell with a theme of your choice.

After you have saved your changes you can apply the changes by sourcing the .zshrc.
source ~.zshrc

If you now cd into .oh-my-zsh again, your prompt will look like this.

If you are in a repo and make changes to the branch that you are in, the color will change until you commit.
Now it is up to you, go and find the themes and plugins that make your day!

Cheers,
Ori


01_OhMyZsh installation

In this article I want to recommend to you using the very powerful zsh (z-shell) extension OhMyZsh.

First check if zsh is installed already.
which zsh

If not update your sources and install it.
apt install zsh

It makes sense to make zsh your default.
chsh -s $(which zsh)

After you log back in or reboot your machine you will be faced with the following:

I do recommend using option 2 as it will created the usual .rc file in your home dir that you would expect.
Then zsh will greet you with a very simplistic prompt.

If you have not installed it by now, install git.
apt install git

Now pull OhMyZsh from github and installit using curl or wget.

Curl
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

Wget
sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

 

That was the entire magic, OhMyZsh is now installed.
See the other article(s) on what you can do with it.

Cheers,
Ori


05_Byobu nesting

Nesting means starting a byobu session within a byobu session. (Yo, dawg)
On one system that does not really make sense.

If you have a session on your local machine and then ssh into another machine just to start a byobu session there, you have a nested session.

If you now press for example Ctrl + a ---> c to open a new window, it will be opened on your local machine.
To send the same command one layer deeper, use Strg + a ---> ac.

This means that every a you are using is pushing your command one nesting layer up.
This is what this looks like on a nesting of three layers.

This way you can have a window for your host, one for each HV (hypervisor) and one for each VM on the HV.

Cheers,
Ori