Veeam Certified Engineer 2023

Nachdem ich 2022 bereits einen Kurs zum Thema Veeam Backup & Replication: Configure, Manage and Recover gemacht hatte, habe ich kurz vor Weihnachten noch die Prüfung zum Veeam Certified Engineer gemacht. Spoiler: Ich habe bestanden 🙂

Veeam Certified Engineer 2023 weiterlesen

DJI Drohnenpanorama nachträglich erstellen

Die DJI Drohnen bieten die Möglichkeit tolle 360°-Panoramas zu machen, allerdings mit einer kleinen Tücke: Sie speichert erstmal nur Einzelbilder ab, das Panorama muss man im Nachhinein mit der DJI Fly-App erstellen (ganz Einfach durch Antippen in der Galerie).

Hat man das mal vergessen (so wie ich), und die Bilder schon von der SD-Karte aus der Drohne ins Archiv verschoben und aufgeräumt, dann ist die Chance vorbei. Allerdings kann man die Bilder der App und der Drohne noch einmal unterjubeln.

DJI Drohnenpanorama nachträglich erstellen weiterlesen

apt-cacher ausmisten

Heute Morgen meldete Zabbix dass der Cache vom apt-cacher langsam voll läuft.

root@hostname:/var/cache/apt-cacher# df -h /var/cache/apt-cacher
Filesystem Size Used Avail Use% Mounted on
/dev/sde1 40G 39G 2.0G 96% /var/cache/apt-cacher

Bevor ich die Platte nochmal vergrößere wollte ich erst einmal schauen ob sich da nicht vielleicht ein wenig Platz schaffen lässt. Dazu schaute ich mir den Cron-Job an, der regelmäßig den Cleanup durchführt und ließ das Script einfach mal laufen.

root@hostname:/var/cache/apt-cacher# /usr/share/apt-cacher/apt-cacher-cleanup.pl
developer.download.nvidia.com_compute_cuda_repos_ubuntu2004_x86_64_{In,}Release not available upstream.
Remove the following files manually if they are no longer significant and you want to clean cached packages they reference:-
developer.download.nvidia.com_compute_cuda_repos_ubuntu2004_x86_64_Packages.gz
Exiting to prevent deletion of cache contents.
apt-cacher ausmisten weiterlesen

Synology: Festplatte ohne RAID tauschen

Ich habe in einer Synology Diskstation DS220+ zwei Festplatten die ich nicht als RAID nutze, sondern als separate Volumes konfiguriert habe. Eine enthält eher unwichtige Daten, die andere wird regelmäßig auf eine USB-Platte gesichert die außer Haus gelagert wird.

Nun wurde es langsam Zeit die mehr als 10 Jahre alte Festplatte gegen eine größere auszutauschen. Leider ist dieser Fall von Synology nicht vorgesehen, die Anleitungen zum Festplattentausch gehen immer davon aus, dass man die Platten im RAID-Verbund hat.

Synology: Festplatte ohne RAID tauschen weiterlesen

OwnTracks auf Uberspace

Auf dem alten Server hatte ich eine OwnTracks-Instanz in Docker-Containern laufen, schlicht und einfach weil direkt Container dafür bereitgestellt werden. Da bei Uberspace keine Container angeboten werden und ich keine root-Rechte habe bleibt mir nichts anderes übrig als die Komponenten im Userspace einzurichten.

OwnTracks auf Uberspace weiterlesen

Umzug in den Uberspace

Seit November ist diese Seite nicht mehr bei Server4you, sondern bei Uberspace gehostet. Bei S4Y hatte ich einen Root-Server gemietet, den ich damit komplett für mich alleine hatte, aber damit auch selbst pflegen musste. Das war viele Jahre lang ideal für mich, zuletzt empfand ich es aber nur noch als lästig, es reicht mir dass ich mich um die Anwendungen kümmern muss die ich darauf laufen lasse. Dazu kam noch dass (mal wieder) Hardware am Server kaputt ging, und das war für mich dann der Punkt den Umzug, mit dem ich schon länger geliebäugelt hatte umzusetzen.

Umzug in den Uberspace weiterlesen

PHP auf der Kommandozeile bei Strato

Versucht man die Kommandozeilentools von NextCloud occ und updater.phar bei Strato zu benutzen dann bekommt man so nette Fehlermeldungen:

> php updater/updater.phar
Nextcloud Updater - version: v20.0.0beta4-11-g68fa0d4
Current version is 20.0.3.
Update to Nextcloud 20.0.12 available. (channel: "stable")
Following file will be downloaded automatically: https://download.nextcloud.com/server/releases/nextcloud-20.0.12.zip
Open changelog ↗
Steps that will be executed:
[ ] Check for expected files
[ ] Check for write permissions
[ ] Create backup
[ ] Downloading
[ ] Verify integrity
[ ] Extracting
[ ] Enable maintenance mode
[ ] Replace entry points
[ ] Delete old files
[ ] Move new files in place
[ ] Done
Start update? [y/N] PHP Warning:  Use of undefined constant STDIN - assumed 'STDIN' (this will throw an Error in a future version of PHP) in phar:///mnt/web120/e2/56/510XXX56/htdocs/cloud/updater/updater.phar/vendor/symfony/console/Helper/QuestionHelper.php on line 117
PHP Warning:  fgets() expects parameter 1 to be resource, string given in phar:///mnt/web120/e2/56/510XXX56/htdocs/cloud/updater/updater.phar/vendor/symfony/console/Helper/QuestionHelper.php on line 133
[RuntimeException]
Aborted
update [--no-backup]
X-Powered-By: PHP/7.4.23
Content-type: text/html

