The Wombelix Posthttps://dominik.wombacher.cc/2021-10-09T00:00:00+02:00Release: MoinMoin Wiki Container, powered by PyPy22021-10-09T00:00:00+02:002021-10-09T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-10-09:/posts/release-moinmoin-wiki-container-powered-by-pypy2.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Today I published the first version of <strong>moinmoin-pypy2-container</strong>,
a ready to use image to run MoinMoin Wiki, based on openSUSE Leap.</p>
<p>It contains some enhancements regarding the intial wiki setup ... <a class="read-more" href="/posts/release-moinmoin-wiki-container-powered-by-pypy2.html"> [read more]</a></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Today I published the first version of <strong>moinmoin-pypy2-container</strong>,
a ready to use image to run MoinMoin Wiki, based on openSUSE Leap.</p>
<p>It contains some enhancements regarding the intial wiki setup to make it
easier to get started and already ships with a pre-configured nginx.</p>
<p>Latest stable release of <a class="reference external" href="https://moinmo.in">MoinMoin</a>
was 8th November 2020 and requires Python 2, development of the successor
<a class="reference external" href="https://github.com/moinwiki/moin">moin2</a> is ongoing but wasn't released yet.</p>
<p><strong>moin2</strong> supports Python 3, but there is still a lot to do and the Project could use some
<a class="reference external" href="https://github.com/moinwiki/moin/issues?q=is%3Aopen+is%3Aissue+label%3A%22help+wanted%22">help</a>,
what about a <a class="reference external" href="https://github.com/moinwiki/moin/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">good first issue</a>?</p>
<p>It might be that User still want to keep using the latest stable
release and wait with the migration for a while.</p>
<p>Besides minor enhancements, the main goal of <strong>moinmoin-pypy2-container</strong>
is to provide a easy to use alternative to keep using MoinMoin.</p>
<p>The official Python 2 Runtime is <a class="reference external" href="https://www.python.org/doc/sunset-python-2/">End-of-Life</a>.
But PyPy will support Python 2 <a class="reference external" href="https://doc.pypy.org/en/latest/faq.html#how-long-will-pypy-support-python2">"forever"</a>
and still provide updates in future.</p>
<p>Please check the <strong>README</strong> in the below linked Source code Repository
for further details about the <em>features</em> and <em>usage</em>.</p>
<p>The repository is available on
<a class="reference external" href="https://codeberg.org/wombelix/moinmoin-pypy2-container">Codeberg</a> (Primary),
<a class="reference external" href="https://gitlab.com/wombelix/moinmoin-pypy2-container">Gitlab</a> (Mirror),
<a class="reference external" href="https://github.com/wombelix/moinmoin-pypy2-container">Github</a> (Mirror).</p>
<p>Pre-build Container Images can be downloaded from
<a class="reference external" href="https://quay.io/repository/wombelix/moinmoin-pypy2?tab=info">quay.io</a>.</p>
Installation des statischen Seiten generators Pelican inklusive Plugins via pipx2021-09-25T00:00:00+02:002021-09-25T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-09-25:/posts/installation-des-statischen-seiten-generators-pelican-inklusive-plugins-via-pipx.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Nach der Neuinstallation meines Notebooks musste ich eine Menge Dinge neu konfigurieren und war mit meinem frueheren Python venv Setup nicht zufrieden.</p>
<p>Ich habe mir pipx genauer angesehen und ich ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Nach der Neuinstallation meines Notebooks musste ich eine Menge Dinge neu konfigurieren und war mit meinem frueheren Python venv Setup nicht zufrieden.</p>
<p>Ich habe mir pipx genauer angesehen und ich denke, dass es viel einfacher zu benutzen ist.
Es kuemmert sich selbst um ein venv pro Paket, das ich installieren will, ich muss mich um nichts mehr selbst kuemmern.</p>
<p>Ich habe es ausprobiert und nachdem <a class="reference external" href="https://github.com/getpelican/pelican/issues/2554#issuecomment-485136726">cs01 in einem GitHub Issue</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20200920144105/https://github.com/getpelican/pelican/issues/2554">[1]</a>,
<a class="reference external" href="https://archive.today/2021.09.28-125020/https://github.com/getpelican/pelican/issues/2554">[2]</a>)
von der <cite>inject</cite> Funktion gesprochen hatte, war es kein Problem Pelican inklusive einiger Plugins mit <cite>pipx</cite> zu installieren:</p>
<pre class="code text literal-block">
pipx install pelican
pipx inject pelican pelican-pdf
pipx inject pelican markdown
pipx inject pelican pelican-read-more
</pre>
Public Money, Public Code - Kann ich nur zustimmen!2021-06-21T00:00:00+02:002021-06-21T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-06-21:/posts/public-money-public-code-kann-ich-nur-zustimmen.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Code als Teil von Entwicklungen für den oeffentlichen Sektor sollte Open Source sein.</p>
<p>Auf diese Weise waere so viel mehr moeglich, beispielsweise Steuereinsparungen, bessere Zusammenarbeit und Foerderung von Innovationen.</p>
<p>Zitat ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Code als Teil von Entwicklungen für den oeffentlichen Sektor sollte Open Source sein.</p>
<p>Auf diese Weise waere so viel mehr moeglich, beispielsweise Steuereinsparungen, bessere Zusammenarbeit und Foerderung von Innovationen.</p>
<p>Zitat von <a class="reference external" href="https://publiccode.eu/de/">https://publiccode.eu/de/</a>:</p>
<pre class="literal-block">
> Warum wird durch Steuergelder finanzierte Software nicht als Freie Software veröffentlicht?
> Von allen bezahlter Code sollte für alle verfügbar sein!
</pre>
<p>Zeig deine Unterstuetzung und unterzeichne den offenen Brief! <a class="reference external" href="https://publiccode.eu/de/openletter/">https://publiccode.eu/de/openletter/</a></p>
Sophos Anti-Virus fuer Linux - Versteckte On-Access Scanner Debug Option2021-05-12T00:00:00+02:002021-05-12T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-05-12:/posts/sophos-anti-virus-fuer-linux-versteckte-on-access-scanner-debug-option.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich musste lernen, dass es eine ziemliche Herausforderung sein kann, Performance Probleme im Zusammenhang mit Sophos Anti-Virus fuer Linux zu beheben oder Pfade mit hoher I/O-Last zu identifizieren, die ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich musste lernen, dass es eine ziemliche Herausforderung sein kann, Performance Probleme im Zusammenhang mit Sophos Anti-Virus fuer Linux zu beheben oder Pfade mit hoher I/O-Last zu identifizieren, die eine angepasste Policy oder Exclusion brauchen koennten.</p>
<p>In einer Situation, in der SAV Prozesse eine 100%ige Last auf einem oder mehreren CPU-Kernen erzeugen, stimmt aber definitiv etwas nicht und muss genauer untersucht werden.</p>
<p>Sophos bietet zwar viele Einstellungen, aber nur sehr begrenzte Debug Moeglichkeiten, zumindest wenn man dem offiziellen Handbuch und der Knowledge Base glaubt.</p>
<p>Es gibt allerdings einen versteckten und nicht oeffentlich dokumentierten Parameter zur Protokollierung aller On-Access Scanner Aktivitaeten. Das kann allerdings eine Menge Daten generieren und sollte daher nur eine begrenzte Zeit waehrend dem Troubleshooting aktiviert werden.</p>
<p>Aktivieren:</p>
<pre class="code text literal-block">
/opt/sophos-av/bin/savconfig set OnAccessRecordAllScans enable
systemctl restart sav-protect
</pre>
<p>Log Dateien werden nach <strong>/opt/sophos-av/tmp/</strong> geschrieben, du solltest <em>sav-protect</em> beenden und die Logs an einen anderen Ort kopieren, bevor du den Debug Modus deaktivierst.</p>
<p>Deaktivieren:</p>
<pre class="code text literal-block">
/opt/sophos-av/bin/savconfig set OnAccessRecordAllScans disable
systemctl restart sav-protect
</pre>
<p>Es waere um einiges einfacher, wenn Sophos so etwas in der eigenen Dokumentation behandeln wuerde.</p>
Rocky Linux ist auf dem Weg, 8.3 RC1 veroeffentlicht2021-05-02T00:00:00+02:002021-05-02T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-05-02:/posts/rocky-linux-ist-auf-dem-weg-83-rc1-veroeffentlicht.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Nur kurz: Rocky Linux, eine Art Nachfolger von CentOS - zumindest aus Sicht der Community - hat den RC1 der Version 8.3 veröffentlicht: <a class="reference external" href="https://rockylinux.org/news/rocky-linux-8-3-rc1-release/">https://rockylinux.org/news/rocky-linux-8-3-rc1-release/</a></p>
<p>Zitat von www ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Nur kurz: Rocky Linux, eine Art Nachfolger von CentOS - zumindest aus Sicht der Community - hat den RC1 der Version 8.3 veröffentlicht: <a class="reference external" href="https://rockylinux.org/news/rocky-linux-8-3-rc1-release/">https://rockylinux.org/news/rocky-linux-8-3-rc1-release/</a></p>
<p>Zitat von www.rockylinux.org:</p>
<pre class="literal-block">
> Rocky Linux is a community enterprise operating system designed to be
> 100% bug-for-bug compatible with America's top enterprise Linux
> distribution now that its downstream partner has shifted direction.
> It is under intensive development by the community.
> Rocky Linux is led by Gregory Kurtzer, founder of the CentOS project.
</pre>
<p>Ich hatte noch keine Gelegenheit, den release candidate zu installieren, aber ich verfolge die Entwicklung seit einiger Zeit und bin beeindruckt, wie die Rocky-Linux Community das gesamte Projekt und die Infrastruktur innerhalb weniger Monate aufgebaut hat.
Es fuehlt sich so an, als ob Rocky das neue CentOS sein wird, auch wenn es andere Enterprise Linux Klone / Derivate gibt, haben diese meist einen kommerziellen Hintergrund und sind nicht vollstaendig Community basiert.</p>
Wie ich mich vorbereitet und die Pruefung 1Z0-819 Java SE 11 Developer nicht bestanden habe2021-04-20T00:00:00+02:002021-04-20T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-04-20:/posts/wie-ich-mich-vorbereitet-und-die-pruefung-1z0-819-java-se-11-developer-nicht-bestanden-habe.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Gestern habe ich die Pruefung 1Z0-819 abgelegt und bin mit einem Ergebnis von 55% (68% zum bestehen erforderlich) durchgefallen, aber ich bin nicht traurig oder enttaeuscht, ich war einfach noch ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Gestern habe ich die Pruefung 1Z0-819 abgelegt und bin mit einem Ergebnis von 55% (68% zum bestehen erforderlich) durchgefallen, aber ich bin nicht traurig oder enttaeuscht, ich war einfach noch nicht bereit.</p>
<p>Ich habe waehrend meiner Vorbereitung viel gelernt und es war eine der schwierigsten Pruefungen, die ich je gemacht habe, also ist es keine grosse Sache, beim ersten Versuch nicht zu bestehen.</p>
<p>Aber warum habe ich es eigentlich versucht? Vor vielen Jahren habe ich einige Java Grundlagen gelernt, aber leider nie viel damit gearbeitet. Ausserdem ist meine IT Karriere nicht sehr stark auf Software-Entwicklung ausgerichtet, auch wenn mir das persoenlich am meisten Spass macht.</p>
<p>Einer meiner Kollegen erzaehlte mir von dem 25 Jahre Java Jubilaeumsangebot von Oracle, bei dem man für 25$ Zugang zu einem Java SE Developer OCP Online Training bekommen und an der Pruefung teilnehmen konnte. Ich wollte schon immer meine Java Kenntnisse verbessern, also dachte ich, das waere eine tolle Gelegenheit. Aber aufgrund des zeitlich begrenzten Angebots hatte ich nur etwa 4 Wochen Zeit, bevor ich die Pruefung ablegen musste.</p>
<p><em>Spoiler: Ein paar Wochen, selbst wenn man jeden Tag viele Stunden investiert, reichen nicht aus, um in Java von null auf hundert zu kommen und 1Z0-819 zu bestehen ;)</em></p>
<p>Das mitgelieferte Online Training von Oracle war nicht wirklich schlecht, aber auch nicht wirklich gut. Es gab einige Hands On Labs, aber der Guide wurde nicht mitgeliefert, so dass man sich nur die Loesungs-Videos anschauen konnte, nicht perfekt, aber um fair zu sein, es war mehr oder weniger kostenlos.</p>
<p>Ich habe mich in <a class="reference external" href="https://www.reddit.com/r/learnjava/">learnjava auf reddit</a> umgesehen und dort wurde u.a. <a class="reference external" href="https://java-programming.mooc.fi">https://java-programming.mooc.fi</a> erwaehnt, was eine sehr beliebte Platform zu sein scheint. Die Universitaet von Helsinki bietet zwei Java Kurse an, die meisten Inhalte in schriftlicher Form, mit einer angepassten NetBeans IDE Version, die das Test My Content Plugin beinhaltet.</p>
<p>Das Coole daran ist, dass du einfach einen mooc.fi-Account erstellst, die IDE herunterlaedst und dich einloggst. Danach kannst du die Uebungen durcharbeiten, sie lokal testen und zum Schluss hochladen. Wenn dein Code korrekt ist und alle Tests besteht, wird die Uebung im Online Kurs als abgeschlossen markiert.</p>
<p>Eigentlich war das eine meiner besten Lernerfahrungen ueberhaupt, denn man muss die Uebungen selbststaendig loesen, aber durch die integrierten Tests kann man immer ueberpruefen, ob man es richtig macht. Waehrend meiner Pruefungsvorbereitung war mooc.fi die hilfreichste Ressource.</p>
<p>Außerdem waren die Mock Exams, die von <a class="reference external" href="https://enthuware.com/java-certification-mock-exams/oracle-certified-professional/ocp-java-11-exam-1z0-819">enthuWare</a> angeobten werden ganz hilfreich und sehr guenstig. Und bevor du dich wunderst, es geht nicht um Braindumps, Mock Exams sind etwas anderes.</p>
<p>Waehrend der Pruefung musst du eine Menge Code lesen, interpretieren und dann die richtige(n) Antwort(en) waehlen. Du musst also die Themen vollstaendig verstehen und anwenden koennen um zu bestehen und nicht nur Fragen und Antworten auswendig lernen. Die Mock Exams koennen helfen, ein Gefuehl dafuer zu bekommen, wie der Ablauf und Stil der echten Pruefung sein wird.</p>
<p>Fuer mich war enthuWare eine gute Ergaenzung zu den anderen Ressourcen, ich hatte auch den Eindruck, dass es manchmal schwieriger war als die eigentliche Pruefung.</p>
<p>Wenn du lieber mit einem Buch lernst, dann wirf einen Blick auf <a class="reference external" href="https://www.selikoff.net/ocp11-complete/">Java OCP 11 Developer Complete Study Guide</a>, es ist immer noch fuer <a class="reference external" href="https://www.selikoff.net/ocp11-819">die 1Z0-819 Pruefung</a> geeignet. Ich habe es selbst nicht benutzt, aber viele Leute empfehlen es, also werde ich es beim naechsten Mal auch ausprobieren :)</p>
<p>Ich habe definitiv vor, es Ende diesen Jahres ein zweites Mal zu versuchen und insgesamt mehr Zeit mit der Programmierung in Java zu verbringen. Ich bin immer noch sehr daran interessiert, am <a class="reference external" href="https://github.com/uyuni-project/uyuni">Uyuni Projekt</a> mitzuarbeiten, ein grosser Teil der Codebasis ist Java, also koennte das auch Teil meiner Pruefungsvorbereitung sein.</p>
Pelican Plugin: read-more (weiterlesen)2021-04-05T00:00:00+02:002021-04-05T00:00:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2021-04-05:/posts/pelican-plugin-read-more-weiterlesen.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Das read-more Pelican Plugin war das zweite, bei dem ich geholfen habe, es auf die <a class="reference external" href="https://github.com/pelican-plugins">neue Struktur / GitHub Organisation</a> zu migrieren.</p>
<p>Es fuegt nach einer bestimmten Laenge einen <em>"read more ... </em></p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Das read-more Pelican Plugin war das zweite, bei dem ich geholfen habe, es auf die <a class="reference external" href="https://github.com/pelican-plugins">neue Struktur / GitHub Organisation</a> zu migrieren.</p>
<p>Es fuegt nach einer bestimmten Laenge einen <em>"read more"</em>, oder auch <em>"weiterlesen"</em>, Link in der Uebersicht ein, man kann es beispielsweise in diesem Blog in Aktion sehen.</p>
<p>Die Konfiguration ist sehr einfach, das Plugin bringt einige pelican.conf Parameter mit.</p>
<p>Es kann mit <code>python -m pip install pelican-read-more</code> installiert werden, der Source ist auf <a class="reference external" href="https://github.com/pelican-plugins/read-more">https://github.com/pelican-plugins/read-more</a> verfuegbar.</p>
Mein erster Beitrag zum Uyuni Projekt aka SUSE Manager2021-03-24T00:00:00+01:002021-03-24T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-03-24:/posts/mein-erster-beitrag-zum-uyuni-projekt-aka-suse-manager.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich nutze viel Open Source Software und habe immer von der Arbeit der Community profitiert.
Wann immer moeglich, versuche ich deshalb auch etwas beizutragen und zurueckzugeben.</p>
<p>Wie in anderen Beitraegen ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich nutze viel Open Source Software und habe immer von der Arbeit der Community profitiert.
Wann immer moeglich, versuche ich deshalb auch etwas beizutragen und zurueckzugeben.</p>
<p>Wie in anderen Beitraegen erwaehnt, verwende ich auf der Arbeit den SUSE Manager, das kommerzielle Produkt des Upstream
Open Source Projekts <a class="reference external" href="https://www.uyuni-project.org">Uyuni</a>, ein Fork von <a class="reference external" href="https://spacewalkproject.github.io">Spacewalk</a>,
den <a class="reference external" href="https://www.suse.com/c/were-back-to-earth-and-the-earth-is-flat-welcome-uyuni/">SUSE 2018</a> angekuendigt hat
(Archiv: <a class="reference external" href="https://web.archive.org/web/20200421061926/https://www.suse.com/c/were-back-to-earth-and-the-earth-is-flat-welcome-uyuni/">[1]</a>,
<a class="reference external" href="https://archive.today/2021.03.24-213548/https://www.suse.com/c/were-back-to-earth-and-the-earth-is-flat-welcome-uyuni/">[2]</a>).</p>
<p>Deshalb habe ich beschlossen, dass es an der Zeit ist, nach einem <a class="reference external" href="https://github.com/uyuni-project/uyuni/labels/good%20first%20issue">good-first-issue</a> zu suchen
und das Uyuni Projekt zu unterstuetzen. Ich bin noch dabei, meine Java Skills zu verbessern,
also dachte ich, dass einige Anpassungen am <a class="reference external" href="https://github.com/uyuni-project/uyuni/issues/1354">Setup Bash Script</a>
(Archiv: <a class="reference external" href="https://web.archive.org/web/20210324212349/https://github.com/uyuni-project/uyuni/issues/1354">[1]</a>,
<a class="reference external" href="https://archive.today/2021.03.24-212400/https://github.com/uyuni-project/uyuni/issues/1354">[2]</a>)
vielleicht das Richtige fuer den Anfang waeren.</p>
<p>Die Aufgabe war, den Produktnamen aus einer Standard Konfigurationsdatei auszulesen und diesen Wert,
anstelle der fest hinterlegten Bezeichnung <strong>SUSE Manager</strong>, bei sichtbaren Ausgaben zu verwenden.</p>
<p>Heute ist mein <a class="reference external" href="https://github.com/uyuni-project/uyuni/pull/3460">pull request</a>
(Archiv: <a class="reference external" href="https://web.archive.org/web/20210324212223/https://github.com/uyuni-project/uyuni/pull/3460">[1]</a>,
<a class="reference external" href="https://archive.today/2021.03.24-212223/https://github.com/uyuni-project/uyuni/pull/3460">[2]</a>)
angenommen und in den main branch uebernommen worden :)</p>
Pagure unter FreeBSD in Jail mit Bastille - Teil 12021-03-13T00:00:00+01:002021-03-13T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-03-13:/posts/pagure-unter-freebsd-in-jail-mit-bastille-teil1.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Vor ein paar Monaten habe ich angefangen mit <a class="reference external" href="https://www.freebsd.org">FreeBSD</a> und Jails, verwaltet
von <a class="reference external" href="https://www.bastillebsd.org">Bastille</a>, zu experimentieren.</p>
<p>Und ehrlich, ich liebe es, einfach, leichtgewichtig, es macht Spaß damit zu arbeiten, aber ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Vor ein paar Monaten habe ich angefangen mit <a class="reference external" href="https://www.freebsd.org">FreeBSD</a> und Jails, verwaltet
von <a class="reference external" href="https://www.bastillebsd.org">Bastille</a>, zu experimentieren.</p>
<p>Und ehrlich, ich liebe es, einfach, leichtgewichtig, es macht Spaß damit zu arbeiten, aber das ist eine
andere Geschichte fuer zukuenftige Posts ;)</p>
<p>Viel wichtiger ist, dass ich anfangen wollte, meine Git Repositories selbst zu hosten und <a class="reference external" href="https://www.github.com">Github</a>,
<a class="reference external" href="https://www.gitlab.com">Gitlab</a>, <a class="reference external" href="https://www.codeberg.org">Codeberg</a> und <a class="reference external" href="https://www.notabug.org">Notabug</a>
primär als Mirror zu verwenden. Das sollte die Sichtbarkeit im Vergleich zum reinen Self-Hosting verbessern und helfen,
potentielle Mitwirkende zu erreichen, unabhaengig von der Plattform.</p>
<p>Ich habe mich fuer <a class="reference external" href="https://pagure.io/pagure">Pagure</a> entschieden, es ist in Python geschrieben und scheint die
einzige Loesung zu sein, die Pull Requests von entfernten Repositories unterstuetzt.</p>
<p>Aber einfach nur die RPM Pakete auf einem unterstuetzten OS, wie openSUSE oder Fedora, zu installieren, waere zu einfach ;)</p>
<p>Dieses Projekt war daher der perfekte Kandidat, um noch etwas mehr Erfahrungen mit FreeBSD und Bastille zu sammeln.</p>
<p>Ich habe eine neues Jail erstellt, den Ports Tree von meinem FreeBSD Host gemountet und mich mit der neuen Instanz verbunden.</p>
<pre class="code text literal-block">
bastille create pagure 12.2-RELEASE 172.31.255.30 bastille0
bastille mount pagure /usr/ports /usr/ports nullfs rw 0 0
bastille console pagure
</pre>
<p>Basierend auf der <a class="reference external" href="https://docs.pagure.org/pagure/install.html">Pagure Dokumentation</a> und weiterer Recherche,
habe ich folgende Pakete installiert:</p>
<pre class="code text literal-block">
pkg install git libgit2 python3-3_3 apache24-2.4.46 py37-pip-20.2.3 py37-wheel-0.30.0_1 wget py37-pillow-7.0.0 py37-Flask-1.1.2 vim-tiny
</pre>
<p>Der libgit2 Port war zu alt und aufgrund einiger weiterer Abhaengigkeiten, war ein offizielles Update noch nicht verfuegbar,
so dass ich es selbst aktualisieren musste. Weitere Informationen: <a class="reference external" href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=252098">https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=252098</a></p>
<p><em>/usr/ports/devel/libgit2/Makefile.patch</em></p>
<pre class="code diff literal-block">
<span class="pygments-gd">--- Makefile.orig 2021-03-10 23:58:49.921923000 +0100</span><span class="pygments-w">
</span><span class="pygments-gi">+++ Makefile 2021-03-11 00:13:22.452236000 +0100</span><span class="pygments-w">
</span><span class="pygments-gu">@@ -6,7 +6,7 @@</span><span class="pygments-w">
</span># Tools/scripts/search_lib_depends_and_bump.sh devel/libgit2<span class="pygments-w">
</span>PORTNAME= libgit2<span class="pygments-w">
</span><span class="pygments-gd">-PORTVERSION= 1.0.1</span><span class="pygments-w">
</span><span class="pygments-gi">+PORTVERSION= 1.1.0</span><span class="pygments-w">
</span>CATEGORIES= devel<span class="pygments-w">
</span>MASTER_SITES= https://github.com/libgit2/libgit2/releases/download/v${PORTVERSION}/<span class="pygments-w">
</span><span class="pygments-gu">@@ -37,7 +37,7 @@</span><span class="pygments-w">
</span>.if ${SSL_DEFAULT} == base<span class="pygments-w">
</span>post-patch:<span class="pygments-w">
</span> @${REINPLACE_CMD} -e "/LIBGIT2_PC_REQUIRES.*openssl/ d" \<span class="pygments-w">
</span><span class="pygments-gd">- ${WRKSRC}/cmake/Modules/SelectHTTPSBackend.cmake</span><span class="pygments-w">
</span><span class="pygments-gi">+ ${WRKSRC}/cmake/SelectHTTPSBackend.cmake</span><span class="pygments-w">
</span>.endif<span class="pygments-w">
</span>do-test:<span class="pygments-w">
</span>
</pre>
<p>Patch applied, libgit2 compiled und installiert:</p>
<pre class="code text literal-block">
patch -u -b Makefile -i Makefile.patch
make makesum
make install clean
</pre>
<p>Pagure Release 5.13.2 erstellt und installiert</p>
<pre class="code text literal-block">
cd
mkdir src
cd src
git clone https://pagure.io/pagure.git
cd pagure
git checkout -b 5.13.2 e1a8b5e4a2a347ab29de7cc21d9d2c89f55dd076
python3 setup.py build
python3 setup.py install
</pre>
<p>Ich habe ein kleines hilfs Script geschrieben, um die erforderlichen Ordnerstrukturen
zu erstellen und die config Dateien an die richtige Stelle zu kopieren.</p>
<pre class="code text literal-block">
#!/bin/sh
mkdir -p /usr/local/etc/pagure
mkdir -p /usr/local/share/pagure
cp pagure/files/pagure.cfg.sample /usr/local/etc/pagure/pagure.cfg
cp pagure/files/alembic.ini /usr/local/etc/pagure/alembic.ini
cp pagure/files/pagure-apache-httpd.conf /usr/local/etc/apache24/Includes/pagure.conf
cp pagure/files/pagure.wsgi /usr/local/share/pagure/pagure.wsgi
cp pagure/createdb.py /usr/local/share/pagure/pagure_createdb.py
mkdir -p /usr/local/www/apache24/data/releases
chown git:git /usr/local/www/apache24/data/releases
mkdir -p /usr/local/git/repositories/{docs,forks,tickets,requests,remotes}
</pre>
<p>Dedizierten Git Benutzer und Gruppe erstellt, waere cool wenn das in einem Befehl gehen wuerde,
aber das <a class="reference external" href="https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=172965">wurde noch nicht implementiert</a></p>
<pre class="code text literal-block">
pw group add -n git
pw user add -n git -d /usr/local/git -c "Pagure Git User" -g git
</pre>
<p>Das ist alles, was ich bis jetzt habe, leider war nicht genug Zeit, um die Installation zu beenden.</p>
<p>Der naechste Schritt, basierend auf der Pagure Installationsanleitung, ist das Setzen von spezifischen ACLs,
aber die Syntax zwischen Linux und FreeBSD unterscheidet sich, ich muss erst noch herausfinden, wie es anzupassen ist.</p>
<p>Außerdem sind wahrscheinlich noch weitere Aenderungen erforderlich, bis Pagure wie erwartet funktioniert und
sich unter FreeBSD aehnlich verhaelt, wie auf einem Linux System.</p>
<p>Sobald ich etwas Zeit finde um weiterzumachen, werde ich Teil 2 veroeffentlichen.</p>
Praesentiere Stolz: Mein erster akzeptierter Pull Request fuer Pelican2021-03-03T00:00:00+01:002021-03-03T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-03-03:/posts/praesentiere-stolz-mein-erster-akzeptierter-pull-request-fuer-pelican.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Wie bereits in meinem Post <a class="reference external" href="https://dominik.wombacher.cc/posts/migration-von-wordpress-zu-pelican.html">Migration von Wordpress zu Pelican</a> erwaehnt
war fuer mich die Tatsache wichtig, dass Pelican in Python geschrieben ist und ein Plugin-System bietet. So kann ich ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Wie bereits in meinem Post <a class="reference external" href="https://dominik.wombacher.cc/posts/migration-von-wordpress-zu-pelican.html">Migration von Wordpress zu Pelican</a> erwaehnt
war fuer mich die Tatsache wichtig, dass Pelican in Python geschrieben ist und ein Plugin-System bietet. So kann ich den Code
anpassen und auch etwas an die <a class="reference external" href="https://www.getpelican.com">Pelican Community</a> zurueckgeben.</p>
<p>Das Projekt wechselt von seinem <a class="reference external" href="https://www.github.com/getpelican/pelican-plugins">monolithischen Plugin Repository</a> hin zu einem
separaten <a class="reference external" href="https://www.github.com/pelican-plugins/">Organisations Namespace</a> in dem jedes Plugin sein eigenes Repository hat und
in <a class="reference external" href="https://www.pypi.org">PyPI</a> veroeffentlicht wird.</p>
<p>Da ich den <a class="reference external" href="https://www.github.com/pelican-plugins/pdf">PDF Generator</a> verwenden wollte, dieser aber noch nicht migriert war,
habe ich mich entschlossen, <a class="reference external" href="https://github.com/getpelican/pelican-plugins/issues/1328">etwas beizutragen</a>
(Archiv: <a class="reference external" href="https://web.archive.org/web/20210303101921/https://github.com/getpelican/pelican-plugins/issues/1328">[1]</a>,
<a class="reference external" href="https://archive.today/2021.03.03-101922/https://github.com/getpelican/pelican-plugins/issues/1328">[2]</a>)
und bei der Aktualisierung sowie Migration dieses Plugins zu helfen.</p>
<p>Heute praesentiere ich mit Stolz: <a class="reference external" href="https://github.com/pelican-plugins/pdf/pull/1">Meinen ersten akzeptierten Pull Request für Pelican (PDF Plugin)</a>
(Archiv: <a class="reference external" href="https://web.archive.org/web/20210303100907/https://github.com/pelican-plugins/pdf/pull/1">[1]</a>,
<a class="reference external" href="https://archive.today/2021.03.03-100750/https://github.com/pelican-plugins/pdf/pull/1">[2]</a>)</p>
<p>Es gibt noch Spielraum fuer Verbesserungen und ich arbeite deshalb an weiteren Fixes und Features, aber es ist ein Anfang.</p>
<p>Am Ende jedes Artikels und jeder Seite findet sich ein PDF Download Link, die verlinkte PDF-Datei wurde von dem genannten Plugin generiert.</p>
SUSE Manager / Uyuni - Salt SSH Push: Thin Paket beschaedigt2021-03-02T00:00:00+01:002021-03-02T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-03-02:/posts/suse-manager-uyuni-salt-ssh-push-thin-paket-beschaedigt.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Bei der Arbeit hatten wir monatelang Probleme mit fast allen Salt-SSH / SSH-Push verbundenen Clients aufgrund einer unbehandelten Ausnahme <code>ImportError: Kein Modul namens 'salt.exceptions'</code>, die regelmaessig auftrat. Es hat mich ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Bei der Arbeit hatten wir monatelang Probleme mit fast allen Salt-SSH / SSH-Push verbundenen Clients aufgrund einer unbehandelten Ausnahme <code>ImportError: Kein Modul namens 'salt.exceptions'</code>, die regelmaessig auftrat. Es hat mich viel Zeit gekostet, das Problem zusammen mit SUSE zu finden, daher moechte ich meine Erfahrungen teilen.</p>
<div class="section" id="fehler">
<h2>Fehler</h2>
<pre class="code text literal-block">
[...]
"stderr": "Traceback (most recent call last):\n File
\"/var/tmp/.user_a567dc_salt/salt-call\", line 26, in \n from
salt.scripts import salt_call\n File
\"/var/tmp/.user_a567dc_salt/pyall/salt/scripts.py\", line 21, in \n
from salt.exceptions import SaltSystemExit, SaltClientError,
SaltReqTimeoutError\nImportError: No module named 'salt.exceptions'"
[...]
</pre>
</div>
<div class="section" id="hintergrund">
<h2>Hintergrund</h2>
<p>Normalerweise verwendet Salt einen Agenten (Salt-Minion), unterstuetzt aber auch einen agentenlosen Ansatz genannt Salt-SSH.
Ein Paket (<em>"thin.tgz"</em>), das den gesamten Python Code und alle Dateien enthaelt, die Salt benoetigt, um Jobs auf einem Server auszufuehren, wird hochgeladen und nach <strong>/var/tmp/.<user>_<id>_salt/</strong> auf dem Zielserver entpackt.
Die "<em>id</em>" bezieht sich auf die verwendete Salt-Version, der "<em>user</em>" ist derjenige, der auf dem Salt-Master - in diesem Fall der SUSE Manager - konfiguriert ist, der auf dem Ziel volle sudo Rechte hat und sich per SSH anmelden darf.</p>
<p>Jedes Mal, wenn Salt eine Verbindung herstellt, um einen Job auszufuehren, werden einige Pruefungen durchgefuehrt, um den Zustand des Thin Pakets zu ueberpruefen:</p>
<ul class="simple">
<li>Existiert der Ordner fuer den angegebenen Benutzer mit der passenden ID in <em>/var/tmp/</em></li>
<li>Ist die Datei <em>"code-checksum "</em> vorhanden und stimmt die darin enthaltene Pruefsumme mit dem thin.tgz Archiv auf dem Salt Master ueberein</li>
</ul>
<p>Solange beide Pruefungen erfolgreich sind, wird der Salt Master _keine_ neue <em>thin.tgz</em> hochladen - das ist wichtig zu verstehen.</p>
</div>
<div class="section" id="fehlersuche">
<h2>Fehlersuche</h2>
<p>Zunaechst war voellig unklar, woher das Problem kam, es konnte bei jedem Auftragstyp auftreten, auf verschiedenen Servern und zu unterschiedlichen Zeiten.
Das Thin Paket war immer ab irgendeinem Punkt beschaedigt, was die unbehandelte Ausnahme verursachte.
Der Workaround bestand darin, den gesamten Ordner des Salt Thin Pakets auf dem Zielserver manuell zu loeschen, damit der Salt Master beim naechsten Mal eine frische Kopie hochlaedt.</p>
<p>SUSE hat mir dabei geholfen, Unmengen von Protokollen durchzugehen und eine Zeitleiste zu erstellen, auf der zu erkennen war, dass das Problem scheinbar alle 7 Tage auftritt.</p>
<p>Weitere Untersuchungen bestaetigten, dass das Problem in diesem Fall leider selbst verursacht war. Jemand aus dem Team hat systemd so konfiguriert, dass der tmp Ordner auf vielen Servern automatisch aufgeraeumt wird und hat dies weder ausreichend getestet noch gut dokumentiert.
Das Entfernen des Thin Package Ordners waere an sich kein Problem, er wuerde einfach neu hochgeladen werden, solange es richtig gemacht wird, aber das war nicht der Fall.</p>
<pre class="code text literal-block">
/etc/tmpfiles.d/clean_tmp.conf
D /tmp 1777 root root 7d
D /var/tmp 1777 root root 7d
</pre>
<p>Die tmpfiles Konfiguration entfernte nur Dateien und Ordner, die dem Benutzer <em>root</em> gehoeren, aber ein paar Dateien, wie "<em>code-checksum</em>", des Thin Pakets gehoeren Salt.
So wurden alle 7 Tage die meisten Dateien entfernt und somit Salt thin beschaedigt, aber der Salt Master fand den Ordner und die "<em>code-checksum</em>" Datei mit dem richtigen Hash und dachte, Thin sei in Ordnung und auf dem aktuellen Stand.</p>
</div>
<div class="section" id="loesung">
<h2>Loesung</h2>
<p>Am Ende habe ich einfach die benutzerdefinierte tmpfiles Konfiguration und noch einmal den Thin Ordner manuell auf allen betroffenen Servern entfernt.</p>
<p>Fuer uns hatte es keinen wirklichen Nutzen, das Thin Paket woechentlich zu loeschen und hohe Last zu erzeugen sowie Bandbreite zu verbrauchen, um es erneut hochzuladen. Falls du die regelmaessige Bereinigung der tmp Ordner bevorzugst, stelle unbedingt sicher, dass der gesamte Thin Ordner und alle Dateien von deinem Regelwerk abgedeckt sind und entweder vollstaendig entfernt oder ignoriert werden.</p>
<p>Auch wenn es ein menschlicher Fehler war und nicht direkt mit SUSE Manager / Uyuni oder Salt zusammenhaengt, hat es doch gezeigt, wie anfaellig solche Komponenten sein koennen.
Aus technischer Sicht verstehe ich, warum es nur ein paar Ueberpruefungen und eine Validierung des Hashs in einer Datei gibt.
Das fuer den gesamten Ordnerinhalt bei jedem Job zu machen, waere einfach zu langsam und wuerde die Last unnoetig erhoehen.
Aber wie wir sehen, hat das im Zweifel auch seinen Preis und kann durch etwas beeintraechtigt werden, das man nicht erwartet.</p>
</div>
Migration von Wordpress zu Pelican2021-03-01T00:00:00+01:002021-03-01T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-03-01:/posts/migration-von-wordpress-zu-pelican.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Vor ein paar Jahren habe ich meine persoenliche Website auf Basis von Wordpress eingerichtet und war damit recht zufrieden.
Aber nach einiger Zeit war ich mir nicht mehr sicher, ob ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Vor ein paar Jahren habe ich meine persoenliche Website auf Basis von Wordpress eingerichtet und war damit recht zufrieden.
Aber nach einiger Zeit war ich mir nicht mehr sicher, ob das wirklich das ist, was ich will:</p>
<ul class="simple">
<li>Erstens musste ich mich alle paar Wochen um Updates kuemmern und hatte immer ein ungutes Gefuehl wegen moeglicher Sicherheitsprobleme.</li>
<li>Außerdem konnten die Inhalte, die ich hinzugefuegt hatte, nicht einfach in andere Formate konvertiert werden oder der Quellcode ohne Plugins geteilt werden.</li>
<li>Zu guter letzt, mussten einige Megabyte uebertragen werden, mehrere Cookies gesetzt und viel Javascript geladen werden, nur um einen kurzen Beitrag zu lesen.</li>
</ul>
<p>Ich fing an, mich umzusehen und fand den Ansatz gut, einen statischen Seitengenerator zu verwenden und mich auf reines HTML und CSS zu fokusieren.</p>
<p>Nach einigen Recherchen und Tests entschied ich mich fuer <a class="reference external" href="https://www.getpelican.com">Pelican</a>, es basiert auf Python und kann durch
durch <a class="reference external" href="https://github.com/pelican-plugins/">Plugins</a> erweitert werden.</p>
<p>Also machte ich mich an die Arbeit:</p>
<ul class="simple">
<li>Ein eigenes Theme zu erstellen</li>
<li>Mitzuhelfen, <a class="reference external" href="https://github.com/getpelican/pelican-themes">alte Plugins</a> zu aktualisieren und zu migrieren, die ich verwenden wollte</li>
<li>Inhalte, die auf verschiedene Orte verteilt sind, nach reStructuredText zu migrieren</li>
</ul>
<p>Ich bin noch nicht fertig, aber wie man sehen kann, gab es schon einige Fortschritte :)</p>
<p>Ich plane, mein Theme in Kuerze zu veroeffentlichen und auch mehr Zeit in die Mitarbeit am Pelican Projekt zu investieren.</p>
SUSE Manager / Uyuni - Gueltiger PTR Eintrag erforderlich fuer SSH-Push Clients2021-02-23T00:00:00+01:002021-02-23T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-02-23:/posts/suse-manager-uyuni-gueltiger-ptr-eintrag-erforderlich-fuer-ssh-push.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich bin fuer eine <a class="reference external" href="https://www.suse.com/products/suse-manager/">SUSE Manager</a> Installation, das kommerzielle
Produkt basierend auf <a class="reference external" href="https://www.uyuni-project.org">Uyuni</a>, mit beinahe 900 angebundenen Servern verantwortlich.</p>
<p>Die empfohlene Verbindungsmethode ist Salt Minion, aber SSH-Push - basierend auf Salt-SSH ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich bin fuer eine <a class="reference external" href="https://www.suse.com/products/suse-manager/">SUSE Manager</a> Installation, das kommerzielle
Produkt basierend auf <a class="reference external" href="https://www.uyuni-project.org">Uyuni</a>, mit beinahe 900 angebundenen Servern verantwortlich.</p>
<p>Die empfohlene Verbindungsmethode ist Salt Minion, aber SSH-Push - basierend auf Salt-SSH - ist die agentenlose Alternative.
In unserer Umgebung nutzen etwa 200 Server diese Variante, weil bereits ein Salt Minion installiert und mit einem anderen
Salt Master verbunden ist.</p>
<div class="section" id="problem">
<h2>Problem</h2>
<p>In den letzten Wochen kam es immer mal wieder vor, das der <strong>salt-api</strong> Dienst wegen einer unbehandelten Ausnahme abgestuerzt ist.</p>
<p>Die Untersuchung gemeinsam mit SUSE laeuft noch, aber bisher sieht es danach aus, das in seltenen faellen, ein Server mit Verbindungsmethode
SSH-Push und ohne gueltigen PTR DNS Eintrag tatsaechtlich eine Exception in der Salt Codebasis ausloesen kann.</p>
</div>
<div class="section" id="hintergrund">
<h2>Hintergrund</h2>
<p>Funktion <code>ip_to_host</code>, zu finden in <strong>/usr/lib/python3.6/site-packages/salt/utils/network.py</strong> uebergibt einen FQDN zur Python built-in Funktion
<code>socket.gethostbyaddr</code>. Das fuehrt zu einer Exception die von code:<cite>ip_to_host</cite> abgefangen wird und <code>None</code> zurueck gibt
(Es sollte eigentlich ein Hostname sein).</p>
<p>Basierend auf dem Rueckgabewert wird ein neuer Minion Job fuer den Server <code>None</code> gestartet und endet in einer <strong>unhandled Exception</strong> die dazu fuehrt
das <strong>salt-api</strong> abstuerzt, wie in nachfolgenden Fehlermeldungen zu sehen (<em>Salt</em> als auch <em>Taskomatic</em> muessen sich im Debug Modus befinden):</p>
<p><em>/var/log/salt/api_error</em></p>
<pre class="code text literal-block">
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/salt/netapi/rest_cherrypy/app.py", line 860, in hypermedia_handler
ret = cherrypy.serving.request._hypermedia_inner_handler(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/cherrypy/_cpdispatch.py", line 54, in __call__
return self.callable(*self.args, **self.kwargs)
File "/usr/lib/python3.6/site-packages/salt/netapi/rest_cherrypy/app.py", line 2140, in POST
'return': list(self.exec_lowstate()),
File "/usr/lib/python3.6/site-packages/salt/netapi/rest_cherrypy/app.py", line 1187, in exec_lowstate
ret = self.api.run(chunk)
File "/usr/lib/python3.6/site-packages/salt/netapi/__init__.py", line 152, in run
return l_fun(*f_call.get('args', ()), **f_call.get('kwargs', {}))
File "/usr/lib/python3.6/site-packages/salt/netapi/__init__.py", line 218, in ssh
return ssh_client.cmd_sync(kwargs)
File "/usr/lib/python3.6/site-packages/salt/client/ssh/client.py", line 159, in cmd_sync
**kwargs)
File "/usr/lib/python3.6/site-packages/salt/client/ssh/client.py", line 123, in cmd
for ret in ssh.run_iter(jid=kwargs.get('jid', None)):
File "/usr/lib/python3.6/site-packages/salt/client/ssh/__init__.py", line 696, in run_iter
self.cache_job(jid, host, ret[host], fun)
File "/usr/lib/python3.6/site-packages/salt/client/ssh/__init__.py", line 720, in cache_job
'fun': fun})
File "/usr/lib/python3.6/site-packages/salt/returners/local_cache.py", line 147, in returner
hn_dir = os.path.join(jid_dir, load['id'])
File "/usr/lib64/python3.6/posixpath.py", line 94, in join
genericpath._check_arg_types('join', a, *p)
File "/usr/lib64/python3.6/genericpath.py", line 149, in _check_arg_types
(funcname, s.__class__.__name__)) from None
TypeError: join() argument must be str or bytes, not 'NoneType'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/cherrypy/_cprequest.py", line 638, in respond
self._do_respond(path_info)
File "/usr/lib/python3.6/site-packages/cherrypy/_cprequest.py", line 697, in _do_respond
response.body = self.handler()
File "/usr/lib/python3.6/site-packages/cherrypy/lib/encoding.py", line 219, in __call__
self.body = self.oldhandler(*args, **kwargs)
File "/usr/lib/python3.6/site-packages/salt/netapi/rest_cherrypy/app.py", line 894, in hypermedia_handler
if cherrypy.config['debug']
File "/usr/lib64/python3.6/traceback.py", line 167, in format_exc
return "".join(format_exception(*sys.exc_info(), limit=limit, chain=chain))
File "/usr/lib64/python3.6/traceback.py", line 121, in format_exception
type(value), value, tb, limit=limit).format(chain=chain))
File "/usr/lib64/python3.6/traceback.py", line 498, in __init__
_seen=_seen)
File "/usr/lib64/python3.6/traceback.py", line 509, in __init__
capture_locals=capture_locals)
File "/usr/lib64/python3.6/traceback.py", line 338, in extract
if limit >= 0:
TypeError: '>=' not supported between instances of 'TypeError' and 'int'
</pre>
<p><em>/var/log/salt/api</em></p>
<pre class="code text literal-block">
[...]
2021-02-08 01:08:01,229 [salt.utils.network:239 ][DEBUG ][38989] salt.utils.network.ip_to_host('server.example.com') failed: [Errno 0] Resolver Error 0 (no error)
[...]
2021-02-08 01:08:02,801 [salt.loaded.int.returner.local_cache:252 ][DEBUG ][38989] Adding minions for job 20210208000802780236: [None]
[...]
2021-02-08 01:08:02,839 [salt.utils.process:767 ][ERROR ][5340] An un-handled exception from the multiprocessing process 'Process-1:335' was caught:
[...]
2021-02-08 01:08:02,916 [salt.client.ssh :644 ][ERROR ][38989] Target 'None' did not return any data, probably due to an error.
2021-02-08 01:08:02,917 [salt.loaded.int.netapi.rest_cherrypy.app:887 ][DEBUG ][38989] Error while processing request for: /run
</pre>
<p><em>/var/log/rhn/rhn_taskomatic_daemon.log</em></p>
<pre class="code text literal-block">
2021-02-08 01:08:02,976 [Thread-70313] ERROR com.redhat.rhn.taskomatic.task.SSHPush - com.suse.salt.netapi.
exception.SaltException: Response code: 500
java.lang.RuntimeException: com.suse.salt.netapi.exception.SaltException: Response code: 500
at com.suse.manager.webui.services.impl.SaltService.callSync(SaltService.java:235)
at com.suse.manager.webui.services.impl.SaltService.ping(SaltService.java:244)
at com.redhat.rhn.taskomatic.task.sshpush.SSHPushWorkerSalt.performCheckin(SSHPushWorkerSalt.java:337)
at com.redhat.rhn.taskomatic.task.sshpush.SSHPushWorkerSalt.lambda$run$0(SSHPushWorkerSalt.java:122)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at com.redhat.rhn.taskomatic.task.sshpush.SSHPushWorkerSalt.run(SSHPushWorkerSalt.java:110)
at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:732)
at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: com.suse.salt.netapi.exception.SaltException: Response code: 500
at com.suse.salt.netapi.client.impl.HttpAsyncClientImpl.createSaltException(HttpAsyncClientImpl.java:
145)
at com.suse.salt.netapi.client.impl.HttpAsyncClientImpl.access$000(HttpAsyncClientImpl.java:27)
at com.suse.salt.netapi.client.impl.HttpAsyncClientImpl$1.completed(HttpAsyncClientImpl.java:121)
at com.suse.salt.netapi.client.impl.HttpAsyncClientImpl$1.completed(HttpAsyncClientImpl.java:101)
at org.apache.http.concurrent.BasicFuture.completed(BasicFuture.java:123)
at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseCompleted
(DefaultClientExchangeHandlerImpl.java:181)
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.processResponse(HttpAsyncRequestExecutor.java:
442)
at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.inputReady(HttpAsyncRequestExecutor.java:332)
at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:
265)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:121)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run
(AbstractMultiworkerIOReactor.java:588)
... 1 more
</pre>
<p>Mit zwei Python basierenden befehlen, kann schnell geprueft werden, ob reverse lookup fuer einen FQDN funktioniert.
In diesem Beispiel nehmen wir an, das der FQDN <strong>server.example.com</strong> und die IP Adresse <strong>10.11.12.13</strong> ist:</p>
<pre class="code text literal-block">
python3 -c 'import socket; print(socket.gethostbyaddr("server.example.com"))'
python3 -c 'import socket; print(socket.getaddrinfo("server.example.com", 0, 0, 0, 0))'
</pre>
<p>Wenn alles in Ordnung ist sollten beide etwas vergleichbares ausgeben:</p>
<pre class="code text literal-block">
('server.example.com', [], ['10.11.12.13'])
[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('10.11.12.13', 0)),
(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('10.11.12.13', 0)),
(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_RAW: 3>, 0, '', ('10.11.12.13', 0))]
</pre>
<p>Weitere Lektuere zu <em>gethostbyaddr</em>: <a class="reference external" href="https://docs.python.org/3/library/socket.html#socket.gethostbyaddr">https://docs.python.org/3/library/socket.html#socket.gethostbyaddr</a></p>
</div>
<div class="section" id="loesung">
<h2>Loesung</h2>
<p>Ich gehe davon aus das SUSE einen Patch in zukuenftige SUSE Manager und Uyuni release einbinden wird, bei dem Server
wahrscheinlich uebersprungen werden, wenn es keinen gueltigen PTR Eintrag gibt. Daher sollte geprueft werden, das in
der Umgebung alle Systeme die per SSH-Push / Salt-SSH verbunden sind, die erforderlichen DNS Eintraege haben und ueber
den FQDN als auch die IP Adresse aufgeloest werden koennen, um etwaige Probleme zu vermeiden.</p>
</div>
AWX CleanUp Job aber Postgres Datenbank waechst weiter2021-02-22T22:43:00+01:002021-02-22T22:43:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-02-22:/posts/awx-cleanup-job-aber-postgres-datenbank-waechst-weiter.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich bin heute auf der Arbeit auf eine interessante Situation gestossen, die Festplatte auf der die Daten unserer <a class="reference external" href="https://github.com/ansible/awx">Ansible AWX</a> Instanz abgelegt sind ist vollgelaufen.
Die Postgres Datenbank, oder um ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich bin heute auf der Arbeit auf eine interessante Situation gestossen, die Festplatte auf der die Daten unserer <a class="reference external" href="https://github.com/ansible/awx">Ansible AWX</a> Instanz abgelegt sind ist vollgelaufen.
Die Postgres Datenbank, oder um sehr genau zu sein die Tabelle <strong>main_jobevent</strong>, war ungefaehr 16GB gross und wuchs weiter an.</p>
<p>Vor einiger Zeit sind die CleanUp Jobs aktiviert worden, es sieht so aus als wuerden Daten vor diesem Zeitpunkt uebersprungen und nicht entfernt werden.
Ich musste ausserdem lernen, das selbst wenn Daten geloescht wuerden, Postgres nicht automatisch den Speicherplatz freigibt wenn er einmal belegt war.</p>
<div class="section" id="entfernung-von-job-events">
<h2>Entfernung von Job Events</h2>
<p>Zuerst habe ich alte job events, die bei den geplanten AWX Cleanup's uebersprungen wurden, via <cite>awx-manage</cite> innerhalb des Docker Container <cite>awx_task</cite> entfernt:</p>
<pre class="code bash literal-block">
docker<span class="pygments-w"> </span><span class="pygments-nb">exec</span><span class="pygments-w"> </span>-it<span class="pygments-w"> </span>awx_task<span class="pygments-w"> </span>/bin/bash<span class="pygments-w">
</span>awx-manage<span class="pygments-w"> </span>shell_plus<span class="pygments-w">
</span>
</pre>
<p>Der Wert fuer <em>range</em> muss nach den eigenen Anforderungen angepasst werden, in meinem Fall wollte ich die job events <em>1</em> bis <em>2949</em> loeschen:</p>
<pre class="code python literal-block">
<span class="pygments-kn">from</span> <span class="pygments-nn">awx.main.models</span> <span class="pygments-kn">import</span> <span class="pygments-n">Job</span><span class="pygments-w">
</span><span class="pygments-k">for</span> <span class="pygments-n">record_id</span> <span class="pygments-ow">in</span> <span class="pygments-nb">range</span><span class="pygments-p">(</span><span class="pygments-mi">1</span><span class="pygments-p">,</span> <span class="pygments-mi">2949</span><span class="pygments-p">):</span><span class="pygments-w">
</span><span class="pygments-k">try</span><span class="pygments-p">:</span><span class="pygments-w">
</span> <span class="pygments-n">db_object</span> <span class="pygments-o">=</span> <span class="pygments-n">Job</span><span class="pygments-o">.</span><span class="pygments-n">objects</span><span class="pygments-o">.</span><span class="pygments-n">get</span><span class="pygments-p">(</span><span class="pygments-nb">id</span><span class="pygments-o">=</span><span class="pygments-n">record_id</span><span class="pygments-p">)</span><span class="pygments-w">
</span> <span class="pygments-n">db_object</span><span class="pygments-o">.</span><span class="pygments-n">delete</span><span class="pygments-p">()</span><span class="pygments-w">
</span><span class="pygments-k">except</span><span class="pygments-p">:</span><span class="pygments-w">
</span> <span class="pygments-k">pass</span><span class="pygments-w">
</span>
</pre>
<p>Source: <a class="reference external" href="https://tobschall.de/2019/05/07/ansible-tower-cleanup/">https://tobschall.de/2019/05/07/ansible-tower-cleanup/</a>
(Archive: <a class="reference external" href="http://web.archive.org/web/20210222141052/https://tobschall.de/2019/05/07/ansible-tower-cleanup/">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.22-212548/https://tobschall.de/2019/05/07/ansible-tower-cleanup/">[2]</a>)</p>
</div>
<div class="section" id="postgres-cleanup">
<h2>Postgres Cleanup</h2>
<p>Auch wenn es ein eher etwas <em>"gewaltsamer</em>" Ansatz war, in meinem Fall hat es ziemlich gut funktioniert, es sollte aber definitiv nicht die Standard Loesung sein.
Fuer die Zukunft erwarte ich eigentlich nicht das nochmal etwas vergleichbares erforderlich wird, nachdem noch <strong>auto-vacuum</strong> aktiviert und die <strong>AWX Cleanup Schedules</strong> angepasst wurden.</p>
<pre class="code bash literal-block">
docker<span class="pygments-w"> </span><span class="pygments-nb">exec</span><span class="pygments-w"> </span>-it<span class="pygments-w"> </span>awx_postgres<span class="pygments-w"> </span>/bin/bash<span class="pygments-w">
</span>psql<span class="pygments-w"> </span>-U<span class="pygments-w"> </span>awx<span class="pygments-w">
</span><span class="pygments-se">\c</span><span class="pygments-w"> </span>awx<span class="pygments-w">
</span>
</pre>
<p>Wie zu erkennen ist, konnte mit <strong>VACUUM FULL</strong> (<a class="reference external" href="https://www.postgresql.org/docs/10/sql-vacuum.html">mit Vorsicht behandeln!</a>) etwa 11GB Speicherplatz freigegeben werden:</p>
<pre class="code sql literal-block">
<span class="pygments-k">SELECT</span><span class="pygments-w"> </span><span class="pygments-n">pg_size_pretty</span><span class="pygments-p">(</span><span class="pygments-w"> </span><span class="pygments-n">pg_total_relation_size</span><span class="pygments-p">(</span><span class="pygments-s1">'public.main_jobevent'</span><span class="pygments-p">)</span><span class="pygments-w"> </span><span class="pygments-p">);</span><span class="pygments-w">
</span><span class="pygments-o">#</span><span class="pygments-w"> </span><span class="pygments-n">pg_size_pretty</span><span class="pygments-w">
</span><span class="pygments-o">#</span><span class="pygments-c1">----------------
</span><span class="pygments-o">#</span><span class="pygments-w"> </span><span class="pygments-mi">16</span><span class="pygments-w"> </span><span class="pygments-n">GB</span><span class="pygments-w">
</span><span class="pygments-o">#</span><span class="pygments-w"> </span><span class="pygments-p">(</span><span class="pygments-mi">1</span><span class="pygments-w"> </span><span class="pygments-k">row</span><span class="pygments-p">)</span><span class="pygments-w">
</span><span class="pygments-k">VACUUM</span><span class="pygments-w"> </span><span class="pygments-k">FULL</span><span class="pygments-w"> </span><span class="pygments-k">public</span><span class="pygments-p">.</span><span class="pygments-n">main_jobevent</span><span class="pygments-p">;</span><span class="pygments-w">
</span><span class="pygments-k">SELECT</span><span class="pygments-w"> </span><span class="pygments-n">pg_size_pretty</span><span class="pygments-p">(</span><span class="pygments-w"> </span><span class="pygments-n">pg_total_relation_size</span><span class="pygments-p">(</span><span class="pygments-s1">'public.main_jobevent'</span><span class="pygments-p">)</span><span class="pygments-w"> </span><span class="pygments-p">);</span><span class="pygments-w">
</span><span class="pygments-o">#</span><span class="pygments-w"> </span><span class="pygments-n">pg_size_pretty</span><span class="pygments-w">
</span><span class="pygments-o">#</span><span class="pygments-c1">----------------
</span><span class="pygments-o">#</span><span class="pygments-w"> </span><span class="pygments-mi">4915</span><span class="pygments-w"> </span><span class="pygments-n">MB</span><span class="pygments-w">
</span><span class="pygments-o">#</span><span class="pygments-w"> </span><span class="pygments-p">(</span><span class="pygments-mi">1</span><span class="pygments-w"> </span><span class="pygments-k">row</span><span class="pygments-p">)</span><span class="pygments-w">
</span>
</pre>
</div>
<div class="section" id="auto-vacuum-aktiviert">
<h2>auto-vacuum aktiviert</h2>
<p>Es scheint so das in der Konfiguration die mit dem AWX Container mitgeliefert wird, das Feature <strong>auto-vacuum</strong> in Postgres deaktiviert ist.
Das kann allerdings relativ schnell mit zwei kleinen Aenderungen in <strong>postgresql.conf</strong> aktiviert werden:</p>
<pre class="code ini literal-block">
<span class="pygments-na">track_counts</span><span class="pygments-w"> </span><span class="pygments-o">=</span><span class="pygments-w"> </span><span class="pygments-s">on</span><span class="pygments-w">
</span><span class="pygments-na">autovacuum</span><span class="pygments-w"> </span><span class="pygments-o">=</span><span class="pygments-w"> </span><span class="pygments-s">on</span><span class="pygments-w">
</span>
</pre>
<p>Damit die Aenderungen wirksam werden, muss die Postgres Datenbank neugestartet werden.
Alternativ kann natuerlich auch der AWX Stack via <cite>docker-compose</cite> einmal gestoppt und wieder gestartet werden.</p>
</div>
<div class="section" id="awx-job-schedules">
<h2>AWX Job Schedules</h2>
<p>Zu guter letzt, habe ich die Planung der AWX CleanUp Jobs angepasst, Sie werden jetzt taeglich ausgefuehrt und haben eine Vorhaltezeit von 14 Tagen.
Das reicht in unserer Umgebung aus und sollte helfen vergleichbare Probleme in Zukunft zu vermeiden.</p>
</div>
CentOS hat das Gebaeude verlassen2021-01-17T00:00:00+01:002021-01-17T00:00:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2021-01-17:/posts/centos-hat-das-gebaeude-verlassen.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Oder: CentOS ist tot, es lebe CentOS (Stream). Der ueberraschend wenig ueberraschende Schritt von RedHat, CentOS als Enterprise Linux Klon und indirekten Konkurrenten loszuwerden.</p>
<p>Ich muss zugeben, dass seit der ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Oder: CentOS ist tot, es lebe CentOS (Stream). Der ueberraschend wenig ueberraschende Schritt von RedHat, CentOS als Enterprise Linux Klon und indirekten Konkurrenten loszuwerden.</p>
<p>Ich muss zugeben, dass seit der <a class="reference external" href="https://lists.centos.org/pipermail/centos-announce/2020-December/048208.html">Ankuendigung</a>, CentOS 8, als Rebuild von Red Hat Enterprise Linux 8, Ende 2021 nicht mehr zu veroeffentlichen, schon einige Zeit vergangen ist, aber es fuehlt sich immer noch merkwuerdig an.</p>
<p>Open Source, aus kommerzieller Sicht, kann Fluch und Segen zugleich sein. Firmen muessen Geld verdienen, Entwickler muessen bezahlt werden, und ohne andere Firmen, die fuer den Support zahlen, waere es fuer Red Hat nicht moeglich, an Open Source Projekten zu arbeiten.</p>
<p>Als Red Hat vor ein paar Jahren CentOS uebernommen hat, war ich mir nicht sicher, wie lange es tatsaechlich halten wird, denn Red Hat hat noch mehr in einen kostenlosen RHEL Klon investiert als zuvor. Daher ist die Einstellung von CentOS 8, das auf RHEL 8 basiert, und die Verlagerung des CentOS Projekts hin zu RHEL Upstream verstaendlich.</p>
<p>Soweit ich es verstehe, ist Fedore eine Art Tech Spielplatz / Inkubator, um Dinge auszuprobieren, CentOS Stream wird Elemente von Fedora verwenden, aber mit einem staerkeren Fokus, ein Enterprise taugliches Produkt als Ergebnis zu haben.</p>
<p>Eigentlich ist nur die Tatsache, dass Red Hat das Versprechen gebrochen hat, Updates fuer CentOS 8 fuer 10 Jahre (bis 2029) zu veroeffentlichen, parallel zu RHEL 8, das Traurige an dieser Geschichte.</p>
<p>Dass sie die Auswichtung des CentOS Projekts aendern, ist hingegen sinnvoll und scheint ein logischer Schritt zu sein.</p>
ScummVM hat's gebracht!2020-04-03T15:43:00+02:002020-04-03T15:43:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2020-04-03:/posts/scummvm-hats-gebracht.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Nachdem ich mich vor einer Weile mit DOSBox beschaeftigt hatte, habe ich ScummVM ausprobiert und es haette eigentlich nicht einfacher sein koennen.
Ich habe Discworld II ausgewaehlt und nachdem hinzufuegen ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Nachdem ich mich vor einer Weile mit DOSBox beschaeftigt hatte, habe ich ScummVM ausprobiert und es haette eigentlich nicht einfacher sein koennen.
Ich habe Discworld II ausgewaehlt und nachdem hinzufuegen konnte ich es einfach direkt starten ohne irgendwas an den Einstellungen anzupassen, beeindruckend.</p>
<p>Ich bin mir ziemlich sicher das wird auch mit anderen alten Spielen aus meiner Sammlung funktionieren, wir werden sehen.</p>
Zugriff auf SMB Freigabe auf altem NAS von Linux aus2019-12-24T13:33:00+01:002019-12-24T13:33:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-12-24:/posts/zugriff-auf-smb-freigabe-auf-altem-nas-von-linux-aus.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Manchmal kann es herausfordernd sein alte Hardware zu verwenden.
In meinem Fall habe ich eine alte <em>Buffalo LinkStation LS-WTGL</em> NAS von 2008 gefunden.</p>
<p>Die Verbindung von einem aktuellen openSUSE System ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Manchmal kann es herausfordernd sein alte Hardware zu verwenden.
In meinem Fall habe ich eine alte <em>Buffalo LinkStation LS-WTGL</em> NAS von 2008 gefunden.</p>
<p>Die Verbindung von einem aktuellen openSUSE System schlug allerdings ueberraschenderweise fehl:</p>
<p><code>Unable to initialize messaging context. protocol negotiation failed: NT_STATUS_CONNECTION_DISCONNECTED</code></p>
<p>Aber warum und was ist das Problem? Auf meine <em>QNAP TS-253A</em> NAS konnte ich mich problemlos verbinden.
Ich habe verschiedene Parameter des smbclient cli tool ausprobiert, ohne Erfolg.</p>
<p>Nach einiger Zeit hat mich der Hinweis in einem <a class="reference external" href="https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077">Ask Fedora!</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20210225143935/https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077/4">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-143929/https://ask.fedoraproject.org/t/unable-to-mount-samba-share-on-fedora-31-which-fedora-30-windows-has-no-problem-with/4077/1">[2]</a>)
Thread von eeijlar auf die richtige Spur geschickt.
Der Workaround, auch in <a class="reference external" href="https://bugzilla.redhat.com/show_bug.cgi?id=1768117">Red Hat Bug 1768117</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20201111203350/https://bugzilla.redhat.com/show_bug.cgi?id=1768117">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-144057/https://bugzilla.redhat.com/show_bug.cgi?id=1768117">[2]</a>)
beschrieben, loeste das Problem und ich konnte den SMB Share meines alten Buffalo NAS einbinden.</p>
<p>eeijlar:</p>
<pre class="literal-block">
> Update /etc/samba/smb.conf with:
> [global]
> client min protocol = NT1
</pre>
<p>Aus sicherheitsgruenden, ist das Protokol SMB1 / NT1 inzwischen by default in Samba 4.11 und hoeher deaktiviert.
Allerdings unterstuetzen einige alte NAS Geraete nur dieses Protokoll.</p>
<p>Ich rate dringend es nur voruebergehend zu aktivieren um Dateien zu migrieren.</p>
Kein Sound in DOSBox unter Linux2019-12-06T18:53:00+01:002019-12-06T18:53:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-12-06:/posts/kein-sound-in-dosbox-unter-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich habe DOSBox installiert um mir die Zeit mit ein paar alten Spielen wie Discworld auf meinem Linux System (openSUSE Tumbleweed) zu vertreiben.
Aber ohne Sound Ausgabe, bis ich den ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich habe DOSBox installiert um mir die Zeit mit ein paar alten Spielen wie Discworld auf meinem Linux System (openSUSE Tumbleweed) zu vertreiben.
Aber ohne Sound Ausgabe, bis ich den korrekten MIDI Port herausgefunden und die dosbox config entsprechend angepasst hatte.</p>
<p>Aufgrund der Tatsache, das ich bereits erfolgreich Unreal Tournament von 1999 auf meinem Linux Notebook installiert habe, lag es auf der Hand das mit ein paar noch viel aelteren Speielen ebenfalls zu tun :D</p>
<p>Ich dachte wenn ich <cite>pmidi -l</cite> ausfuehre, wuerde mir der richtige MIDI Port angezeigt werden, aber zumindest in meinem Fall waren weitere Schritte notwendig.</p>
<p>Der Loesungsansatz der im <a class="reference external" href="https://askubuntu.com/questions/79944/dosbox-has-no-sound">AskUbuntu Forum</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20180102021001/https://askubuntu.com/questions/79944/dosbox-has-no-sound">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-232132/https://askubuntu.com/questions/79944/dosbox-has-no-sound">[2]</a>)
beschrieben ist, war dabei mein Favorit und hat letztlich funktioniert.</p>
<p>Man muss sich eine test MIDI File herunterladen - falls man wie ich keine hat, einen MIDI Server starten, die Datei abspielen und den angezeigten Port in die dosbox config eintragen.</p>
<pre class="code text literal-block">
zypper install timidity
zypper install pmidi
cd /tmp
wget http://www.angelfire.com/fl/herky/images/teddybear.mid
pmidi -l
# Port Client name Port name
# 14:0 Midi Through Midi Through Port-0
timidity -iA
# Requested buffer size 32768, fragment size 8192
# ALSA pcm 'default' set buffer size 32768, period size 8192 bytes
# TiMidity starting in ALSA server mode
# Opening sequencer port: 128:0 128:1 128:2 128:3
pmidi -p 128:0 teddybear.mid
</pre>
<p>In meinem Fall hat <cite>pmidi</cite> den Port <em>14:0</em> identifiziert aber basierend auf dem test mit <cite>timidity</cite>, ist <em>128:0</em> der richtige.</p>
<p>Dementsprechend habe ich den entsprechenden Parameter in meiner dosbox config angepasst:</p>
<pre class="code ini literal-block">
<span class="pygments-k">[midi]</span><span class="pygments-w">
</span><span class="pygments-na">midiconfig</span><span class="pygments-o">=</span><span class="pygments-s">128:0</span><span class="pygments-w">
</span>
</pre>
<p>Wenn man jetzt ein altes Spiel mit dosbox von der Konsole aus startet, sollte die Ausgabe etwa wie folgt aussehen und die schoensten MIDI Toene zu hoeren sein ;)</p>
<pre class="code text literal-block">
ALSA:Client initialised [128:0]
MIDI:Opened device:alsa
</pre>
<p>Ich werde in den naechsten Tagen ein wenig mit ScummVM experimentieren, ich bin sicher das bald weitere Posts ueber Linux Gaming folgen werden!</p>
Unreal Tournament (UT99) unter openSUSE Tumbleweed Linux2019-12-05T13:38:00+01:002021-02-26T21:52:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-12-05:/posts/unreal-tournament-ut99-unter-opensuse-tumbleweed-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Um ehrlich zu sein, ich habe jahrelang kein Unreal Tournament von 1999 gespielt, aber nachdem ich die Game CD gefunden habe, musste ich es einfach auf meinem Linux Notebook installieren ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Um ehrlich zu sein, ich habe jahrelang kein Unreal Tournament von 1999 gespielt, aber nachdem ich die Game CD gefunden habe, musste ich es einfach auf meinem Linux Notebook installieren und zocken :D</p>
<div class="section" id="tl-dr">
<h2>TL;DR</h2>
<p>Zusammenfassung der Installation von Unreal Tournament (Classic / 1999) unter openSUSE Tumbleweed Linux:</p>
<ol class="arabic simple">
<li><strong>games</strong> Repository hinzufuegen und Paket <strong>gtk</strong> installieren</li>
</ol>
<blockquote>
<ul class="simple">
<li>Entweder via YaST oder ueber das <a class="reference external" href="https://software.opensuse.org/package/gtk">openSUSE Software repository</a></li>
</ul>
</blockquote>
<pre class="code text literal-block">
zypper addrepo https://download.opensuse.org/repositories/games/openSUSE_Tumbleweed/games.repo
zypper refresh
zypper install gtk
</pre>
<ol class="arabic simple" start="2">
<li>Installation der fehlenden 32bit Bibliotheken</li>
</ol>
<pre class="code text literal-block">
zypper install libX11-6-32bit
zypper install libXext6-32bit
zypper install libglvnd-32bit
zypper install Mesa-libGL1-32bit
zypper install pulseaudio-utils-32bit
</pre>
<ol class="arabic simple" start="3">
<li>Herunterladen und ausfuehren des UT99 installer</li>
</ol>
<blockquote>
<ul class="simple">
<li>Update 26.02.2021: Die nachfolgend von wget benutzte Adresse - Ziel: <strong>liflg.org</strong> - funktioniert nicht mehr und leitet auf Github weiter, du kannst stattdessen <a class="reference external" href="https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run">archive.org #2</a> benutzen.</li>
</ul>
</blockquote>
<pre class="code text literal-block">
# wget https://liflg.org/?what=dl&catid=6&gameid=51&filename=unreal.tournament_436-multilanguage.run
wget https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run
chmod +x unreal.tournament_436-multilanguage.run
./unreal.tournament_436-multilanguage.run
</pre>
<ol class="arabic simple" start="4">
<li>Geniesse UT99</li>
</ol>
<pre class="code text literal-block">
padsp <InstallPath>/ut
</pre>
</div>
<div class="section" id="die-ganze-reise">
<h2>Die ganze Reise</h2>
<p>Ich besitze ein <a class="reference external" href="https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/10-14-inch/TUXEDO-InfinityBook-Pro-14-v5.tuxedo">TUXEDO InfinityBook Pro 14 v5</a>
(Archive: <a class="reference external" href="http://archive.today/2021.02.20-153838/https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/10-14-inch/TUXEDO-InfinityBook-Pro-14-v5.tuxedo">[1]</a>)
mit einem Intel UHD Graphics 620 Chip, worauf openSUSE Tumbleweed Linux laeuft, es sollte hoffentlich ausreichen um ein 20 Jahre altes Spiel zu spielen ;)</p>
<div class="section" id="linux-installer">
<h3>Linux Installer</h3>
<p>Der Install kann von <a class="reference external" href="https://liflg.org/?catid=6&amp;gameid=51">Linux Installers for Linux Games</a> heruntergeladen werden,
ich habe <code>unreal.tournament_436-multilanguage.run</code> und <code>unreal.tournament.official.bonus.pack.collection.run</code> ausgewaehlt - der andere verfuegbare ist fuer die <em>Game of the Year</em> (goty) Edition.</p>
<ul class="simple">
<li>Update 26.02.2021: Der obige link auf <strong>Linux Installers for Linux Games</strong> funktioniert nicht mehr und leitet auf Github weiter, du kannst stattdessen die folgenden Backup Links nutzen:<ul>
<li><strong>liflg.org</strong> Seite: <a class="reference external" href="https://web.archive.org/web/20181027111203/https://www.liflg.org/?catid=6&gameid=51">archive.org #1</a></li>
<li>UT99 Installer: <a class="reference external" href="https://web.archive.org/web/20180614001819if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament_436-multilanguage.run">archive.org #2</a></li>
<li>UT99 BonusPack: <a class="reference external" href="https://web.archive.org/web/20171203202118if_/https://liflg.reto-schneider.ch/files/final/unreal.tournament.official.bonus.pack.collection.run">archive.org #3</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="fehlerbehebung">
<h3>Fehlerbehebung</h3>
<p>GTK in Version 1 ist erforderlich fuer beide Installer, nach etwas Recherche habe ich es im <a class="reference external" href="https://software.opensuse.org/package/gtk">openSUSE Software repository</a> gefunden.</p>
<p>Nach der Installation des GTK Pakets und dem Einlegen der Spiel-CD in mein externes Laufwerk, habe ich einfach das Installationsprogramm gestartet, den Installationspfad angepasst und die Installation gestartet.</p>
<p>Scheint fast zu einfach zu sein!?</p>
<p>Yep, nachdem ich UT gestartet habe, erschien die Fehlermeldung: <code>libX11.so.6 is missing</code>
Scheint so das die 32bit Version standardmaessig nicht installiert ist, <code>zypper install libX11-6-32bit</code> hat geholfen.
Das selbe mit der naechsten fehlenden Bibliothek <strong>libXext.so.6</strong>, <code>zypper install libXext6-32bit</code>.</p>
<p>Gut, naechster Fehler:</p>
<pre class="code text literal-block">
Signal: SIGIOT [iot trap]
Aborting.
</pre>
<p>Werfen wir einen Blick in die log Datei: <code>cat ~/.loki/ut/System/UnrealTournament.log</code>:</p>
<pre class="code text literal-block">
Log: binding libGL.so.1
Critical: appError called:
Critical: Could not load OpenGL library
</pre>
<p>Ok, andere Art der Fehlermeldung, aber nach etwas Recherche zeigt sich, doch identisch zu weiter oben, es fehlt die <em>32bit</em> Version von <strong>libGL.so.1</strong>, denn natuerlich ist nur die <em>64bit</em> Variante standardmaessig installiert.
Und wieder hat <code>zypper install libglvnd-32bit</code> das Problem geloest.</p>
<p>Hmm aber trotzdem trat schon wieder der <strong>SIGIOT</strong> Fehler auf, schauen wir nochmal in die Log Datei:</p>
<pre class="code text literal-block">
Log: OpenGL
Critical: appError called:
Critical: Couldn't set video mode: Couldn't find matching GLX visual
</pre>
<p>Lektion gelernt, um ein 20 Jahre altes Spiel auf einer Bleeding-Edge Distribution im Jahr 2019 zum Laufen zu bringen, muss man einen Haufen 32bit-Bibliotheken installieren ;)
Dieses Mal hat <strong>Mesa-libGL1-32bit</strong> gefehlt und musste installiert werden.</p>
<p>Und siehe da, es startet, ohne Ton :O ... Ziemlich sicher fehlt wieder eine 32bit Library ...
Ich habe einige Hinweise zu <em>PulseAudio</em> im <a class="reference external" href="https://wiki.debian.org/Games/UT99">Debian Wiki</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20201112021136/https://wiki.debian.org/Games/UT99">[1]</a>,
<a class="reference external" href="http://archive.today/2017.11.01-215614/https://wiki.debian.org/Games/UT99">[2]</a>) gefunden.
Also habe ich <strong>pulseaudio-utils-32bit</strong> installiert, danach das Spiel mit <code>padsp ut</code> anstelle von nur <code>ut</code> gestartet und hatte Sound :D</p>
</div>
<div class="section" id="audio-probleme">
<h3>Audio Probleme</h3>
<p>Um die Verzoegerungen in der Audio Wiedergabe los zu werden, war es auch noch erforderlich eine Zeile in der Config Datei <code>~/.loki/ut/System/UnrealTournament.ini</code> anzupassen:</p>
<pre class="code text literal-block">
# Aendere das:
AudioDevice=ALAudio.ALAudioSubsystem
# In das:
AudioDevice=Audio.GenericAudioSubsystem
</pre>
</div>
<div class="section" id="online-spielen">
<h3>Online spielen</h3>
<p>Es sieht danach aus das viele Audio Sample Raten, die benoetigt werden um Online zu spielen, nicht vom <em>GenericAudioSubsystem</em> unterstuetzt werden.
Die Verbindung zu den meisten UT Servern schlaegt fehl und in der <strong>UnrealTournament.log</strong> Datei tauchen <strong>unsupported Rate</strong> Fehlermeldungen auf.</p>
<p>Der bisherige Workaround war es das <em>ALAudioSubsystem</em> zu nutzen, was aber zu Delays in der Audio Ausgabe fuehrt :(</p>
<p>Zusaetzlich verlangen viele oeffentliche Server einen installierten <strong>NPLoader</strong>.
Verschiedene Versionen koennen unter <a class="reference external" href="http://utgl.unrealadmin.org/NPLoader/">http://utgl.unrealadmin.org/NPLoader/</a> heruntergeladen werden.</p>
<p>Du musst entweder die <em>Linux.tar.gz</em> oder die <em>.dll</em>, <em>.so</em> sowie <em>.u</em> Datei herunterladen und in das <em>System</em> Verzeichnis deiner UT Installation kopieren.</p>
</div>
<div class="section" id="well-done">
<h3>Well done</h3>
<p>Selbst wenn ich etwas Zeit investieren musste um zu recherchieren, einige 32bit libraries zu installieren, configs anzupassen sowie diverse Fehler zu finden und zu beheben, es ist es wert!
Ich weiss die genauen FPS nicht, aber es sieht aus und fuehlt sich an wie vor 20 Jahren, ich liebe es!</p>
<p>Uebrigens, die Installation des Bonus Pack war auf Basis des <code>unreal.tournament.official.bonus.pack.collection.run</code> sehr einfach und selbsterklaerend.</p>
<p>Geniesse Unreal Tournament von 1999 auf deinem Linux System!</p>
</div>
</div>
seufz - Google kauft Fitbit2019-11-01T15:05:00+01:002019-11-01T15:05:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-11-01:/posts/seufz-google-kauft-fitbit.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Jon Erlichman hat auf <a class="reference external" href="https://twitter.com/JonErlichman/status/1190252267406069760">Twitter</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20191101133006/https://twitter.com/JonErlichman/status/1190252267406069760">[1]</a>,
<a class="reference external" href="http://archive.today/2019.11.01-131021/https://mobile.twitter.com/JonErlichman/status/1190252267406069760">[2]</a>)
gepostet, das Google vor hat Fitbit fuer $2.1 Milliarden zu kaufen.
Abgesehen vom Preis, hat Google es heute ebenfalls in deren ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Jon Erlichman hat auf <a class="reference external" href="https://twitter.com/JonErlichman/status/1190252267406069760">Twitter</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20191101133006/https://twitter.com/JonErlichman/status/1190252267406069760">[1]</a>,
<a class="reference external" href="http://archive.today/2019.11.01-131021/https://mobile.twitter.com/JonErlichman/status/1190252267406069760">[2]</a>)
gepostet, das Google vor hat Fitbit fuer $2.1 Milliarden zu kaufen.
Abgesehen vom Preis, hat Google es heute ebenfalls in deren <a class="reference external" href="https://blog.google/products/hardware/agreement-with-fitbit">Blog</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20191101132758/https://blog.google/products/hardware/agreement-with-fitbit">[1]</a>,
<a class="reference external" href="http://archive.today/2019.11.01-132954/https://blog.google/products/hardware/agreement-with-fitbit">[2]</a>) angekuendigt.</p>
<p>Wir werden sehen welche Auswirkungen die Uebernahme fuer Fitbit hat und ob Google einfach nur einen Mitbewerber im Wearables Markt loswerden wollte.</p>
<p>Eigentlich benutze ich gerne einen Fitness Tracker, aber beinaher bei jedem Produkt im Tausch gegen meine persoenlichen Daten, die ich mit einem US Unternehmen teilen muss.
Nennt mich paranoid, aber ich habe einfach kein gutes Gefuehl dabei, speziell wenn Google involviert ist.</p>
<p>Natuerlich, ich kann auch nicht sagen was genau Fitbit eigentlich mit meinen Daten macht, aber das Google diese fuer Tracking und Werbung nutzen wird ist ziemlich sicher.</p>
<p>Vielleicht ist es an der Zeit sich nach Alternativen umzusehen, aber gibt es ueberhaupt welche, die Wert auf Privatsphaere und Datenschutz legen?</p>
<p>Fitbit hat ebenfalls eine <a class="reference external" href="https://investor.fitbit.com/press/press-releases/press-release-details/2019/Fitbit-to-Be-Acquired-by-Google/default.aspx">Pressemitteilung</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20191101131324/https://investor.fitbit.com/press/press-releases/press-release-details/2019/Fitbit-to-Be-Acquired-by-Google/default.aspx">[1]</a>,
<a class="reference external" href="http://archive.today/2019.11.01-144949/https://investor.fitbit.com/press/press-releases/press-release-details/2019/Fitbit-to-Be-Acquired-by-Google/default.aspx">[2]</a>)
veroeffentlicht, inklusive einem Statement bezueglich der Nutzung persoenlicher Daten.</p>
<p>Zitat:</p>
<pre class="literal-block">
> [...] The company never sells personal information, and Fitbit health and wellness data will not be used for Google ads [...]
</pre>
PDF Dateien zusammenfuehren unter Linux2019-10-28T15:38:00+01:002019-10-28T15:38:00+01:00Dominik Wombachertag:dominik.wombacher.cc,2019-10-28:/posts/pdf-dateien-zusammenfuehren-unter-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich musste mit Cups-PDF einen Haufen Seiten als einzelne PDF Dateien "ausdrucken", da es nicht moeglich war Sie als PDF herunterzuladen.
Aber wie fuehrt man Tonnen an PDF Dokumenten die ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich musste mit Cups-PDF einen Haufen Seiten als einzelne PDF Dateien "ausdrucken", da es nicht moeglich war Sie als PDF herunterzuladen.
Aber wie fuehrt man Tonnen an PDF Dokumenten die <strong>Pagetitle-job_id<Number></strong> heissen unter Linux per command line moeglichst schnell und einfach zusammen?</p>
<p>Nach einigen Tests, <code>pdfunite</code> - inkludiert in <em>Poppler</em> und bereits unter openSUSE Tumbleweed vorinstalliert - hat die Aufgabe erledigt,
aber die Ergebnisse mit <code>pdftk</code> - inkludiert in <em>Ghostscript</em> - war beinahe identisch und hat auf die gleiche Art funktioniert.</p>
<pre class="code text literal-block">
pdfunite $(ls -cr *.pdf) output.pdf
</pre>
<p>Mit <code>$()</code>, <code>ls</code> wird ausgefuehrt und die Ergebnisse an den Befehl <code>pdfunite</code> angehangen.</p>
<p>Alle PDF Dateien im gleichen Ordner werden zusammengefuehrt zu einer einzelnen <strong>output.pdf</strong> Datei.</p>
<p>Der Parameter <code>-cr</code> sortiert nach dem Erstelldatum in umgedrehter Reihenfolge.</p>
<p>Das war in meinem Fall erforderlich, weil die Job IDs von 36 bis 223 gingen, alle anderen Parameter haben die Reihenfolge durcheinander gebracht und das Resultat war nicht wie erwartet.</p>
Apple AirPods unter Linux?2019-10-26T12:55:00+02:002019-10-26T12:55:00+02:00Dominik Wombachertag:dominik.wombacher.cc,2019-10-26:/posts/apple-airpods-unter-linux.html<!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich habe mich gefragt ob meine Apple AirPods unter openSUSE Linux funktionieren wuerden.
Einfach den Pairing Mode einschalten, auf verbinden klicken und es laeuft?
Nicht ganz, mit den Standard Einstellungen ... </p><!-- SPDX-FileCopyrightText: 2023 Dominik Wombacher <dominik@wombacher.cc> -->
<!-- -->
<!-- SPDX-License-Identifier: CC-BY-SA-4.0 -->
<p>Ich habe mich gefragt ob meine Apple AirPods unter openSUSE Linux funktionieren wuerden.
Einfach den Pairing Mode einschalten, auf verbinden klicken und es laeuft?
Nicht ganz, mit den Standard Einstellungen ist es fehlgeschlagen und es waren ein paar Anpassungen notwendig.</p>
<ol class="arabic simple">
<li>Setze <code>ControllerMode = dual</code> in der config Datei <strong>/etc/bluetooth/main.conf</strong></li>
</ol>
<ul class="simple">
<li>Unter openSUSE Tumbleweed (Patch Level 10/2019) existiert die config datei scheinbar nicht standardmaessig.
Ich habe das Beispiel aus dem bluez Paket aus dem Ordner <strong>/usr/share/doc/packages/bluez/</strong> kopiert.</li>
</ul>
<pre class="code text literal-block">
sudo cp /usr/share/doc/packages/bluez/main.conf /etc/bluetooth/main.conf
sudo vim /etc/bluetooth/main.conf
# Restricts all controllers to the specified transport. Default value
# is "dual", i.e. both BR/EDR and LE enabled (when supported by the HW).
# Possible values: "dual", "bredr", "le"
ControllerMode = dual
sudo systemctl restart bluetooth
</pre>
<p>(2) Fuege den Parameter <code>--noplugin=avrcp</code> am Ende von <code>ExecStart</code> in <strong>bluetooth.service</strong> ein,
andernfalls werden die AirPods nur mit sehr schlechter Qualitaet und sehr geringer Lautstaerke funktionieren.</p>
<ul class="simple">
<li>Quelle: <a class="reference external" href="https://wiki.archlinux.org/index.php/Bluetooth_headset#Apple_Airpods_have_low_volume">https://wiki.archlinux.org/index.php/Bluetooth_headset#Apple_Airpods_have_low_volume</a>
(Archive: <a class="reference external" href="https://web.archive.org/web/20190908054157/https://wiki.archlinux.org/index.php/Bluetooth_headset">[1]</a>,
<a class="reference external" href="http://archive.today/2021.02.25-235417/https://wiki.archlinux.org/index.php/Bluetooth_headset%23Apple_Airpods_have_low_volume">[2]</a>)</li>
</ul>
<pre class="code text literal-block">
sudo systemctl edit --full bluetooth.service
[...]
ExecStart=/usr/lib/bluetooth/bluetoothd --noplugin=avrcp
[...]
sudo systemctl restart bluetooth
</pre>
<p>Nach diese kleinen Anpassungen funktionieren Sie eigentlich schon ziemlich gut als Headset.
Das Mikrofon funktioniert noch nicht, vielleicht schaue ich mir das spaeter noch an.</p>