Tag Archive: bash

Script: Aktuellste Firefox Aurora Version installieren

Gerne teile ich mit euch ein Bash-Script, welches die aktuelle Version des Firefox Aurora Browsers in deutscher Sprache ermittelt, herunterlädt und installiert. Aurora ist anzusiedeln zwischen Nightly und Beta.

Changelog

  • 25. Mär – Neueste Version auswählen, wenn mehrere verfügbar sind

Als Zielverzeichnis für die Installation wähle ich „/opt/aurora“, zudem erstellt das Script einen Anwendungsstarter in „/usr/share/applications“. Profile werden wie üblich im Heimverzeichnis des jeweiligen Benutzers via „.mozilla/“ gespeichert.

Aurora
Aurora
Vorab wird die Architektur des Systems ermittelt. Eine alte Installation wird unter Angabe von Datum und Zeit in „/opt“ gesichert.

Installation

Das Script an beliebigem Ort erstellen:

nano aurora_installer.sh

Und folgenden Inhalt einfügen:

#!/bin/bash
if [[ $UID -ne 0 ]]; then
        echo "$0 muss als \"root\" ausgeführt werden!"
        exit 1
fi
ISCURL=`which curl`
if [ -z $ISCURL ]; then
        echo "Bitte \"curl\" installieren!"
        exit 1
else
AURORA_TEMPRDIR='http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla-aurora-l10n/?C=M;O=D'
AURORA_RDIR='http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-mozilla-aurora-l10n/'

arch=$(uname -m)
 
echo -ne "Neueste Version suchen...\t\t\t"
if [ "$arch" == 'x86_64' ]; then
        AURORA_TNAME=`curl -s $AURORA_TEMPRDIR | grep -m1 -o '"firefox.*de\.linux-x86_64\.tar\.bz2"' | tr -d '"'`
else
        AURORA_TNAME=`curl -s $AURORA_TEMPRDIR | grep -m1 -o '"firefox.*de\.linux-i686\.tar\.bz2"' | tr -d '"'`
fi
echo -e "\e[00;32m OK\e[00m"
AURORA_RTARGET=$AURORA_RDIR$AURORA_TNAME
LINK_STATUS=$(curl -s --head -w %{http_code} $AURORA_RTARGET -o /dev/null)
if [ "$LINK_STATUS" == '200' ] && [ ! -z $AURORA_TNAME ]; then
        echo "Herunterladen und entpacken von $AURORA_TNAME..."
        [ ! -d "/opt/aurora/" ] || mv /opt/aurora /opt/aurora_bak_`date +%e%m%y_%H%M`
        cd /tmp/ && curl -# -o- $AURORA_RTARGET | tar xj
        echo -ne "Installieren und aufräumen...\t"
        cat > /usr/share/applications/firefox-aurora.desktop << "EOF"
[Desktop Entry]
Version=1.0
Name=Firefox Aurora
Comment=Browse the World Wide Web
GenericName=Web Browser
Exec=/opt/aurora/firefox -no-remote %u
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=/opt/aurora/browser/icons/mozicon128.png
Categories=GNOME;GTK;Network;WebBrowser;
StartupWMClass="Navigator","Firefox"
StartupNotify=true
EOF
        cp -r ./firefox /opt/aurora/ && rm -r ./firefox/
        chown -R root:users /opt/aurora
        echo -e "\e[00;32m OK\e[00m"
        echo "Firefox Aurora wurde installiert!"
        echo "Falls der Starter nicht erscheint, bitte \"unity --replace &\" ausführen."
        echo "Falls vorhanden, wurde eine alte Version in \"/opt\" gesichert."
else
        echo "URL ungültig: $AURORA_RTARGET"
fi
fi

Usage: # ./aurora_installer.sh
Vorab als ausführbar markieren: chmod +x aurora_installer.sh

„Mother Of All Ad-Blocking“

Im XDA-Forum gibt es die „Mother Of All Ad-Blocking“ für Android-Geräte. Hierbei wird eine individuelle „hosts“-Datei installiert und so Werbung blockiert.
Ob für den lokalen DNS-Server, den Desktop oder das Smartphone: Werbung blockieren tut in der heutigen Zeit immer gut, denn es spart Bandbreite und, ganz wichtig, schont die Nerven.

Changelog

  • 16.01.2014 – Cronjob ersetzt, da vorher nicht auf allen Debian/Ubuntu-Varianten gleichermaßen funktionsfähig

Die angebotene Liste ist eine große Zusammenfassung aus verschiedenen Quellen, weshalb ich sie lokal auf einem DNS-Server installieren möchte. Als Nameserver-Forwarder benutze ich „dnsmasq“, welcher, sofern nicht anders konfiguriert, die Einträge aus der „hosts“-Datei respektiert (=kein „no-hosts“ in der Konfiguration).
Der Download erfolgt via „http://adblock.mahakala.is“. Mit „wget“ und „curl“ funktioniert der Download nicht direkt, weshalb „Mozilla/5.0“ als User-Agent gesetzt wird. Außerdem hat die Liste eine eigene Kopfzeile, die weg geschnitten werden muss:

