Greebo und syntax_plugin_cryptor

Vor einer gefühlten Ewigkeit hab ich das Plugin crypto für ein DokuWiki installiert und damit einigen Text auch „verschlüsselt“ (das Plugin macht aus dem eingegebenen Text auf der Basis einer Passphrase mit einem in JavaScript implementierten AES256 Algorithmus Buchstaben- und Zahlensalat). Das Ding warf nun nach dem Update auf Greebo und PHP7 das hier in die Logs:

[Sun Jun 03 13:55:36.724556 2018] [:error] [pid 14354] [client 11.111.111.111:62116] PHP Warning:  Declaration of action_plugin_cryptor::register($control
ler) should be compatible with DokuWiki_Action_Plugin::register(Doku_Event_Handler $controller) in /pfad/lib/plugins/cryptor/action.php on lin
e 0, referer: https://sub.domain.tld/dokuwikipfad/doku.php?id=start

Ich hab da nun so lange – und ehrlich gesagt: frei von PHP-Kenntnissen – mit Hilfe von Anleitungen zur Plugin-Erstellung auf dokwiki.org sowie Forenbeiträgen und Bugfixes auf Github zu anderen Dokuwiki-Plugins dran rumgefummelt, bis meine Logs keine Fehlermeldungen mehr zeigen und das Plugin trotzdem funktioniert.

Aus meiner Sicht haben sich seit der Erstellung dieses Plugins nur die Bezeichnungen der Funktionsaufrufe in Dokuwiki geändert. Ein echtes PHP5 – PHP7 Problem lag vermutlich nicht vor.

Wer da mal reingucken und selbst testen will sei mir herzlich willkommen:

2018-06-03-cryptor-php7-greebo [ZIP] [21 kb]

Etherpad auf 16.04

Ein Update zu der etwas in die Jahre gekommenen Anleitung zur Installation von Etherpad Lite auf Ubuntu, auch wenn sich viele Dinge nicht wirklich grundlegend geändert haben.

Erst einmal versorgen wir unseren Server mit einem aktuellen NodeJ.js sowie NPM. Die Anleitung hierzu: https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions

Dieser wird gefolgt, bis mit

sudo apt-get install -y nodejs

nicht nur NodeJS, sondern auch NPM an Bord ist.

Es folgen die Vorbereitungen für die lokale Installation von EP:

apt-get install gzip git curl python libssl-dev pkg-config build-essential

Dazu gehört ein Benutzerkonto etherpad:

sudo adduser --system --home=/opt/etherpad --group etherpad

In dessen Kontext dann gewechselt wird, um EP zu installieren:

sudo su - etherpad -s /bin/bash
# Dann als User etherpad weiter
git clone git://github.com/ether/etherpad-lite.git
cd etherpad-lite
bin/run.sh

Der erste Start installiert die Abhängigkeiten und sollte es danach ermöglichen, die Etherpad Installation unter http://example.org:9001 aufzurufen. Gelingt dies, dann brechen wir EP mit STRG C ab, um in Ruhe die Datei settings.json in /opt/etherpad/etherpad-lite sowie den Web- und DB-Server anzupassen.

Da wir nun immer wieder EP neu starten (als user etherpad) und außerdem als root weitere Pakete nachinstallieren sowie Anpassungen vornehmen müssen macht eine zweite Shell zum Server Sinn.

Nach der Installation von Apache2 und der Einrichtung von SSL-Zertifikaten folgt die Aktivierung der entsprechenden Module im Apachen:

a2enmod proxy proxy_http deflate headers ssl wstunnel

Ich folge hier im Wesentlichen der Anleitung hier: https://github.com/ether/etherpad-lite/wiki/How-to-put-Etherpad-Lite-behind-a-reverse-Proxy und erhalte am Ende eine VirtualHost Definition, die so aussieht:

<VirtualHost *:443>
      ServerAdmin webmaster@example.com
      ServerName etherpad.example.com
      DocumentRoot /var/www/example.com

     SSLEngine on
     ServerSignature On
     SSLHonorCipherOrder on
     SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS

     SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
     SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
     SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

        ProxyVia On
        ProxyRequests Off
        ProxyPreserveHost on

        <Location />
            ProxyPass http://localhost:9001/ retry=0 timeout=30
            ProxyPassReverse http://localhost:9001/
        </Location>

        <Location /socket.io>
            RewriteEngine On
            RewriteCond %{QUERY_STRING} transport=websocket    [NC]
            RewriteRule /(.*) ws://localhost:9001/socket.io/$1 [P,L]
            ProxyPass http://localhost:9001/socket.io retry=0 timeout=30
            ProxyPassReverse http://localhost:9001/socket.io
        </Location>

        <Proxy *>
            Options FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
        </Proxy>


        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        #SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                        SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                        SSLOptions +StdEnvVars
        </Directory>

</VirtualHost>

Nach einem Neustart des Apachen und einem erneuten Start von EP lite (aus dem Konto von etherpad heraus) sollte EP über https abgerufen werden können.

Hinweis zu den geladenen Apache-Modulen: wstunnel beseitigte bei mir Fehlermeldungen wie die diese:

[proxy:error] [pid 7926] [client 79.1.8.45:40652] AH00898: Error reading from remote server returned by /socket.io/
[proxy:warn] [pid 7934] [client 79.1.8.45:40848] AH01144: No protocol handler was valid for the URL /socket.io/. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Wir können EP nun wieder mit STRG C anhalten und eine Datenbank für EP einrichten. Dazu benötigen wir einen MySQL-Server sowie, bei Bedarf, phpMyAdmin für die einfachere Verwaltung. Weiter sollte auch abiword mit an Bord geholt werden, damit Pads exportiert werden können.

Sind diese Schritte vollbracht, wird die settings.json überarbeitet:

/*
  This file must be valid JSON. But comments are allowed

  Please edit settings.json, not settings.json.template

  To still commit settings without credentials you can
  store any credential settings in credentials.json
*/
{
  // Name your instance!
  "title": "KvFG Etherpad",

  // favicon default name
  // alternatively, set up a fully specified Url to your own favicon
  "favicon": "favicon.ico",

  //IP and port which etherpad should bind at
  "ip": "0.0.0.0",
  "port" : 9001,

  // Option to hide/show the settings.json in admin page, default option is set to true
  "showSettingsInAdminPage" : true,

  /*
  // Node native SSL support
  // this is disabled by default
  //
  // make sure to have the minimum and correct file access permissions set
  // so that the Etherpad server can access them

  "ssl" : {
            "key"  : "/path-to-your/epl-server.key",
            "cert" : "/path-to-your/epl-server.crt",
            "ca": ["/path-to-your/epl-intermediate-cert1.crt", "/path-to-your/epl-intermediate-cert2.crt"]
          },

  */

  //The Type of the database. You can choose between dirty, postgres, sqlite and mysql
  //You shouldn't use "dirty" for for anything else than testing or development
   "dbType" : "mysql",
   "dbSettings" : {
                    "user"    : "dbname",
                    "host"    : "localhost",
                    "password": "dbpassword",
                    "database": "dbuser",
                    "charset" : "utf8mb4"
                  },

  //the default text of a pad
  "defaultPadText" : "Welcome to Etherpad on Karlo!\n\nMit der Nutzung dieser Etherpad-Installation erklaerst Du Dich mit den folgenden Bedingungen einverstanden: https://example.com/doku.php?id=etherpad\n",

  /* Default Pad behavior, users can override by changing */
  "padOptions": {
    "noColors": false,
    "showControls": true,
    "showChat": true,
    "showLineNumbers": true,
    "useMonospaceFont": false,
    "userName": false,
    "userColor": false,
    "rtl": false,
    "alwaysShowChat": false,
    "chatAndUsers": false,
    "lang": "de"
  },

  /* Pad Shortcut Keys */
  "padShortcutEnabled" : {
    "altF9"     : true, /* focus on the File Menu and/or editbar */
    "altC"      : true, /* focus on the Chat window */
    "cmdShift2" : true, /* shows a gritter popup showing a line author */
    "delete"    : true,
    "return"    : true,
    "esc"       : true, /* in mozilla versions 14-19 avoid reconnecting pad */
    "cmdS"      : true, /* save a revision */
    "tab"       : true, /* indent */
    "cmdZ"      : true, /* undo/redo */
    "cmdY"      : true, /* redo */
    "cmdI"      : true, /* italic */
    "cmdB"      : true, /* bold */
    "cmdU"      : true, /* underline */
    "cmd5"      : true, /* strike through */
    "cmdShiftL" : true, /* unordered list */
    "cmdShiftN" : true, /* ordered list */
    "cmdShift1" : true, /* ordered list */
    "cmdShiftC" : true, /* clear authorship */
    "cmdH"      : true, /* backspace */
    "ctrlHome"  : true, /* scroll to top of pad */
    "pageUp"    : true,
    "pageDown"  : true
  },

  /* Should we suppress errors from being visible in the default Pad Text? */
  "suppressErrorsInPadText" : false,

  /* Users must have a session to access pads. This effectively allows only group pads to be accessed. */
  "requireSession" : false,

  /* Users may edit pads but not create new ones. Pad creation is only via the API. This applies both to group pads and regular pads. */
  "editOnly" : false,

  /* Users, who have a valid session, automatically get granted access to password protected pads */
  "sessionNoPassword" : false,

  /* if true, all css & js will be minified before sending to the client. This will improve the loading performance massivly,
     but makes it impossible to debug the javascript/css */
  "minify" : true,

  /* How long may clients use served javascript code (in seconds)? Without versioning this
     may cause problems during deployment. Set to 0 to disable caching */
  "maxAge" : 21600, // 60 * 60 * 6 = 6 hours

  /* This is the absolute path to the Abiword executable. Setting it to null, disables abiword.
     Abiword is needed to advanced import/export features of pads*/
  "abiword" : "/usr/bin/abiword",

  /* This is the absolute path to the soffice executable. Setting it to null, disables LibreOffice exporting.
     LibreOffice can be used in lieu of Abiword to export pads */
  "soffice" : null,

  /* This is the path to the Tidy executable. Setting it to null, disables Tidy.
     Tidy is used to improve the quality of exported pads*/
  "tidyHtml" : null,

  /* Allow import of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */
  "allowUnknownFileEnds" : true,

  /* This setting is used if you require authentication of all users.
     Note: /admin always requires authentication. */
  "requireAuthentication" : false,

  /* Require authorization by a module, or a user with is_admin set, see below. */
  "requireAuthorization" : false,

  /*when you use NginX or another proxy/ load-balancer set this to true*/
  "trustProxy" : false,

  /* Privacy: disable IP logging */
  "disableIPlogging" : false,

  /* Time (in seconds) to automatically reconnect pad when a "Force reconnect"
     message is shown to user. Set to 0 to disable automatic reconnection */
  "automaticReconnectionTimeout" : 0,

  /* Users for basic authentication. is_admin = true gives access to /admin.
     If you do not uncomment this, /admin will not be available! */
  "users": {
    "admin": {
      "password": "adminpassword",
      "is_admin": true
    },
    "user": {
      "password": "changeme1",
      "is_admin": false
    }
  },

  // restrict socket.io transport methods
  "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],

  // Allow Load Testing tools to hit the Etherpad Instance.  Warning this will disable security on the instance.
  "loadTest": false,

  // Disable indentation on new line when previous line ends with some special chars (':', '[', '(', '{')
  /*
  "indentationOnNewLine": false,
  */

  /* The toolbar buttons configuration.
  "toolbar": {
    "left": [
      ["bold", "italic", "underline", "strikethrough"],
      ["orderedlist", "unorderedlist", "indent", "outdent"],
      ["undo", "redo"],
      ["clearauthorship"]
    ],
    "right": [
      ["importexport", "timeslider", "savedrevision"],
      ["settings", "embed"],
      ["showusers"]
    ],
    "timeslider": [
      ["timeslider_export", "timeslider_returnToPad"]
    ]
  },
  */

  /* The log level we are using, can be: DEBUG, INFO, WARN, ERROR */
  "loglevel": "INFO",

  //Logging configuration. See log4js documentation for further information
  // https://github.com/nomiddlename/log4js-node
  // You can add as many appenders as you want here:
  "logconfig" :
    { "appenders": [
        { "type": "console"
        //, "category": "access"// only logs pad access
        }
    /*
      , { "type": "file"
      , "filename": "your-log-file-here.log"
      , "maxLogSize": 1024
      , "backups": 3 // how many log files there're gonna be at max
      //, "category": "test" // only log a specific category
        }*/
    /*
      , { "type": "logLevelFilter"
        , "level": "warn" // filters out all log messages that have a lower level than "error"
        , "appender":
          {  Use whatever appender you want here  }
        }*/
    /*
      , { "type": "logLevelFilter"
        , "level": "error" // filters out all log messages that have a lower level than "error"
        , "appender":
          { "type": "smtp"
          , "subject": "An error occurred in your EPL instance!"
          , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com"
          , "sendInterval": 300 // 60 * 5 = 5 minutes -- will buffer log messages; set to 0 to send a mail for every message
          , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods
              "host": "smtp.example.com", "port": 465,
              "secureConnection": true,
              "auth": {
                  "user": "foo@example.com",
                  "pass": "bar_foo"
              }
            }
          }
        }*/
      ]
    }
}