oder bei occ:

php occ upgrade
X-Powered-By: PHP/7.4.23
Content-type: text/html
An unhandled exception has been thrown:
TypeError: Return value of OC\AppFramework\Http\Request::getScriptName() must be of the type string, null returned in /mnt/web120/e2/56/51008256/htdocs/WordPress-WH3/cloud/lib/private/AppFramework/Http/Request.php:837
Stack trace:
#0 /mnt/web120/e2/56/510XXX56/htdocs/cloud/lib/base.php(163): OC\AppFramework\Http\Request->getScriptName()
#1 /mnt/web120/e2/56/510XXX56/htdocs/cloud/lib/base.php(576): OC::initPaths()
#2 /mnt/web120/e2/56/510XXX56/htdocs/cloud/lib/base.php(1091): OC::init()
#3 /mnt/web120/e2/56/510XXX56/htdocs/cloud/console.php(49): require_once('/mnt/web120/e2/...')
#4 /mnt/web120/e2/56/510XXX56/htdocs/cloud/occ(11): require_once('/mnt/web120/e2/...')
#5 {main}

Dazu kommt, dass die PHP-Version nicht unbedingt zur Version passt, die für den Webspace eingestellt ist (in diesem Fall wäre es eigentlich PHP 7.3 gewesen).

Ein funktionierendes PHP-Binary findet man unter /opt/ in einem Versionsspezifischen Ordner:

/opt/RZphp73/bin/php-cli occ db:add-missing-indices
The current PHP memory limit is below the recommended value of 512MB.
Check indices of the share table.
Check indices of the filecache table.
Adding additional size index to the filecache table, this can take some time...
Filecache table updated successfully.
Check indices of the twofactor_providers table.
Check indices of the login_flow_v2 table.
Check indices of the whats_new table.
Check indices of the cards table.
Check indices of the cards_properties table.
Check indices of the calendarobjects_props table.
Check indices of the schedulingobjects table.
Check indices of the oc_properties table.

Damit funktionieren sowohl occ als auch updater.phar einwandfrei 🙂

Unprivilegierte Container in einer Multiuser Umgebung

In der Standardkonfiguration ist es einem Docker-User ein leichtes, sich über einen Container root-Rechte auf dem Hostsystem zu verschaffen.

Um das zu vermeiden gibt es zwei Möglichkeiten, rootless mode und userns-remap. Die erste Variante benötigt nicht einmal root-Rechte um Docker zu installieren, es wird alles im Homeverzeichnis des Users installiert. Das macht es zwar relativ einfach, aber leider ungeeignet für größere Umgebungen wo eine beliebige Anzahl von Usern, die idealerweise noch aus einem Verzeichnisdienst kommen, den Docker-Dienst nutzen können soll.

Unprivilegierte Container in einer Multiuser Umgebung weiterlesen

SCM-Manager Repositories von Usern finden

Ich brauchte eine Übersicht aller Repositories, bei denen eine Gruppe von Usern direkt oder indirekt (über Gruppen) als Owner eingetragen waren.

Die User holte ich mir mit Powershell aus dem Active Directory:

$users = Get-AdGroup Hauptgruppe | Get-AdGroupMember -Recursive | Get-AdUser -Properties memberof

Die Gruppen, in der die User Mitglieder waren holte ich mir auf ähnliche Weise:

$users.memberof | Sort | Unique | Foreach-Object { $_ -Replace 'CN=(.+?),.+','$1' }

Damit hatte ich eine simple Liste aller User und ihrer Gruppen die ich als Textdatei abspeichern konnte.

Für den SCM-Manager gibt es einen Command Line client. Leider ist er inzwischen nicht so einfach zu finden, auch die Doku dazu ist extrem dürftig. Aktuell war er hier zu finden.

Die Usernames und die Gruppennamen speicherte ich in zwei Textdateien, dann erstellte ich noch ein Template für die Ausgabe von scm-cli-client anzupassen. Als Templates wird hier FreeMarker verwendet.

#!/bin/bash
SERVER=https://scm.example.com/scm/
USERNAME=admin
PASSWORD=GEHEIM
CLI="java -jar /opt/scm-cli-client-1.60-jar-with-dependencies.jar --server $SERVER --user $USERNAME --password $PASSWORD"
# Nutzt FreeMarker Templates https://www.vogella.com/tutorials/FreeMarker/article.html
REPOS=`$CLI list-repositories --template-file ./grouptemplate.tpl`
GROUPNAMES=$(<groupnames.txt)
USERNAMES=$(<usernames.txt)
for GROUPNAME in "$GROUPNAMES"; do
echo "$REPOS" |grep "$GROUPNAME"
done;
for USERNAME in "$USERNAMES"; do
echo "$REPOS" |grep "$USERNAME"
done;

Das Template das ich dafür erstellt habe sieht folgendermaßen aus:

<#list repositories as repository>${repository.name}<#if repository.permissions??> <#list repository.permissions as permission><#if permission.type?starts_with("OWNER")>${permission.name} </#if></#list>
</#if>
</#list>

Damit wird schlicht und einfach der Name des Repositorys ausgegeben, gefolgt von allen Ownern. Das lässt sich einfach mittels grep filtern. Die Ausgabe davon habe ich dann noch gefiltert um jedes Repository nur einmal zu bekommen, für den Fall das jemand sowohl über eine Gruppe als auch über seinen Username Rechte hat

./findrepos.sh | sort | uniq

Voilá, alle Repositories in denen die User direkt oder indirekt Owner-Rechte haben.