HAPROXY neuer Check für check_mk in ps1 / py / bash / go

Ich hatte mal wieder mit haproxy zu tun, leider hatte diese niemand in das Monitoring eingepflegt.
Ist natürlich doof wenn immer die Sessions voll laufen und keiner was merkt.
Lange Rede kurzer Sinn ;-)
Python & Powershell reagieren gleich wenn
$WIPass = '' bzw WIPass = ''
wird der check ohne auth ausgeführt. Sollte eure Statusseite nicht über ssl erreichbar sein, sollte man noch die ssl checks rauswerfen ! Unter Powershell einfach diese Zeilen auskommentieren
SkipCertificateCheck
unter Python bitte das aus den Zeilen entfernen
, verify=False
Hier ist der Check in Powershell / Python und Bash.
Ich empfehle die Python Version ;-)
checkmk-haproxy-localcheck in powershell / python und bash

Linux : ~/ sichern mit Borgbackup

Ich habe hier einiges an sensible Daten in meinem Homeverzeichnis die ich nicht verlieren möchte. Deswegen habe ich mir ein borgbackup eingerichtet das mir alle 30 Minuten ein Backup auf meine zweite HDD schiebt. Da beide HDD bei mir mit LUKS verschlüsselt sind ist das Repo nicht gesondert gesichert.

Sollte man hier auf ein NFS oder ein anderes unverschlüsseltes Ziel sichern rate ich zu einer encryption !

