Postfix: message_size_limit pro Domain

Postfix bietet per default nur eine globale Einstellung zur Limitierung der Größe von Nachrichten. Manchmal braucht man das aber etwas granularer. Um das zu realisieren kann man „Policy-Delegation“ nutzen, wodurch Postfix Entscheidungen an einen externen Policy-Server weiterreichen kann. Siehe auch.

Um die Anforderung „message_size_limit pro Domain“ umzusetzen braucht es nicht viel – ein paar Zeilen Perl reichen:

#!/usr/bin/env perl
#
# Ein simpler Policy-Server für Postfix, der message_size_limit pro Domain
# implementiert.

use strict;

# Hier ist die Definition der Domains mit Limit (in Bytes)
my %hashConfig = (
    "marco-pc-debian.localdomain" => 75,
    "example.org" => 1024,
);

my $action;
my %attr = ();

while( <STDIN> ) {
    if( /([^=]+)=(.*)\n/ ) { 
        $attr{$1} = $2;
    } elsif( $_ eq "\n" ) { 
        $action = "action=OK";
        foreach my $domain (keys%hashConfig) {
            if( $attr{'recipient'} =~ /${domain}$/ ) {
                if( $attr{'size'} > $hashConfig{$domain} ) {
                    $action = "action=534 message size for this domain is limited to ".$hashConfig{$domain};
                }
                last;
            }
        }
        print $action."\n\n";
        exit( 0 );
    }   
}

weiterlesen

Click’n’Load mit entfernten JDownloader- oder pyLoad-Instanzen

Wer pyLoad oder JDownloader auf einem Server oder einem entfernten Gerät benutzt, wünscht sich vielleicht die Click’n’Load-Funktion, die das Hinzufügen von Links sehr einfach macht. Um sie nutzen zu können müssen 2 Dinge gemacht werden:

weiterlesen

JDownloader headless auf Debian-/Ubuntu-Server installieren (ohne Xvfb oder VNC)

Ich habe mir zu dem Zweck eine VM mit Ubuntu 16.04 installiert, natürlich eine Minimalinstallation. Als erstes sind ein paar Vorbereitungen zu treffen, wie einen dedizierten Nutzer anzulegen:

$ mkdir /opt/jdownloader
$ useradd -M -d /opt/jdownloader -s /bin/bash jdownloader
$ chown -R jdownloader:jdownloader /opt/jdownloader

Jetzt wird Java installiert (Debian-Nutzer können auch die Version 7 installieren, sofern die 8 noch nicht in den Repositories ist):

$ apt-get install openjdk-8-jre-headless

Anschließend brauchen wir den JDownloader. Ladet euch von der Download-Seite die JAR-Datei herunter (Betriebssystemauswahl: Other), und legt es in den Ordner /opt/jdownloader.

Ist das getan, kann der JDownloader das erste Mal gestartet werden. Dabei wird er sich erstmal selbst installieren und nebenbei auf Updates prüfen:

$ su - jdownloader
$ cd /opt/jdownloader
$ java -jar JDownloader.jar

Ist der Lauf durch, sollte sich der Befehl selbst beendet haben – JDownloader läuft jedoch bereits im Hintergrund weiter. Um sicher zu gehen, dass alle Updates korrekt installiert wurden, kann man den letzten Befehl noch einmal ausführen. Anschließend killt man den JDownloader:

$ ps -ef|grep JDownloader
jdownlo+  5417     1 99 13:22 pts/0    00:00:12 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java -jar JDownloader.jar -afterupdate

$ kill 5417

weiterlesen

OXID esales: mod_rewrite wird als nicht aktiv angezeigt

tl;dr: Problem war der .htaccess-Verzeichnisschutz, der verhindert, dass OXID korrekt prüfen kann, ob mod_rewrite funktioniert. Die Lösung ist den Schutz zu deaktivieren oder die Server-IP explizit zuzulassen.

Ich habe kürzlich einen OXID esales Shop installiert. An sich ist das kein Hexenwerk, allerdings gab es ein hartnäckiges Problem: mod_rewrite wurde nicht erkannt bzw. als nicht aktiv markiert. In diversen Foren liest man nur, dass man einfach im Code (!) die Prüfung deaktivieren könne. Da es mir eigentlich fern liegt, als „Laie“ an fremdem Code zu frickeln, daher habe ich das Problem mal nachvollzogen.

Der OXID-Shop überprüft das Vorhandensein von mod_rewrite auf recht kreative Art und Weise. Der zugehörige Code steht in core/oxsysrequirements.php (ctrl+f checkModRewrite) Und zwar wird folgender Request an den Server gesendet:

http://&lt;domain&gt;/oxseo.php?mod_rewrite_module_is=off

Durch eine RewriteRule, die in der mitgelieferten .htaccess-Datei steht, wird der Request aber umgeschrieben:

RewriteCond %{REQUEST_URI} oxseo\.php$
RewriteCond %{QUERY_STRING} mod_rewrite_module_is=off
RewriteRule oxseo\.php$ oxseo.php?mod_rewrite_module_is=on [L]

