Kategorien

Webscraping mit CasperJS und PhantomJS auf einem FreeNAS 11 Jail

Wir setzen einen neuen Jail auf und loggen uns ein. Dann aktualisieren wir erstmal das System

1
2
pkg pudate
pkg upgrade

Anschließend installieren wir PhantomJS und pyhton mit einem

pkg install phantomjs python

Da es für CasperJS kein Paket gibt, laden wir es aus dem Git.

1
2
3
cd /usr/local/
mkdir casperjs
git clone git://github.com/n1k0/casperjs.git

Nun testen wir, ob alles funktioniert

/usr/local/casperjs/bin/casperjs selftest

Und voilà, es funktioniert!

Logitech Media Server auf FreeNAS 11

Installation des Logitech Media Servers im Jail

Um den Logitech Media Server auf FreeNAS 11 zu betreiben bin ich wie folgt vorgegangen:

  1. Anleitung zum Bauen des Logitech Media Servers aus dem Forum befolgen (hierzu habe ich ein separates Jail verwendet). Diese Anleitung funktioniert auch unter FreeNAS 11.
  2. Eigenen Jail für den Logitech Media Server erstellen (Name: lms)
  3. Das erzeugte Paket in den neu erstellten Jail kopieren. Den folgenden Befehl auf der FreeNAS Konsole ausführen
    cp /mnt/data0/jails/lms_build/tmp/LMS/logitechmediaserver-7.9.0-FreeBSD.tar /mnt/jails/lms/tmp/
  4. Analoge Schritte aus dem Forum befolgen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    pkg update
    pkg upgrade
    pw groupadd -n lms -g 30001
    pw useradd -n lms -u 30001 -g lms -s /usr/sbin/nologin -c "Logitech Media Server" -d /nonexistent
    mkdir /usr/local/lms
    tar xf /tmp/logitechmediaserver-7.9.0-FreeBSD.tar -C /usr/local/lms
    mv /usr/local/lms/logitechmediaserver-7.9.0-FreeBSD/* /usr/local/lms
    rmdir /usr/local/lms/logitechmediaserver-7.9.0-FreeBSD/
    chown -R lms:lms /usr/local/lms
    rm /usr/bin/perl
    rm /usr/bin/perl5
    ln -s -f /usr/local/bin/perl5.24.3 /usr/bin/perl
    ln -s -f /usr/local/bin/perl5.24.3 /usr/bin/perl5
  5. Init-Skript /etc/rc.d/lms zum automatischen Start des Logitech Media Servers mit folgenden Inhalt erstellen:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    
    #!/bin/sh
     
    # This script is a modified version of:
    # $FreeBSD: branches/RELENG_9_2_0/audio/squeezeboxserver/files/squeezeboxserver.in 302141 2012-08-05 23:19:36Z dougb $
     
    # PROVIDE: lms
    # REQUIRE: LOGIN
    # KEYWORD: shutdown
     
    # Add the following lines to /etc/rc.conf to enable lms on startup:
    # lms_enable="YES"
     
    # Optional configuration parameters:
    # Directory where lms writes it's logs to.
    # lms_logdir="/var/log/lms"
    #
    # Directory where lms stores it's cache files.
    # lms_cachedir="/var/db/lms/cache"
    #
    # Directory where lms stores it's configuration.
    # lms_prefsdir="/var/db/lms/prefs"
    #
    # Directory where lms stores the playlists. THIS NEEDS TO BE CONFIGURED THROUGH THE UI.
    # lms_playlistdir="/var/db/lms/playlists"
    #
    # Additional parameters, e.g. "--noimage --novideo"
    # lms_flags=""
    #
    # The charset lms uses.
    # lms_charset="UTF-8"
    #
    # The LC_CTYPE envvar which is necessary to get rid of the warning
    # """
    # Your locale was detected as C, you may have problems with non-Latin filenames.
    # Consider changing your LANG variable to the correct locale, i.e. en_US.utf8.
    # """
    # See https://forums.freenas.org/index.php?threads/logitech-media-server-for-freenas-9-2-1-1.19044/page-3#post-132872
    # lms_lc_ctype="en_US.UTF.8"
     
    . /etc/rc.subr
     
    name=lms
    rcvar=lms_enable
     
    pidfile=/var/run/${name}/${name}.pid
    lms_user=lms
    lms_group=lms
     
    load_rc_config ${name}
     
    : ${lms_enable="NO"}
    : ${lms_logdir="/var/log/${name}"}
    : ${lms_cachedir="/var/db/${name}/cache"}
    : ${lms_prefsdir="/var/db/${name}/prefs"}
    : ${lms_playlistdir="/var/db/${name}/playlists"}
    : ${lms_flags=""}
    : ${lms_charset="UTF-8"}
    : ${lms_lc_ctype="en_US.UTF-8"}
     
    command_interpreter=/usr/bin/perl
    command=/usr/local/lms/slimserver.pl
    command_args="\
    --daemon \
    --pidfile=${pidfile} \
    --logdir=${lms_logdir} \
    --cachedir=${lms_cachedir} \
    --prefsdir=${lms_prefsdir} \
    --charset=${lms_charset} \
    ${lms_flags}"
     
    start_precmd="lms_start_precmd"
    stop_postcmd="lms_stop_postcmd"
     
    lms_start_precmd()
    {
            export LC_CTYPE="${lms_lc_ctype}"
     
            if [ ! -d "${pidfile%/*}" ]; then
                    install -d -o ${lms_user} -g ${lms_group} ${pidfile%/*};
            fi
     
            if [ ! -d "${lms_logdir}" ]; then
                    install -d -o ${lms_user} -g ${lms_group} "${lms_logdir}";
            fi
     
            if [ ! -d "${lms_cachedir}" ]; then
                    install -d -o ${lms_user} -g ${lms_group} "${lms_cachedir}";
            fi
     
            if [ ! -d "${lms_prefsdir}" ]; then
                    install -d -o ${lms_user} -g ${lms_group} "${lms_prefsdir}";
            fi
     
            if [ ! -d "${lms_playlistdir}" ]; then
                    install -d -o ${lms_user} -g ${lms_group} "${lms_playlistdir}";
            fi
    }
     
    lms_stop_postcmd()
    {
            pids=`pgrep -u ${lms_user}`
            if [ -n "${pids}" ]; then
                    sleep 1
                    kill $pids > /dev/null 2>&1
            fi
            pids=`pgrep -u ${lms_user}`
            if [ -n "${pids}" ]; then
                    wait_for_pids $pids
            fi
    }
     
    run_rc_command "$1"
  6. Sicherstellen, dass das Init-Skript ausführbar ist
    chmod +x /etc/rc.d/lms
  7. Datei /etc/rc.conf editieren und die folgende Zeile ergänzen
    lms_enable=“YES“
  8. Zusätzlich erforderliche Verzeichnisse erstellen und Rechte anpassen
    1
    2
    
    mkdir -p /var/log/lms /var/db/lms/cache /var/db/lms/prefs /var/db/lms/playlists
    chown -R lms:lms /var/log/lms /var/db/lms/cache /var/db/lms/prefs /var/db/lms/playlists
  9. Benötigtes perl Package installieren
    pkg install p5-IO-Socket-SSL
  10. Logitech Media Server starten
    /etc/rc.d/lms start
  11. Binaries zur Umwandlung im richtigen Ordner hinterlegen und ausführbar machen
    cp /usr/local/lms/Bin/i386-freebsd-64int/* /usr/local/lms/Bin/
    chmod +x faad flac sls wvunpack

Erweiterung des Dateispektrums des Logitech Media Servers

Der Logitech Media Server benötigt nnoch weitere Binaries, um zusätzliche Formate umzuwandeln z.B. Monkey’s Audio (APE). aus diesem Grund habe ich die folgenden Programme nachinstalliert

1
2
pkg install mac
ln -s /usr/local/bin/mac /usr/local/lms/Bin/mac

Will man Cue-Sheets mit APE-Dateien verwenden, benötigt man ffmpeg. Der für mich einfachste Weg war, ein statisches Binary herunterzuladen und in FreeNAS Linux Kompatibilität herzustellen. Dazu unter System -> Tunable den Punkt Add Tunable auswählen und folgende Variablen setzen
Variable: linux_load
Value: YES
Type: Loader
Type: rc.conf
Enabled: yes
Um einen Neustart zu vermeiden, manuell das entsprechende Modul laden (FreeNAS Konsole):

kldload linux

Dann statisches ffmpeg herunterladen und entsprechend verschieben

1
2
3
fetch https://johnvansickle.com/ffmpeg/builds/ffmpeg-git-32bit-static.tar.xz
tar xf ffmpeg-git-32bit-static.tar.xz -C /usr/local/lms/Bin
mv /usr/local/lms/Bin/ffmpeg-git-20170929-32bit-static/ffmpeg /usr/local/lms/Bin

Testen, ob ffmpeg ausgeführt werden kann

/usr/local/lms/Bin/ffmpeg

Jetzt noch wie in meinem anderen Blogartikel beschrieben die convert.conf anpassen und das Skript ffmpeg_wrapper in /usr/local/lms/Bin/ ablegen. Da dieses nur mit der bash funktioniert, diese Shell nachinstallieren

pkg install bash

und die erste Zeile von ffmpeg_wrapper in

#!/usr/local/bin/bash

anpassen. Außerdem wird noch lame benötigt

1
2
3
4
cd /usr/ports/audio/lame
pkg install gmake gcc
make install
ln -s /usr/local/bin/lame /usr/local/lms/Bin/lame

Zum Schluss noch entsprechend der Anleitung die Datei /usr/local/lms/Slim/Formats/APE.pm anpassen.

Update Prozedur für tine2.0

Vor dem Upgrade meines Produktivsystems prüfe ich zunächst immer, ob das Update ohne Probleme durchläuft (bisher habe ich damit nämlich einmal schlechte Erfahrungen gemacht). Aus diesem Grund beschreibe ich kurz mein Vorgehen.

  1. Test-Verzeichnis erstellen, Dateien herunterladen und entpacken
    1
    2
    3
    4
    
    mkdir tine_test
    cd tine_test http://packages.tine20.org/source/2017.08.5/tine20-allinone_2017.08.5.tar.bz2
    wget http://packages.tine20.org/source/2017.08.5/tine20-allinone_2017.08.5.tar.bz2
    tar xjf tine20-allinone_2017.08.5.tar.bz2

    Die aktuelle Version von tine findet man immer auf github.

  2. Dann wichtige Ordner und Dateien von der Produktivinstallation kopieren
    1
    
    cp -pR ../tine/config.inc.php ../tine/tine20.log* ../tine/base .

    Hinweis: Ich habe die Ordner files, caching, sessions und tmp im Verzeichnis base.

  3. Mysql-Datenbank kopieren in spezielle Testdatenbank tine20test, die ich für den gleichen Benutzer konfiguriert habe
    1
    
    mysqldump --add-drop-table -u tine20user -p tine20db | mysql -u tine20user -p tine20test
  4. Konfigurationsdatei config.inc.php editieren und auf Test-Datenbank anpassen (hier von tine20db auf tine20test)
  5. Im Webinterface Upgrade der Datenbankstruktur vornehmen unter http://yourserver/tine_test/setup.php
  6. Regulär einloggen unter http://yourserver/tine_test/ und alles testen
  7. Wenn erfolgreich, dann die Verzeichnisse austauschen
    1
    2
    3
    
    cd ..
    mv tine/ tine_old
    mv tine_test/ tine
  8. Datebankkonfiguration wird ändern auf Produktivdatenbank (hier von tine20test auf tine20db)
  9. Upgrade der Datenbankstruktur vornehmen unter http://yourserver/tine/setup.php
  10. Regulär einloggen unter http://yourserver/tine/ und nochmal testen
  11. Alte Dateien löschen
    1
    
    rm -rf tine_old

Das war’s!

Befehlsvervollständigung mit bash unter gentoo

Ein sehr praktisches Feature ist es beim Arbeiten mit der bash-Shell Befehle über die Tab-Taste automatisch zu vervollständigen. Unter gentoo lässt sich das erreichen, indem man zunächst mit einem

emerge -av bash-completion gentoo-bashcomp

die erforderliche Pakete bash-completion (allgemeine Bash-Befehlsvervollständigungen) und gentoo-bashcomp (spezifische Befehlsvervollständigungen für gentoo) installiert. Sofern nicht gesetzt, muss man auch das bash-completion USE flag in der Datei /etc/portage/make.conf ergänzen und dann eine Systemaktualisierung durchführen.

Danach bindet man die Befehlsvervollständigung in die systemweite Bash-Konfigurationsdatei /etc/bash/bashrc durch Ergänzen der Zeilen

# enable bash-completion
[[ -f /etc/profile.d/bash-completion.sh ]] && source /etc/profile.d/bash-completion.sh

ein und aktiviert sie systemweit mit einem

eselect bashcomp enable --global gentoo

Da es für verschiedene Programme Befehlsvervollständigungen gibt, muss man noch festlegen, für welche dies genau erfolgen soll. Eine entsprechende Liste erhält man mit

eselect bashcomp list

Jeder Benutzer kann nun für sich die einzelnen Listeneinträge aktiveren. Dazu wird das Verzeichnis ~/.bash_completion.d/ angelegt mit

mkdir ~/.bash_completion.d/

In dieses Verzeichnis erstellt man nun symbolische Links zu den einzelnen Dateien im Verzeichnis /usr/share/bash-completion, die bash eine Befehlsvervollständigung ermöglichen. Will man alle Befehlsvervollständigungen aktivieren, so erreicht man dies mit einem

for x in /usr/share/bash-completion/*; do [[ -e $x ]] || continue; ln -s -- "$x" "${HOME}/.bash_completion.d/${x##*/}"; done