# AD BLOCKING by: Jake Thomas
# Last Update on: 07 January 2014
# Domain Block Count: 339285
# contact me on XDA: http://forum.xda-developers.com/member.php?u=4877037
# Copyright (c) 2007-2014, Jake Thomas (BSDgeek_Jake) (thomasj-gnugpl@usa.net)

# DEFAULT
127.0.0.1 localhost
127.0.0.1 localhost.localdomain
255.255.255.255 broadcasthost
127.0.0.1 android

Vorhandene/Eigene Einträge möchte ich zudem beibehalten. Der Einfachheit halber verwende ich „curl“ für den Download, dieses kann vorab installiert werden. Für Debian und Derivate:

sudo apt-get install curl

Der Befehl, um die Liste einmalig anzuhängen (als root):

curl -s -A "Mozilla/5.0" http://adblock.mahakala.is | \
sed -e '1,/android/d' >> /etc/hosts

Zum aktualisieren der Liste (ebenfalls als root):
ACHTUNG: Das Aktualisieren funktioniert nur, wenn die Liste bereits einmal angehängt wurde, da „sed“ nach „BLOCKING STARTS“ sucht.

sed -n "/BLOCKING STARTS/q;p" /etc/hosts >> /etc/hosts.new && curl -s -A "Mozilla/5.0" http://adblock.mahakala.is | sed -e "1,/android/d" >> /etc/hosts.new && mv /etc/hosts.new /etc/hosts && sed -i '/^$/d' /etc/hosts

Und als Cronjob jeden Tag aktualisieren:

sudo crontab -e

Einfügen:

0 0 */1 * * PATH=/usr/bin:/bin sed -n "/BLOCKING STARTS/q;p" /etc/hosts >> /etc/hosts.new && curl -s -A "Mozilla/5.0" http://adblock.mahakala.is | sed -e "1,/android/d" >> /etc/hosts.new && mv /etc/hosts.new /etc/hosts && sed -i '/^$/d' /etc/hosts

Das schöne ist, dass zusätzlich viel In-App Werbung blockiert wird, wenn das Smartphone im WLAN des eigenen DNS-Servers steht. Aber auch so, auf dem Desktop, ist es eine sehr umfangreiche Liste.

Optional: Alternative als dnsmasq-Konfigurationsdatei

Via „yoyo.org“ ist es möglich, eine etwas weniger umfangreiche, dennoch starke Liste, komplett im Konfigurations-Format des „dnsmasq“ herunterzuladen.
Einmalig herunterladen und aktivieren:

sudo wget -O /etc/dnsmasq.d/adblock.conf "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=dnsmasq&showintro=0&mimetype=plaintext" && sudo service dnsmasq restart

Als Cronjob jeden Tag aktualisieren:

sudo crontab -e

Einfügen:

0 0 */1 * * wget -O /etc/dnsmasq.d/adblock.conf "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=dnsmasq&showintro=0&mimetype=plaintext" && service dnsmasq restart

Anmerkung: Ich fühle mich verpflichtet zu sagen, dass Entwickler guter Software immer unterstützt werden sollten. Wer keine Werbung will, der kauft die „Pro/Ultra/Sonstwas“-Version von XY.
Leider gibt es auch dubiose Entwickler, die trotz Bezahlung noch vereinzelt Werbung einblenden, wofür ich kein Verständnis habe.

Debian Wheezy: Von MySQL zu MariaDB 10.0 migrieren (unattended)

MariaDB ist ein Fork von MySQL und sogar ein echtes „Drop-in Replacement“ für dieses. Ein Umstieg von MySQL auf MariaDB verläuft somit fast immer reibungslos, eine Nachkonfiguration ist nicht notwendig.
In seltenen Fällen und besonders bei Verwendung eigener (Web-)Anwendungen mit MySQL-Backend, rate ich dringlichst einen Blick auf die Kompatibilitätsübersicht.

Eine kurze, eilig übersetzte Zusammenfassung:

  • .frm-Dateien sind binärkompatibel.
  • Alle Client-APIs, Protokolle und „structs“ sind identisch.
  • Alle Dateinamen, Anwendungsdateien, Pfade, Ports, Sockets etc. sind identisch.
  • Alle MySQL-Anschlüsse (PHP, Perl, Python, Java, .NET, MyODBC, Ruby, MySQL C etc.) funktionieren mit MariaDB.
  • Das Paket „mysql-client“ arbeitet mit MariaDB zusammen.
  • Die „shared client library“ ist binärkompatibel mit der MySQL „client library“.
  • Selten gibt es Probleme mit PHP5 und der alten „mysql_connect“-Methode in Verbindung mit MariaDB, hier ein Fix.

