Tag Archive: script

Debian: Non-interactive upgrade script

Oft nach gefragt, hier beantwortet: Im neuen Debian Handbook wird ein „non-interactive upgrade script“ wie folgt vorgeschlagen:

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive
yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

„force-confold“ und „force-confdef“ kombiniert gibt durchaus Sinn. So wird ein Hänger beim Upgrade definitiv verhindert. Es wird stets die aktuelle Konfiguration behalten, gibt es keine, werden die Standardwerte verwendet.

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

Tiny Tiny RSS Update Daemon INIT-Script

„Yet another Update Daemon Script“, nachdem ich nicht wirklich vernünftige gefunden habe. Die meisten töten einfach „screen“ oder PHP, wenn sie den Daemon beenden wollen. Ich habe hier eine Lösung, in der der Session-Name für „screen“ gesetzt wird und diese Session dann explizit geschlossen wird.

Script + Beschreibung

Im Prinzip ein simples INIT-Script. Über Upstart wäre es natürlich viel kleiner. Allerdings benutze ich kein Upstart (oder Systemd) auf meinem Debian Server.

#!/bin/bash
### BEGIN INIT INFO
# Provides: TT-RSS Daemon
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Start TT-RSS Daemon
### END INIT INFO

UPDATEDAEMON=/var/www/path/to/update.php
RUNAS=www-data
SESSIONNAME=tinytinyrss

case "$1" in
start)
echo "Starting Tiny Tiny RSS daemon..."
su $RUNAS -c "screen -S $SESSIONNAME -d -m php $UPDATEDAEMON --daemon"
;;

stop)
echo "Stopping Tiny Tiny RSS daemon..."
su $RUNAS -c "screen -S $SESSIONNAME -X quit"
;;

*)
echo "Fehlerhafter Aufruf"
echo "Syntax: $0 {start|stop}"
exit 1
;;

esac

Es gibt 3 Variablen am Anfang des Scripts, die vorher natürlich angepasst werden müssen. Wer sich nicht sicher ist, ob der Webserver als www-data läuft, kann das vorher schnell prüfen:

ps aux | grep -E 'nginx|httpd|apache' | grep -v root

Sieht dann z.B. (www-data) so aus:

www-data 10430  0.0  0.0  69584  3068 ?        S    13:25   0:00 nginx: worker process

In dem Fall wäre RUNAS=www-data

UPDATEDAEMON ist selbsterklärend. Das ist der Pfad zur update.php von Tiny Tiny RSS.

SESSIONNAME muss ein eindeutiger Name für die „screen“ Session sein. Der Name ist frei wählbar. Natürlich darf keine Session mit dem selben Namen existieren.

Installation

Vorab „screen“ installieren, falls das nicht schon passiert ist:

apt-get install screen

Das Script nun einfügen. „nano“ kann mit STRG+X geschlossen werden, es wird vorher gefragt, ob gespeichert werden soll (alternativ STRG+W vorab benutzen):

sudo nano /etc/init.d/ttrssd

Das Script ausführbar machen, als Dienst installieren und direkt starten:

sudo chmod +x /etc/init.d/ttrssd && update-rc.d ttrssd defaults && sudo /etc/init.d/ttrssd start

Daemon überprüfen

Ob der Daemon läuft, kann mit mehreren Methoden überprüft werden. Der einfachste Weg wäre der über TT-RSS selbst. Alternativen für die Shell:

su www-data -c "screen -ls"

oder

ps aux | grep -i [u]pdate.php