Beim Start einer neuen Shell oder beim Laden der neuen Konfigurationsdatei mit einem

source /etc/bash/bashrc

sollten sich nun durch die tab-Taste die Befehle vervollständigen lassen.

Gentoo Hacks zu Systemupdates und Paketmanagement

Der Umgang mit dem Paketmanagementsystem ist unter Linux tägliches Handwerkszeug. Dabei gibt es immer wieder ein paar interessante Tricks und Kniffe, die ich hier nun für gentoo beschreiben möchte.

Upgrade des gesamten Systems

Ein Systemupgrade führe ich mit folgenden Schritten durch

# führt ein emerge --sync durch, aktualisiert den lokalen eix-Cache mit eix-update und zeigt die Unterschiede mit eix-diff an
eix-sync
# Overlays auf aktuellen Stand bringen (sofern man welche benutzt)
layman -S
# kurz für emerge --update --deep --newuse --ask --verbose --tree world
emerge -uDNavt world
# überflüssige Pakete entfernen
emerge -av depclean
# findet Pakete, die noch auf alte Programmbibliotheken verweisen und kompiliert diese neu
revdep-rebuild -v -- --ask
# Überflüssige Quellcodes und alte Binärpakete entfernen
eclean -d
# Konfigurationsdateien aktualisieren
dispatch-conf
# Prüfen, ob nicht mehr benötigte Pakete installiert sind
eix-test-obsolete