Das aufgerufene Skript macht dabei nichts anderes als zu prüfen, wie der übergebene Parameter lautet (also ob korrekt umgeschrieben wurde) und anschließend entweder mod_rewrite_on oder mod_rewrite_off auszugeben.

Per Hand abgesetzt brachte der Request aber die korrekte Ausgabe. Der Fehler lag also irgendwo in der Kommunikation und war schnell gefunden: Ich hatte für das Aufsetzen eine Authentifizierung per .htaccess eingerichtet. Diese funkte jetzt dazwischen und beantwortete den Request von OXID mit einem 401. Da das dort nicht abgefangen wird, geht der Shop davon aus, dass mod_rewrite nicht korrekt arbeitet. Die Lösung sah einfach aus: Zusätzlich zu der Authentifizierung per Username und Passwort darf auch der Server selbst auf sich zugreifen:

Require group oxid
Require ip &lt;IP des Servers&gt;

weiterlesen

Linux Server: Festplattenbelegung analysieren

Es gibt unter Linux viele Tools, die zur Analyse des belegten Speichers auf Dateisystemen genutzt werden können. Mit „du“ lässt sich beispielsweise der Speicherverbrauch verschiedener Verzeichnisse berechnen, mit „df“ kann man sich eine Übersicht über die Belegung der eingebundenen Dateisysteme verschaffen. Für eine detaillierte Gesamtanalyse sind sie aber nur bedingt geeignet.

weiterlesen

Plex Media Server: Init-Skript

Ich habe mir für den Plex Media Server ein Init-Skript geschrieben, was meine Anforderungen erfüllt. Es ist nicht perfekt, funktioniert aber ziemlich zuverlässig und reicht für meine Belange allemal.

Fehler oder Verbesserungsvorschläge können gern in die Kommentare geschrieben werden.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          plexmediaserver
# Required-Start:    $syslog $networking
# Required-Stop:     
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Plex Media Server
### END INIT INFO

PLEX_BIN_NAME="Plex Media Server"
PLEX_START_SCRIPT="/usr/sbin/start_pms"

[ -r /etc/default/plexmediaserver ] &amp;&amp; . /etc/default/plexmediaserver

is_running() {
	pgrep -f "${PLEX_BIN_NAME}" &gt;/dev/null
	[ $? -gt 0 ] &amp;&amp; return 1 || return 0
}

do_start() {
	if is_running; then
		echo "Plex Media Server is already running."
	else
		echo -n "Start Plex Media Server: "
		su -l ${PLEX_MEDIA_SERVER_USER} -c "${PLEX_START_SCRIPT} &amp;" &gt;/dev/null 2&gt;&amp;1
		echo "done"
	fi
}

do_stop() {
	if ! is_running; then
		echo "Plex Media Server is not running."
	else
		echo -n "Stop Plex Media Server: "
		for i in $(pgrep -f "Plex Media Server") $(pgrep -f "Plex Plug-in"); do
			kill ${i} &gt;/dev/null 2&gt;&amp;1
			if ps -p ${i} &gt;/dev/null; then sleep 1; kill -9 ${i} &gt;/dev/null 2&gt;&amp;1; fi
		done
		echo "done"
	fi
}

do_status() {
	if is_running; then
		echo "Plex Media Server is running."
	else
		echo "Plex Media Server is stopped."
	fi
}

case "$1" in
	start)
		do_start
	;;
	stop)
		do_stop
	;;
	restart)
		do_stop
		do_start
	;;
	status)
		do_status
	;;
	*)
		echo "Usage: ${0} {start|stop|restart|status}"
		exit 3
	;;
esac

weiterlesen

Linux-Server: Teamspeak installieren

Hier eine kurze Anleitung um Teamspeak auf einem Linux-Server zu installieren. Diese Anleitung ist für die meisten Distributionen gültig.

Als erstes laden wir die Server-Version von der offiziellen Seite herunter und packen Sie auf den Server und entpacken es unter /opt.

tar -C /opt -xvjf /pfad/zum/archiv/teamspeak3-server_linux_&lt;arch&gt;.tar.bz2

Ich habe das Verzeichnis der Einfachheit halber dann einfach in „teamspeak“ umbenannt.

mv /opt/teamspeak3-server* /opt/teamspeak

Anschließend erstellen wir einen User unter dem es dann laufen soll und übereignen die Daten.

useradd -M -d /opt/teamspeak teamspeak
chown -R teamspeak:teamspeak /opt/teamspeak

Teamspeak bringt von Haus aus ein recht umfangreiches Init-Skript mit. Leider kann in diesem kein User eingestellt werden, unter welchem der Dienst laufen soll, weshalb ich selbst ein minimales Startskript geschrieben habe, das als Wrapper für das vorhandene fungiert. Auf debian-basierten Systemen mit SysV-Init-System würde man also folgendes tun:

wget -O /etc/init.d/teamspeak https://raw.githubusercontent.com/misterunknown/teamspeak/master/teamspeak
update-rc.d teamspeak defaults

weiterlesen

Linux: Mehrere Source-Adressen verwenden