Viel angepasst habe ich nicht: Die Datenbankverbindung, den einführenden Text in jedes Pad mit einem Verweis auf die Benutzerordnung und das Passwort für den administrativen Benutzer.

Ob die Datenbankverbindung glückt, wird erneut aus dem Kontext des Benutzers etherpad geprüft. Danach wird Etherpad als Service eingerichtet.

Dazu erstellt man sich eine Datei /etc/systemd/system/etherpad.service mit folgendem Inhalt:

[Unit]
Description=Etherpad
After=syslog.target network.target

[Service]
Type=simple
User=etherpad
Group=etherpad
WorkingDirectory=/opt/etherpad/etherpad-lite
ExecStart=/usr/bin/nodejs /opt/etherpad/etherpad-lite/node_modules/ep_etherpad-lite/node/server.js
Restart=always

[Install]
WantedBy=multi-user.target

Das entspricht bis auf die Pfade der Anleitung hier: https://github.com/ether/etherpad-lite/wiki/How-to-deploy-Etherpad-Lite-as-a-service 

Gelingt der Start mit service etherpad start kann man mit ufw den Port 9001 zu machen und in den Betrieb übergehen. Wer will kann etherpad auch automatisch starten lassen: systemctl enable etherpad

Der Login-Screen von Etherpad kann in /opt/etherpad/etherpad-lite/src/templates/index.html an die eigenen Wünsche angepasst und z.B. um Links zum Impressum und zur Benutzerordnung erweitert werden.

# ca ab Zeile 160

 <div id="wrapper">
         <% e.begin_block("indexWrapper"); %>
             <div id="inner">
                 <button id="button" onclick="go2Random()" data-l10n-id="index.newPad"></button>
                 <label id="label" for="padname" data-l10n-id="index.createOpenPad"></label>
                 <form action="#" onsubmit="go2Name();return false;">
                     <input type="text" id="padname" maxlength="50" autofocus x-webkit-speech>
                     <button type="submit">OK</button>
                 </form>
                 <p><a href="https://link.zum.impressum" target="_blank">Impressum</a> | <a href="https://link.zur.nutzungsordnung" target="_blank">Benutzerordnung</a></    p>          
             </div>

Nur noch ein Punkt: Das Plugin, das man als schulischer Admin unbedingt haben will, ist das hier: https://www.npmjs.com/package/ep_adminpads

PDF Formulare