Auf serverfault.com gibt es eine interessante Diskussion wie man am Besten ein gentoo-System aktualisiert.

Emailbenachrichtigung über sicherheitsrelevante Paketupdates

Damit ich bei Sicherheitslücken in den installierten Programmen informiert werde, habe ich ein Cron-Skript unter /etc/cron.daily/glsa-check erstellt. Dieses ruft glsa-check auf und schickt eine Nachricht, falls eines oder mehrere Programme Sicherheitslücken aufweisen.

#!/bin/sh
export LANG=de_DE.UTF-8
export LANGUAGE=de_DE.UTF-8
# emerge --sync erforderlich, um glsa Meldungen zu bekommen
emerge --sync
glsa-check -n -q -l affected | mail -a "Content-Type: text/plain; charset=UTF-8" -e -s "glsa-check for $HOSTNAME" yourmailaddress@domain.com

Pakete inklusive Konfigurationsdateien vollständig entfernen

Ein einfaches Deinstallieren eines Paketes mit emerge löscht nicht die Konfigurationsdateien. Für den Fall, dass man diese auch löschen möchte, kann man dies tun mit einem

CONFIG_PROTECT="-*" emerge --unmerge package

Spezielle Paketversionen installiert halten

Manchmal möchte man ein Paket nicht aktualisieren und stattdessen die aktuelle Version beibehalten. Nun kann man einfach keine neuere Version installieren. Wenn man das gesamte System wie oben beschrieben aktualisieren oder bereinigen will, ist das natürlich schwierig. Mit einem

emerge -avt --noreplace sys-kernel/hardened-sources-3.10.1-r1

sorgt man dafür, dass emerge ein spezielles Paket in einer Version beibehält (siehe hierzu auch der Artikel Protecting slotted packages from ‚emerge –depclean‘).