In manchen Situationen kann es sein, dass ein System mehrere gleichartige Adressen hat, und diese auch ausgehend benutzen soll. Hat man zu wenige Kriterien an denen man Routing und NAT direkt festmachen kann (beispielsweise Ziel-Adresse, Ziel-Port, …) kann man auch auf statistische Kriterien zurückgreifen.

Was bedeutet das konkret? In diesem Beispiel soll ein Lasttest einer Webapplikation mit siege durchgeführt werden. Unser Test-Server soll über mehrere Durchläufe Zugriffe hunderter Nutzer simulieren, während das Verhalten der Applikation beobachtet wird. Dazu ist es nötig, dass das Testsystem nicht nur mit einer IP am Loadbalancer ankommt, sondern mit vielen verschiedenen.

Dazu ist es erst einmal nötig diese IPs zu konfigurieren. In meinem Fall sind es private IPs, die an Alias-Interfaces gebunden werden:

ifconfig eth1:0 192.168.1.130 up
ifconfig eth1:1 192.168.1.131 up
ifconfig eth1:2 192.168.1.132 up

Durch die Verwendung von ifconfig wird auch direkt mit dem ersten Alias-Interface eine Route gesetzt. Ausgehende Verbindungen werden per default mit der ersten auf dem konfigurierten IP initiiert, also mit der 192.168.1.130. Bei manchen Diensten, wie beispielsweise Squid, kann man anhand bestimmter Kriterien definieren, welche Quell-IP genommen wird. siege bietet soetwas leider nicht. In so einem Fall muss der Kernel herhalten, genauer die Kernel-eigene Firewall, welche mit dem Tool iptables administriert werden kann.

iptables bietet das Modul „Statistik“, welches vom eigentlichen Netzwerkpaket unabhängige Kriterien zum Weiterverarbeiten bereitstellt. In unserem Fall wollen wir zufällig eine von den 3 uns zur Verfügung stehenden IP-Adressen auswählen. Dazu nutzen wir Source-NAT. Außerdem sollen diese Regeln nur greifen, wenn ein bestimmter Host adressiert wird (der Loadbalancer der Applikation). Dieser hat im Beispiel die IP 192.168.1.129. Man kann diese Einschränkung natürlich auch weglassen.

iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.129 -m statistic --mode random --probability 0.33 -j SNAT --to-source 192.168.1.130
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.129 -m statistic --mode random --probability 0.50 -j SNAT --to-source 192.168.1.131
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.129 -j SNAT --to-source 192.168.1.132

weiterlesen

Excel: Spalten verschieben bzw. tauschen

Screenshot
Bei gedrückter Shift-Taste lassen sich Spalten verschieben

In Excel kann man ganz einfach Spalten verschieben. Dazu muss man nur in den Kopf klicken und damit die Spalte markieren. Anschließend bewegt man die Maus an den linken oder rechten Rand der Markierung und zieht – während man die Shift-Taste gedrückt hält – die Spalte an den gewünschten Platz.

weiterlesen

Subversion: SVN Repository-Server mit Apache2

Ein Freund fragte mich kürzlich, ob ich ihm einen SVN-Server aufsetzen könne. Ich habe selbst von SVN keine Ahnung und habe auch nicht vor mich einzulesen, da ich mit git ganz fit bin. Das ist also nur eine kleine Gedankenstütze für mich.

Voraussetzungen

  • funktionierender Apache2 auf einem Linuxsystem (hier: Debian)

Zielsetzung

Ziel soll es sein, dass ein Freund sich per SSH auf meinem Server einloggen kann und dann per „svnadmin“ die Repositories erstellt. Danach kann er über den Apache-VHost svn.misterunknown.de auf diese Repos zugreifen und diese verändern. Es gibt allerlei externe Programme, die mit dem Server kommunizieren können, beispielsweise TortoiseSVN.

Vorgehen

Als erstes hab ich die SVN-Erweiterung von Apache installiert.

apt-get install libapache2-svn

Anschließend kann man sich die (auskommentierte) Default-Konfiguration mal angucken (im Apache 2.4 heißt die Datei /etc/apache2/mods-available/dav_svn.conf). Ich dort allerdings alles auskommentiert gelassen und einen frischen VHost aufgesetzt:

&lt;VirtualHost *:44
        ServerName svn.misterunknown.de
        ServerAdmin webmaster@misterunknown.de

        SSLEngine On # man sollte Verschlüsselung benutzen
        ...

        &lt;Location /&gt;
                DAV svn
                SVNParentPath /data/svn
                SVNListParentPath on

                AuthType Basic # Authentifizierung einrichten
                ...
                &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
                        Require group svn
                &lt;/LimitExcept&gt;
        &lt;/Location&gt;

        DocumentRoot /data/svn
        &lt;Directory /data/svn&gt;
                Require all granted
                AllowOverride None
        &lt;/Directory&gt;

        ... # normales Error- und Access-Log definieren
        CustomLog /var/log/apache2/vhosts/svn.misterunknown.de-svn.log "%t %u %{SVN-ACTION}e" env=SVN-ACTION
&lt;/VirtualHost&gt;

weiterlesen