Ja, es ist WordPress-kompatibel.

Was macht das Script?

Das Script geht folgendermaßen vor:

  • „python-software-properties“ installieren, um das Repository einfacher hinzuzufügen.
  • Schlüsselbund um den Schlüssel für das MariaDB 10.0 Repository erweitern.
  • Repository aktualisieren, setzen des Root-Passworts für die unbeaufsichtigte Installation.
  • Installation von MariaDB 10.0 – diese entfernt das Paket „mysql-server“! Alle Daten bleiben jedoch erhalten!
  • Log-Datei „migration.log“ im selben Verzeichnis des Scripts

Script und Anleitung

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

EXPECTED_ARGS=1
E_BADARGS=65

if [ $# -ne $EXPECTED_ARGS ]
then
  echo "Usage: `basename $0` SQL_ROOT_PW"
  exit $E_BADARGS
fi

MYSQL_PASS=$1

echo -en "Migrating MySQL to MariaDB...\t\t"
apt-get update >> migration.log 2>&1
apt-get install -y python-software-properties >> migration.log 2>&1
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db >> migration.log 2>&1
add-apt-repository 'deb http://mirror.netcologne.de/mariadb/repo/10.0/debian wheezy main' >> migration.log 2>&1
apt-get update >> migration.log 2>&1
export DEBIAN_FRONTEND=noninteractive
debconf-set-selections <<< "mariadb-server-10.0 mysql-server/root_password password $MYSQL_PASS"
debconf-set-selections <<< "mariadb-server-10.0 mysql-server/root_password_again password $MYSQL_PASS"
apt-get install -y mariadb-server-10.0 >> migration.log 2>&1
if [ $? -ne 0 ] ; then
  echo -e "\e[00;31m ERR\e[00m"
  exit 1
fi
echo -e "\e[00;32m OK\e[00m"

Usage: # ./script.sh SQL_ROOT_PW
Vorab als ausführbar markieren: chmod +x script.sh
Falls Fehler auftreten, „migration.log“ prüfen.

Im Notfall zurück zu MySQL

Sollte das Upgrade nicht funktionieren, kann MySQL im Notfall schnell wiederhergestellt werden. Hier eine Schritt-für-Schritt Beschreibung für ein Downgrade:

service mysql stop
apt-get remove -y mariadb-server mariadb-server-10.0
rm /var/lib/mysql/debian-*
add-apt-repository -r 'deb http://mirror.netcologne.de/mariadb/repo/10.0/debian wheezy main'
apt-get update
export DEBIAN_FRONTEND=text
apt-get install -y mysql-server

Per Cronjob E-Mail an OTRS mit mehreren X-OTRS-Header

Die letzten Tage habe ich eine Web-GUI mit PHP gescriptet, die Cronjobs erstellt, welche E-Mails an das OTRS versendet und – ganz wichtig – einige X-OTRS-Header definiert. Diese Header können verwendet werden, um dem Ticket-System verschiedene Optionen mitzuteilen. Etwa Priorität, Typ und Besitzer des Tickets.

Das Problem

Ich wollte der Einfachheit wegen nur „mail“ benutzen. Header können hier mit dem Parameter „-a“ übergeben werden. Multiple Header werden untereinander definiert:

X-OTRS-Priority: 4
X-OTRS-Lock: unlock
X-OTRS-State: closed successful
X-OTRS-ArticleType: email-internal
From: a@b.cd

Der erste erfolglose Versuch:

* * * * * mail -a "Header1\nHeader2\nHeader3" -s "Betreff" empfaenger@otrs.tld

Die „new line“ Argumente „\n“ werden vom System schlicht ignoriert und als einfacher String interpretiert.

Der zweite Versuch war im Ansatz besser:

* * * * * mail -a "`echo -e "Header1\nHeader2\nHeader3"`" -s "Betreff" empfaenger@otrs.tld

Es wurde zwar jetzt eine E-Mail versendet, der Header fehlte jedoch gänzlich.
Der Grund ist simpel: Die Syntax ist für die von Cron verwendete Shell zu komplex. In einem Script wäre das Setzen von „SHELL“ logisch.

Lösung

Variablen können im Kopf der Crontab eingetragen werden!
Hier ein vereinfachtes Beispiel, um die Logik aufzuzeigen:

Crontab ausführen, um einen Cronjob anzulegen:

crontab -e

ODER für einen anderen Benutzer im System:

su username -c "crontab -e"

Der Inhalt einer Beispiel-Crontab:

SHELL=/bin/bash
PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11
* * * * * echo "Nachricht" | mail -a "`echo -e "X-OTRS-Priority: 3\nX-OTRS-Lock: unlock\nX-OTRS-State: new\nX-OTRS-ArticleType: email-internal\nFrom: Task Planer "`" -s "WARTUNG:" empfaenger@otrs.tld

„PATH“ als Beispiel dafür, dass mehrere Variablen ebenfalls möglich sind.