Seit acroread nicht mehr in den Repos ist und sich auch nicht mehr ohne Klimmzüge auf aktuelleren Linuxen installieren lässt, sieht es Mau aus mit dem Ausfüllen von PDF-Formularen. Man kann Okular nehmen … und dann damit leben, dass die Formularinhalte als XML Dateien im Homeverzeichnis „verschwinden“, statt direkt beim Dokument zu liegen. Für mich ist das ein No-go, weil ich PDF-Formulare noch Jahre später oder auch auf einer anderen Maschine ausgefüllt ansehen können will.

Eine unfreie aber praktikable Lösung scheint mir hier zu liegen:

https://code-industry.net/free-pdf-editor/

Erste Versuche mit den Beihilfeformularen zeigen, dass sich Master PDF Editor benimmt wie ein Acrobat Reader. Die Formulareinträge landen im PDF. Man kann das PDF also verschieben und kopieren und die Inhalte bleiben erhalten.

Die Installation wiegt mit rund 10MB nicht viel und abgesehen von einigen Qt Abhängigkeiten kommt wenig an Bord.

VM Transfer

EIne VM braucht so seine Zeit bis sie eingerichtet ist. Wenn nur das Netz im Hause lahmt, dann kann man diese zu Hetzner umziehen. Ich hab das mal mit Proxmox (Hetzner) und VirtualBox (im Haus) getestet.

Hier die /etc/network/interfaces des Rootservers bei Hetzner mit den Routing für die VMs:

source /etc/network/interfaces.d/*                                                                                                                                                                   
                                                                                                                                                                                                     
auto lo
iface lo inet loopback

iface lo inet6 loopback

auto enp0s31f6
iface enp0s31f6 inet static
        address  111.111.111.158 # Main Server IP set by Hetzner
        gateway  111.111.111.129 # Main Server Gateway set by Hetzner
        up route add -net 111.111.111.128 netmask 255.255.255.192 gw 111.111.111.129 dev enp0s31f6
        netmask  255.255.255.192 # Netmask set by Hetzner

iface enp0s31f6 inet6 static
        address  2222:333:172:25dd::2 # Main Server IP set by Hetzner
        netmask  64
        gateway  fe80::1

auto vmbr0 # red interface for Internet connection of VMs
iface vmbr0 inet static
        address  111.111.111.158
        netmask  255.255.255.255
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        pre-up brctl addbr vmbr0
        up ip route add 99.99.99.81/32 dev vmbr0 # first VM
        up ip route add 99.99.99.82/32 dev vmbr0 # second VM
        up ip route add 99.99.99.83/32 dev vmbr0 # third VM
        up ip route add 99.99.99.84/32 dev vmbr0 # fourth VM
        up ip route add 99.99.99.85/32 dev vmbr0 # fifth VM
        up ip route add 99.99.99.86/32 dev vmbr0 # sixth VM

auto vmbr1 # green interface for local traffix between VMs
iface vmbr1 inet static
        address  10.16.0.1
        netmask  255.255.0.0
        bridge_ports none
        bridge_stp off
        bridge_fd 0

auto vmbr2 # pink interface for VMs which do NAT only
iface vmbr2 inet static
        address  192.168.0.1
        netmask  255.255.0.0
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        post-up iptables -t nat -A POSTROUTING -s '192.168.0.0/16' -o enp0s31f6 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '192.168.0.0/16' -o enp0f31f6 -j MASQUERADE

Man erstellt sich in Proxmox eine KVM VM (hier mit der IP 99.99.99.83) mit ausreichend HDD-Platz, um den zu Hause liegenden Server aufzunehmen. Dabei achtet man in der Proxmox-GUI darauf, dass die Einstellungen möglichst genau denen der zu übetragenden VM in VBox entsprechen – z.B. virtio für die Netzwerkkarten.

Dann zieht man sich ein Live-Medium als ISO (bei Hetzner mit wget -4 weil die IPv6 Namensauflösung länger dauert als der Download) auf dem Proxmox-Server nach /var/lib/vz/template/iso und bindet dieses in der KVM-VM in Proxmox ein. Davon dann booten.

Die Wahl des Tastatur-Layouts gelang VNC in Proxmox bei Ubuntu ISOs hierbei nicht immer, weswegen man auch gleich bei US bleiben kann. Bessere Erfahrungen machte ich mit Lubuntu ISOs.

Ist das Live-Medium gebootet, müssen dessen Netzwerkeinstellungen händisch vorgenommen werden. Dabei können IP und Gateway noch über die grafische Oberfläche festgelegt (meist handelt es sich bei den Live-Medien um den Network-Manager) werden. Als DNS kann man z.B. den von Google (8.8.8.8) nutzen. Das Feld für Gateway bleibt leer. Denn: Die Routen für die KVM-VM müssen händisch mit ip route add gesetzt werden.

# address 99.99.99.83 # set this in NM
# netmask 255.255.255.255 # set this in NM
ip route add 111.111.111.158 dev eth0
ip route add default via 111.111.111.158 dev eth0

Meist muss für eth0 noch der Name des Interfaces an den der KVM-VM angepasst werden. Wie das Interface sich im gegebenen Fall nennt, zeigt ein ifconfig.

Netzwerkverbindung testen.

In der KVM-VM wird zu einer root shell gewechselt und für root ein Passwort vergeben

sudo su -
passwd

Dann einen openssh-server installieren und dessen Konfiguration so anpassen, dass sich root über SSH mit Passwort einloggen darf. Den SSH Server neu starten.

Jetzt kann man schon ausprobieren, ob man sich von der lokalen VBox VM auf dem Live-Medium bei Hetzner einloggen kann.

Klappt das, dann kann es mit dem Transfer der lokalen VBox VM losgehen.

Dazu legt man auf der HDD der KVM-VM zuerst ein Dateisystem an. Im Live-Medium kann man hierzu sogar Gparted nutzen.

Dann mounted man die root Partition (müsste /dev/sda1 sein) der KVM-VM nach /mnt und der eigentliche Transfer erfolgt nun in mindestens zwei Schritten, will man die downtime des lokalen Servers klein halten: Einmal einen rsync aus dem laufenden System heraus. Ein zweites mal, nachdem das lokale System ebenfalls mit einem Live-Medium gebootet wurde, um die Veränderungen auch noch zu übertragen. Ist einem die downtime egal, dann nutzt man am besten gleich lokal ein Live-Medium.

screen rsync -e "ssh -o PubkeyAuthentication=no" --numeric-ids --delete --progress -axAhHSP --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / root@99.99.99.83:/mnt/

Ab jetzt sind wieder die im Vorteil, die viel Bandbreite im Upstream haben. In meinem Fall wird die Übertragung 33 Stunden dauern, was dazu führt, dass mir die Zwangstrennung der Internetverbindung die Übertragung in einem Rutsch vermasselt.

Literatur 1, 2, 3

OCR revisited

Zwar liefert Finereader die besseren Ergebnisse und obendrein noch ein Layout für die Scans, aber für eine lokale Suche nach einem PDF reicht auch ein bischen weniger, so dass man sich die Ausgaben bei ABBYY für jede einzelne Seite zumindest teilweise sparen kann.

Unter einem Debian 9:

sudo apt-get install poppler-utils ocrmypdf tesseract-ocr-deu

Details und weitere Konfigurationsmöglichkeiten, Batch-Skripte und mehr sind hier zu haben. Ich setze ocrmypdf bisher gezielt auf einzelne Verzeichnis an mit diesem Einzeiler:

for i in $( ls *.pdf ) ; do ocrmypdf --skip-text -l deu --deskew --clean --rotate-pages --clean-final $i - | pdftotext - $i.txt ; done

Das ergibt dann TXT Dateien mit zu über 95% richtig erkanntem Inhalt, wenn die Vorlage gut ist. Presst man PDF-Faxe und ähnlichen Mist durch die tool chain, dann kommt leider weitaus weniger Brauchbares hinten raus – aber zum Wiederfinden auf der lokalen Platte mit recoll reicht es.

Falsches Userhome im LDAP

Nach Beendigung des Klassenarbeitsmodus auf einer LD vergisst diese gelegentlich, die richtigen Pfade zurück in den LDAP Baum zu schreiben. Meldet sich der Benutzer danach an, erhält er ein Homeverzeichnis, das dem aus dem Klassenarbeitsmodus entspricht

homeDirectory: /home/dynamic/Benutzer/lehrer/_Klassenarbeiten_/InfKA2

und kommt an seine eigenen Dateien nicht mehr ran. Außerdem hat er keinen Zugriff auf die Tauschverzeichnisse.

Einfachster Weg: Den LDAP Baum in eine Datei kippen

ldapsearch -U admin > ldap-tree

Den Dump dann mit grep und Freunden nach „Klassenarbeit“ durchsuchen und die Fundstellen zusammen mit den betroffenen Benutzern inklusive username notieren.

Auf einem Client jxplorer installieren (der sich in den Ubuntu Repos befindet) und sich mit diesem mit dem LDAP auf dem Server verbinden. Der anzugebende LDAP Server ist hierbei die IP des Schulservers / LD-Servers (also z.B. 10.16.1.1), als Benutzer nehmen wir den ldap-admin, dessen genaue Bezeichnung / DN wir aus dem gerade exportierten LDAP Baum nehmen können

cn=ldap-admin,dc=kvfg,dc=tue,dc=schule-bw,dc=de

Verwendet man für diesen das Passwort des admin (Administrator), dann erhält man nur lesenden Zugriff. Schreibenden Zugriff bekommt man mit dem Passwort, das in

/etc/ldap.secret

liegt.  Hier dann im Bäumchen users unter

homeDirectory: /home/dynamic/Benutzer/benutzername

eintragen – und nicht den Eintrag aus ldRealHomeDirectory übernehmen, der nur den Serverpfad enthält. Auf dem LD-Server ist der Pfad oben ein Symlink.

Am Ende des Prozesses noch durch die Homeverzeichnisse – auch den ver-symlinkten Teil unterhalb von /home/dynamic – durchsehen und nach evtl. noch bestehenden Symlinks auf das ehemalige Klassenarbeitsverzeichnis suchen. Diese löschen.

HSK alpha II

Der Zugang zum „Dachsschluf“ ist nun so hoch und breit, dass ich flach auf dem Bauch liegend wie auch seitlich durchkomme und viel weniger blaue Flecken abbekomme. Nach einer Stunde Arbeiten an der Erweiterung war bei mir aber die Kraft erst einmal zu Ende – also lief ich noch ein wenig die Hänge hoch und runter und suchte die Umgebung der HSK ab. Dabei fand ich das Deckenloch für den Eingang der HSK. Das sieht auf dem Bild größer aus, als es ist.

Auf Grund der beschränkten Kraftressourcen muss ich mir die Arbeit für die nächsten Schritte einteilen: Es reicht immer nur für rund 1 Stunde auf dem Bauch liegend buddeln und Dreck wegkratzen – dann will mein Kreuz eine längere Pause.

Beim nächsten Anlauf kommt also die zweite Engstelle im „Dachsschluf“ dran und erst beim übernächsten Mal geht es dann ins Neuland.

Evil Penguin (beta)

Janis 3D-Drucker musste ich ausprobieren und sitze nun an einem Entwurf für einen richtig bösen Pinguin zum Stecken. Aktuell sieht er so aus, wie im PNG Bild oben.

Meine toolchain ist: Entwurf in Inkscape (weil ich damit leidlich klar komme), Export nach openSCAD mit Hilfe dieses Plugins und aus openSCAD dann die STL erzeugen, die mit Cura von Janis gesliced wird.

Meine von Janis in Blender noch einmal optimierte (die Bauchlinie des Pinguins war für den Druck zu dünn gezeichnet) Machbarkeitsstudie von gestern und damit mein erster Entwurf steht hier schon.

Die SVG sowie die hieraus erzeugten SCAD und STL Dateien und auch die optimierte Version für Blender sind hier zu haben [ZIP] [125kb]

2017-06-12_penguin-evil-dow

Noch wackelt er ein klein wenig, weil ich die Stecker nicht richtig dimensionierte (oder diese noch hätte mit Sandpapier nachschleifen müssen) – aber der Anfang ist gemacht.

Update 15.06.

Inzwischen spiele ich an einem 3D Modell des evil penguin. Dank einer Einführung von Janis traute ich mich an Blender und hab inzwischen das Gefühl, dass ich noch nie vor einer Tastatur saß. Blender ist am Anfang hartes Brot. Aber der Pinguin nimmt Formen an.

HSK alpha I

Gestern zwängte ich mich also durch die erste Engstelle in den Teil der HSK, der ab jetzt Dachsschluf heißt. In der zweiten Ausbuchtung nach der zweiten Engstelle befand sich nämlich auf der linken Seite ein verlassenes Nest.

Die beiden anderen Fortsetzungen habe ich aufgegeben. Die sind schlicht zu eng.

Insgesamt eine ziemliche Quälerei, das Loch. Eindeutig Elsachbröllerfeeling – auch was die Zahl an Schürfungen und blauen Flecke heute angeht. Die im Dachschluf oft weniger als 30cm zwischen Boden und Decke werden durch Anhäufungen von Boden (immer noch Humus und Erde, aber zunehmend fest) in dem leicht ansteigenden Gang fast plombiert. Man muss sich also entscheiden, in welche Richtung man den Kopf gedreht haben will und kann diese Ausrichtung bis zur nächsten Kuhle in der Decke / im Boden nicht ändern. Rechts und links hat man ein wenig Platz, so dass keine Platzangst aufkommt, jedoch nicht so viel, dass man sich für den Rückweg drehen könnte. Also rückwärts wieder raus, was in der ersten Engstelle dann zu heftigen Flüchen führt, weil man auf dem Rückweg die Arme schon in der Engstelle verkeilt hat und sich trotzdem irgendwie „den Hang hoch“ schieben muss. Also windet man sich Zentimeter um Zentimeter der Eingangskammer entgegen.

Aber hinten geht es weiter. Der sich leicht nach links (?) wendende Gang wird dabei noch ein wenig flacher bzw. die Bodenwellen aus Erde nehmen an Häufigkeit zu, jedoch der leichte Luftzug bleibt.

Jetzt müssen die blauen Flecke abheilen – dann kommt der nächste Anlauf.

Haldenhofhöhlen

Für Bodman-Ludwigshafen sind in Openstreetmap Höhlen eingezeichnet.


View Larger Map

Dort hat es keinen Kalk. Da ist alles Sandstein / Molasse. Da ich am Dienstag vor Ort war, ging ich nachsehen – im festen Glauben, da hat sich jemand eine Scherz erlaubt. Aber tatsächlich: Löcher im Fels!

Die Höhle auf der linken Seite nenne ich auf Grund ihrer Form mal „Haldenhofabri“, auch wenn es sich bei dieser um eine menschliche Grabung handeln dürfte.

Immerhin hat sie zwei kleine Fortsetzungen unbekannter Länge.

In Ermangelung der richtigen Ausrüstung bekroch ich nichts, sondern peilte nur einmal mit dem Disto in Richtung Berg.

Die im Plan bei OSM rechts gelegene „Höhle“ ist ein von Hand aus dem Fels gemeiselter Keller von gut über 20 Meter Länge.

Der kastenförmige Gang ist zu Beginn noch übermannshoch, wird dann aber, je weiter man dem Gefälle in den Berg hinein folgt, niedriger.

Der Gang biegt leicht nach links ab, nähert sich also dem Haldenhofabri und scheint in einem rechteckigen Kellerraum zu enden.

Da sich ungefähr an der Biegung Regenwasser zu einem mehr als knöcheltiefem See gesammelt hat und ich in normalen Schuhen und ohne Lampe unterwegs war, musste eine Peilung und die Handylampe reichen, um zu einer ersten groben Schätzung zu gelangen, wie es hier im Berg aussehen könnte.

Am Anfang des „Sees“ liegen noch Bretter im Wasser … weiter hinten liegen diese unter der Wasseroberfläche. Das nächste Mal habe ich meine Gummistiefel dabei – und Licht.