Solr Authentication

Aus der beliebten Serie „ein paar unsortierte Notizen mit Computerkram für mich selbst“ hier wie man in Solr 8.1 die Authentifizierung einschaltet (und anschließend aus Python heraus mir urllib abfragt). Quellen sind die Doku von Solr und die Doku von urllib.

Standardmäßig ist es bei Solr so, dass ohne jede Authentifizierung über die Admin-Oberfläche alles gemacht werden kann, insbesondere auch Dokumente aus dem Korpus löschen und so weiter! Die hier beschriebene Basic Authentication ist wenigstens ein Minimum an Zugriffsschutz, aber nach heutigen Maßstäben ist es nicht so sicher, jedenfalls nicht wenn man es nicht mit HTTPS kombiniert. Es ist empfehlenswert, zusätzlich dafür zu sorgen, dass der Solr-Server nicht aus dem Internet erreichbar ist.

Ins Verzeichnis solr-8.10.1/server/solr kommt in die Datei security.json folgender Inhalt:

{
"authentication":{ 
   "blockUnknown": true, 
   "class":"solr.BasicAuthPlugin",
   "credentials":{"solr":"IV0EHq1OnNrj6gvRCwvFwTrZ1+z1oBbnQdiVC3otuq0= Ndd7LKvVBAaZIF0QAVi1ekCfAJXr1GGfLtRUXhgrF8c="}, 
   "realm":"My Solr users", 
   "forwardCredentials": false 
},
"authorization":{
   "class":"solr.RuleBasedAuthorizationPlugin",
   "permissions":[{"name":"security-edit",
      "role":"admin"}], 
   "user-role":{"solr":"admin"} 
}}

Was bei credentials hinter dem Usernamen steht ist nicht so gut dokumentiert, offenbar wird erwartet, dass man das solr-Skript mit dem Kommando auth benutzt. Das nölt aber immer rum, wenn man nicht den ZooKeeper sondern eine Standalone-Installation verwendet. In der Beispieldatei ist das Passwort „SolrRocks“, der abgelegte String ist im Prinzip ein salted sha256, aber die Methode, wie das zustande kommt, ist etwas dubios. Auf github habe ich ein Skript gefunden, mit dem man den credentials-String erzeugen kann. Evtl. sind dafür noch Packages nachzuinstallieren, z.B. pwgen. Der Salt wird automatisch erzeugt und muss nicht angegeben werden.

#!/bin/bash
PW=$1
SALT=$(pwgen 48 -1)
echo "hash    : $(echo -n "$SALT$PW" | sha256sum -b | xxd -r -p | sha256sum -b | xxd -r -p | base64 -w 1024) $(echo -n "$SALT" | base64 -w1024)"

Mehrere credentials bestehend aus Usernamen und salted hashs können JSON-mäßig mit Komma hintereinander gehängt werden.

Und hier noch wie man in Python bei urllib die HTTP-Authentication benutzt:

    # Create an OpenerDirector with support for Basic HTTP Authentication...
    auth_handler = urllib.request.HTTPBasicAuthHandler()
    auth_handler.add_password(realm='My Solr users',
                              uri='http://localhost:8983/',
                          user='solr',
                          passwd='SolrRocks')
    opener = urllib.request.build_opener(auth_handler)
    # ...and install it globally so it can be used with urlopen.
    urllib.request.install_opener(opener)

Das Passwort steht dann halt im Klartext da drin. Das billige Authentication-Modul von Solr wird sicherheitsmäßig eh nicht für jeden Bedarf ausreichen und sollte für den Produktivbetrieb jedenfalls nicht als einzige Zugriffsbeschränkung benutzt werden.

Um mit dem Solr-Skript von der Kommandozeile Dinge zu erledigen (z.B. einen neuen Core anlegen) müssen bei eingeschalteter Basic Authentication noch folgende Variablen gesetzt werden (wie bei allem gilt, den Usernamen und das Passwort durch die eigenen zu ersetzen). Folgendes ist in die bin/solr/solr.in.sh einzusetzen bzw. die im Beispiel schon vorhandenen entsprechenden Zeilen auszukommentieren:

SOLR_AUTH_TYPE=basic
SOLR_AUTHENTICATION_OPTS="-Dbasicauth=solr:SolrRocks"

Carry a Laser!

Neulich wurde ich darauf aufmerksam gemacht, dass in dem bekannten Song „Kyrie“ von Mr. Mister der Text „Kyrie Eleison“ klingt wie „Carry a laser“. Aber das ist doch nur ein typischer Fall von einem falsch gehörten Text, so wie „Gopher Tuna“ und viele andere, oder? ODER??

Die verborgene Bedeutung

Tatsächlich ist der Liedtext nicht weniger sinnvoll, wenn man überall „Kyrie Eleison“ (Herr, erbarme Dich!) durch „Carry a laser“ (Trag einen Laser) ersetzt.

Beginnen wir mit dem Refrain:

(Kyrie Eleison / Carry a laser) down the road that I must travel

(Kyrie Eleison / Carry a laser) through the darkness of the night

(Kyrie Eleison / Carry a laser) where I’m going, will you follow?

(Kyrie Eleison / Carry a laser) on a highway in the night

Betrachtet man das Lied als ein Gebet, so bittet also der Sänger darum, der Herr möge sich ihm auf seinem Weg erbarmen. Aber müsste es in der zweiten Zeile dann nicht eher „in the darkness“ heißen? Der Herr soll sich seiner auch in der Dunkelheit, nicht durch die Dunkelheit, erbarmen. Das Licht eines Lasers dagegen leuchtet in der Tat durch die Dunkelheit. Auch die dritte Zeile ergibt mit Laser mehr Sinn. Der Sänger trägt also einen Laser mit sich, wohin er auch geht.

Weiterhin wäre es zumindest im Katholizismus üblich, nicht nur das Erbarmen des Herrn, sondern auch die Hilfe der Heiligen zu erbitten, ginge es hier wirklich um einen Segen für eine Reise. Der Schutzheilige der Reisenden, St. Christopherus, wird jedoch nicht erwähnt.

Ein Edelstein

Einen echten Hinweis auf einen Laser liefert die folgende Liedzeile:

My body burns a gem-like flame

Der erste Laser aus dem Jahr 1960 basierte auf einem Rubin, also einem Edelstein (gem), als aktivem Medium. Mit „gem-like flame“ ist also das Innere eines Festkörperlasers gemeint.

Die Seele der Musik

Die selbe Strophe, die auf den Rubinlaser anspielt, liefert auch einen Hinweis darauf, dass nicht irgendein Laser, sondern der Laser eines CD-Spielers gemeint ist.

My heart is old, it holds my memories

My body burns a gem-like flame

Somewhere between the soul and soft machine

Is where I find myself again

Mit den „memories“ sind hier die auf der CD gespeicherten Daten gemeint. Die beiden letzten Zeilen beschreiben den Prozess der Digital-Analog-Wandlung als Zusammenspiel von Hard- und Software ( „soft machine“ ). Als Ergebnis findet sich in den Daten die Musik und somit der Sänger selbst wieder ( „I find myself again“ ).

Der historische Kontext

Der Song wurde im Jahr 1985 als Single und auf dem Album „Welcome To The Real World“ veröffentlicht. Die CD wurde kommerziell 1982 eingeführt. Der erste tragbare CD-Player, der Sony D-50/D5 Discman, erschien aber erst 1984, ebenso wie das erste CD-Autoradio Pioneer CDX-1.

Zum Zeitpunkt der Veröffentlichung war es also erstmals für jedermann möglich, tatsächlich einen Laser auf Reisen mitzunehmen und auf dem Highway im Auto Musik von CD zu genießen.

Fazit

Zusammenfassend kann man sagen, dass einiges dafür spricht, dass es tatsächlich „Carry a laser“ heißen sollte und damit der Laser eines tragbaren CD-Players gemeint ist, da es zahlreiche mehr oder weniger offene Hinweise gibt, nämlich

  • die fast nicht verklausulierte Erwähnung eines Rubinlasers,
  • in der selben Strophe eine technische Beschreibung des CD-Abspielvorgangs,
  • das Erscheinen des Lieds direkt nach der Markteinführung des ersten CD-Autoradios und des ersten Discman™ sowie
  • die Nicht-Erwähnung des heiligen Christopherus.

Und schließlich: Was ist wahrscheinlicher? Dass eine Rockband, bei der es sich nicht um einen Kirchenchor handelt, ein Gebet vertont, oder doch eher, dass sie ihre Tonträger bewirbt?

Wilhelm von Ockham würde mir ganz sicher zustimmen.

Netflix auf dem Raspberry Pi – Update 2022

Für das Media-Center Kodi gibt es nach wie vor ein inoffizielles Netflix-Plugin. Inzwischen ist Kodi 19 aktuell, daher ist mal wieder ein Update der Anleitung erforderlich. Auf dem Raspberry Pi läuft LibreELEC als speziell angepasste Distribution für Kodi. Mit dem Raspberry Pi Imager kann man sich eine SD-Karte dafür erstellen. Wenn in der Auswahl die passende LibreELEC-Version nicht auftaucht, weil man gerade keinen Raspi 4 zur Hand hat, kann man sich direkt von der LibreELEC-Webseite eine Version für den Raspi 2 oder 3 runterladen.

Das Netflix-Plugin liegt im inoffiziellen Kodi-Plugin-Repository von CastagnaIT. Auf dieser Github-Seite ist u.a. ein ZIP, mit dem sich das Repo in Kodi nachinstallieren lässt und aus diesem Repo dann das Netflix-Plugin.

Benötigte Dependencies (InputStream, Widevine…) werden spätestens dann nachinstalliert, wenn man versucht einen Film zu schauen.