Installieren von borgbackup
sudo apt install borgbackup
dann richten wir auf der zweiten HDD ein Repo ein. Das hab ich dann so gemacht
mkdir -p /media/chris/hdd2/backup
cd /media/chris/hdd2/backup
natürlich muss der mountpoint eurer Umgebung angepasst werden. Jetzt initialisieren wir das REPO für das Backup
borg init -e none /media/chris/hdd2/backup
Nochmal der Hinweis -e none kommt bei mir nur zum Einsatz da ALLE HDDs in meinem Notebook mit LUKS verschlüsselt sind
Ab jetzt kann man Backups in das Verzeichnis machen. Ich hab mir hier das ein Script zusammengebaut
!/bin/bash
_bbin=$(which borg)
_tbin=$(which tee)
# -----------------------------------------------------------------
# VARs
# -----------------------------------------------------------------
_own_path=$(dirname $(readlink -f ${0}))
_mnt_path="" # mount point 2 hdd
_src_path="" # was soll gesichert werden ? z.B. /home/test sichert das komplette Homeverzeichniss
_exclude="" # welche Verzeichnisse sollten nicht gesichert werden ? z.B. /home/test/Downloads
_tar_path="" # Wohin wird gesichert
_repo_name="HOME-$(date '+%Y%m%d-%H%M%S')" # Name der Sicherung
_borg_para="-v --stats -C lz4" # Parameter für das Borgbackup
_borg_log="${_own_path}/logs/borg.log" # wo liegt das log
# -----------------------------------------------------------------
# parameter for borg prune
# https://borgbackup.readthedocs.io/en/stable/usage/prune.html
KH=2    # keep hourly
KD=2    # keep daily
KW=4    # keep weekly
KM=3    # keep monthly
# create prune parameter
_borg_prune=""
if [ ${KH} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-hourly=${KH}"
fi

if [ ${KD} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-daily=${KD}"
fi

if [ ${KW} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-weekly=${KW}"
fi

if [ ${KM} != 0 ]; then
    _borg_prune="${_borg_prune} --keep-monthly=${KM}"
fi
# -----------------------------------------------------------------
# check folders
if [ ! -d "${_own_path}/logs" ]; then
    mkdir -p "${_own_path}/logs"
fi
# -----------------------------------------------------------------
# write all to logfile
exec > >(${_tbin} -i ${_borg_log})
exec 2>&1
# -----------------------------------------------------------------
_chk_mnt=$(mount | grep -iq "${_mnt_path}")
if [ $? -eq 0 ]; then
    echo -e "\n#----------------------------------------------------------------------------------------------#"
    echo "############### borg create ####################################################################"
    echo -e "#----------------------------------------------------------------------------------------------#\n"
    ${_bbin} create ${_borg_para} ${_tar_path}::${_repo_name} ${_src_path}
    if [ $? -eq 0 ]; then
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg prune #####################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} prune --list ${_tar_path} ${_borg_prune}
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg list ######################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} list ${_tar_path}
        echo -e "\n#----------------------------------------------------------------------------------------------#"
        echo "############### borg info ######################################################################"
        echo -e "#----------------------------------------------------------------------------------------------#\n"
        ${_bbin} info ${_tar_path}
    fi
    exit 0
else
    echo "$(date '%Y%m%d %H:%M') - ${_mnt_path} is not mounted exited" >> ${_borg_log}
    exit 1
fi
diese Script legt man sich jetzt irgendwo auf die Platte und ruft es in crontab auf z.B. alle 30 Minuten
*/30 * * * * /scripts/create_borg_backup.sh

ffmpeg : schneiden von Videos

da ich mir immer wieder in der ManPage das zusammen Suche schreib ich jetzt einfach mal einen Eintrag hier.
Man kann relativ schnell mit ffmpeg ein Video scheiden, ich selbst schneide meine Screencast damit und bin recht zufrieden. Ein Keyframe genaus scheiden ist damit aber leider nicht möglich, ist immer ein wenig Bastelei. Jedoch entfällt das üblich neu kodieren des Videos das z.B. bei OpenShot fällig wird.
ffmpeg -ss 15 -i recorded-stream.mkv -to 01:55:21 -c copy configure-atp-on-office365.mkv
Auszug aus der Manpage
  -ss  position (input/output)
  -i   input_file
  -to  position (input/output)
  -c   [:stream_specifier] codec (input/output,per-stream)
soll heißen hier wird der codec des audio stream und des video stream kopiert.

Bash : Video aus Webcam Bildern erstellen

Da ich es einfacher finde für die Archivierung von Webcam Bildern Videos zu verwenden habe ich diese Script geschrieben. Die Webcam erstellt ein Bild wenn Sie Bewegung wahrnimmt. Diese werden von diesem Skript zu einen einzelnen Video vereint.
Ihr müsst nur die Variablen euren Gegebenheiten anpassen.
Variablen :
{FTP-USER} = der FTP Benutzer
{FTP-GROUP} = die FTP Gruppe
{QUELL-PFAD} = quelle der Snapshots
{ZIEL-PFAD} = wo soll das Video abgelegt werden ?
Script :
#!/bin/bash
#
# Konvertiert Einzelbilder zu Video mit ffmpeg
_src_folder={QUELL-PFAD}
_src_file_format=jpg
_tar_folder={ZIEL-PFAD}
_tar_file_format=mpg
_tar_file_name="video_$(date +%Y-%m-%d_%R)"
_temp_folder=$(mktemp -d)
_length=5
_cnt_files_in_src=$(ls -l ${_src_folder}/*.${_src_file_format} 2>/dev/null | wc -l)
_ftp_user={FTP-USER}
_ftp_group={FTP-GROUP}
_bin_ffmpeg=$(which ffmpeg)
_bin_chown=$(which chown)
_bin_rm=$(which rm)
_bin_find=$(which find)
# Bilder nach konvertieren löschen ?
DELFILESAFTERVIDEO=TRUE # TRUE OR FALSE
# setze symlinks in tempfolder
cnt=1
if [ ${_cnt_files_in_src} != "0" ]; then
        if [[ -d  "${_temp_folder}" && -d "${_src_folder}" ]]; then
                for i in ${_src_folder}/*.${_src_file_format};
                do
                        ln -s "${i}" "${_temp_folder}/$(printf %0${_length}d $cnt).jpg"
                        ((cnt++))
                done
                ${_bin_ffmpeg} -f image2 -i "${_temp_folder}/%0${_length}d.jpg" -r 25 -vcodec libx264 "${_tar_folder}/${_tar_file_name}.${_tar_file_format}" > /dev/null 2>&1
                ${_bin_rm} -rf "${_temp_folder}"
                ${_bin_chown} ${_ftp_user}:${_ftp_group} "${_tar_folder}/${_tar_file_name}.${_tar_file_format}"
                # löscht alle vorhanden bilder
                if [ ${DELFILESAFTERVIDEO} == "TRUE" ]; then
                ${_bin_find} ${_src_folder}/ -name "*.${_src_file_format}" -exec ${_bin_rm} {} \;
                fi
        else
                echo "ERROR : TEMP FOLDER OR SOURCE FOLDER DO NOT EXISTS"
                exit 99
        fi
else
                echo "found no files in source exit"
                exit 99
fi

Check_MK monitoren der haproxy Backends

Kleines lokales Plugin für check_mk um die HAProxy Backends zu monitoren.

das Skript muss unter /usr/lib/check_mk_agent/local angelegt werden.
touch /usr/lib/check_mk_agent/local/haproxy-local.sh
Dort dann den nachfolgenden Code reinkopieren und Konfiguration anpassen.
#!/bin/bash
#
# checks haproxy
#

_awk_bin=$(which awk)
_status_url="http://localhost:9090/haproxy/"
_server_name="ha-cap-"
a=0

# $(curl -s ${_status_url}\;csv | grep "^${_server_name}" | grep -vE "(FRONTEND|BACKEND)")

for line in $(curl -s ${_status_url}\;csv | grep "^${_server_name}" | grep -vE "(FRONTEND|BACKEND)"); do
        _name=$(echo $line | ${_awk_bin} -F',' '{ print $1; }' )
        _host=$(echo $line | ${_awk_bin} -F',' '{ print $2; }' )
        _stat=$(echo $line | ${_awk_bin} -F',' '{ print $18; }')
        STATUSTXT="${_name}  ${_host}  ${_stat}"
        if [ ${_stat} == "UP" ]; then
                _check_response="0"
        else
                _check_response="2"
        fi
        if [ ${a} -lt 10 ]; then
                echo "${_check_response} BEHIND-HAPROXY-0${a} - ${STATUSTXT}"
        else
                echo "${_check_response} BEHIND-HAPROXY-${a} - ${STATUSTXT}"
        fi
        a=$((a+1))
done

Ergebnis sieht dann so aus
check_mk + haproxy
check_mk + haproxy

Natürlich muss auch der haproxy so konfiguriert sein das er die Statusseite ausliefert. Hier Auszug aus der haproxy.cfg
listen status
    bind *:9090
    mode http
    stats enable
    stats uri /haproxy
    acl localhost  src  127.0.0.1
    acl stats      path_beg  /haproxy
    http-request allow if stats localhost
    http-request deny  if stats !localhost

VIM Sonderzeichen ersetzen (hexadezimal)

Problem : In manchen Fällen bekommt man Dateien von Kunden geschickt die irgendein unbekanntes encoding enthalten. mit recode und iconv kam in meinem Fall auch nur Mist raus.

Lösung :
Die Datei mit vim öffnen und das encoding auf utf8 festnageln.
set fenc=utf8
dann können die unbekannten Zeichen ersetzt werden. Hier ein paar Beispiele.
:%s#\%x86#Ü#g
:%s#\%x9f#ü#g
:%s#\%x8a#ä#g
:%s#\%x9a#ö#g
:%s#§#ß#g
“Das einzig sichere System müsste ausgeschaltet, in einem versiegelten und von Stahlbeton ummantelten Raum und von bewaffneten Schutztruppen umstellt sein.”
Gene Spafford (Sicherheitsexperte)