Es versteht sich von selbst, dass ein gültiges Netflix-Login Voraussetzung ist.

FXGL11 Level laden

Anscheinend hat sich bei FXGL11 gegenüber den teilweise schon etwas älteren Tutorials was geändert. Das ist eine Sache.

Eine andere, die mich grad in den Wahnsinn getrieben hat, war, dass das Laden eines mit Tiled erstellten Levels schon schief ging, weil das eigentlich vorgesehene, simple

    FXGL.setLevelFromMap("level0.tmx");

die Datei offenbar am falschen Ort gesucht hat. Nach ewigem Rumprobieren mit der Verzeichnisstruktur gab es Abhilfe letztlich nur mit dem etwas umständlicheren:

protected void initGame() {
    FXGL.getGameWorld().addEntityFactory(
        new PlanetExpressFactory());
    TMXLevelLoader tl = new TMXLevelLoader();
    FXGL.getGameWorld()
        .setLevel(tl.load(
        this.getClass().getResource("/assets/levels/level0.tmx"),
        FXGL.getGameWorld()));
}

JavaFX Mac-App erstellen mit Eclipse und Maven

… mit OpenJDK und JavaFX in der Version 14.

JavaFX braucht nicht extra installiert werden, wenn man ein neues Maven-Projekt über den Archetyp org.openjfx aus Maven Central erstellt. Um die Dependencies kümmert sich Maven.

In der pom.xml den Pfad zum jlinkExecutable einstellen sowie einen Launcher festlegen:

<plugin>
  <groupId>org.openjfx</groupId>
  <artifactId>javafx-maven-plugin</artifactId>
  <version>0.0.4</version>
  <configuration>
    <mainClass>package.App</mainClass>
    <jlinkExecutable>/Pfad/zu/jlink</jlinkExecutable>
    <launcher>MeinLauncherSkript</launcher>
  </configuration>
</plugin>

Dann aus Eclipse die pom ausführen als Maven build… und bei Goals javafx:jlink einstellen.

Es wird im target-Verzeichnis ein Verzeichnis image erzeugt, dass u.a. die angepasste Java Runtime sowie ein Launcher-Skript enthält. Vom Terminal aus kann das Launcher-Skript jetzt schon gestartet werden.

Um ein schönes .app-Bundle zu erzeugen, im Terminal ins target-Verzeichnis wechseln und dann:

jpackage --type app-image -i image -n MeineApp -m mein.modul/mein.package.Mainclass --runtime-image image/

Wenn jpackage nicht gefunden wird, muss der Pfad noch händisch gesetzt werden. jpackage liegt ganz normal im bin-Verzeichnis des JDK.

Natürlich sind jeweils die richtigen Namen für die Module, Packages und Klassen einzusetzen. Es kommt dann eine schöne Mac-Application raus, die sich durch Doppelklick starten lässt. (Ich bin mir nicht sicher, ob XCode dafür installiert sein muss, damit das Packagen funktioniert. Bei mir war’s drauf.) Ist dann halt > 100 MB, aber egal. :-]

Von Klopapier und Seife – Corona 1

Während der Corona-Krise schien jeder Mensch nur eins zu brauchen: Klopapier. Als in unserem Vorrat nur noch drei Rollen übrig waren, habe ich ganz naiver Weise versucht, neues Klopapier beim Supermarkt um die Ecke zu kaufen. Der Anruf meiner Mutter hätte mir eine Warnung sein sollen: „Sag mal, ist Krieg und ich habe es nicht mitbekommen? Ich versuche seit zwei Stunden Klopapier zu kaufen!“

Leeres Regal für Klopapier

Nachdem ich in den fünf umliegenden Supermärkten nur leere Regale gefunden habe, entschloss ich mich, das Klopapier im Internet zu bestellen. Doch, oh Wunder, auch dort gab es Lieferschwierigkeiten und als die letzte Rolle angebrochen war und immer noch kein Paket in Sicht war, bin ich erneut auf die Suche gegangen. Ich zog von Geschäft zu Geschäft ohne Erfolg. Netterweise gab es im DM schon den Hinweis im Eingang, dass Klopapier und Seife gerade ausverkauft waren.

Hinweisschild im Eingang des dm

Als ich trotzdem rein ging, flammte meine Hoffnung auf Klopapier kurz auf, da ich dort doch Seife fand.

Währenddessen klingelte ein Paketbote an unserer Haustür und lieferte ein Paket des Toilettenpapierherstellers ab.

Toilettenpapierbestellung mit Taschentüchern

Im DM allerdings hatte ich kein Glück… oder doch? Zu meinem Einkauf habe ich an der Kasse eine Flüssigseife geschenkt bekommen.

Plötzlich gab es doch Seife

So kam ich mit zu viel Seife und zu wenig Papier heim, um dort das Paket zu öffnen.

Im Paket fanden sich 16 statt der bestellten 64 Rollen und als Ersatz vier Großpackungen Taschentücher.