Archiv des Autors: oliwel

NBS Betongleise

Nachdem es leider noch immer keine „fertige“ Lösung für Betonschwellengleise für „Pickelfahrer“ gibt, habe ich mich nun auch versucht einfach meine K-Gleise anzumalen.

Bei der Farbe handelt es sich um HEKI Straßenfarbe „Beton“, der Schotter ist von Spurenwelten – das reine Kalkweiß welches ich zunächst bestellt hatte, hat mir nicht gefallen so daß ich nun ca 10% dunklen Porphyr beigemischt und bin damit ganz zufrieden.

Das Tunnelportal im Hintergrund ist der einspurige Bogen der Faller ICE Portale 120562, leider hat der Heißkleber etwas zuviel Hitze mitgebracht und die Kunststofffoile leicht verformt 🙂

Der Bahnhofsvorplatz entsteht

Der Bahnhofsvorplatz ist nun nach dem E-BW und der Umgebung der Bahnhofsausfahrt mit dem Stellwerk die nächste Baustelle. Die vergangenen Wochen waren vom Misserfolg mit verschiedenen Kombiationen von Trittschalldämmung, Gipsmasse und Prägerollern „geprägt“, die aktuelle Version ist zwar auch bei Weitem nicht perfekt aber ich habe mich entschieden einfach mal weiter zu machen – die grauen Flächen sind aus „Fimo Air“, das Muster mit einem Prägeroller aufgebracht und alles mit diversen Acrylfarben behandelt. Die Risse sind leider beim Trocknen der Knetmasse entstanden – sieht irgendwie genauso kaputt aus wie bei uns auf dem Dorf 😉

Das kleine grüne Dreieck ist 2,5mm und 6mm Gras von Noch das ich zunächst auf einem Pappkarton aufgebracht und dann eingeklebt habe. Die Einfassung für den Baum ist mein erster eigenen 3D Druck – ein „Torus“ mit 24 Seiten – der „Dreck“ im Inneren fehlt noch, da ich den Baum erst befestigen werde, wenn die Bereiche dahinter fertig sind.

Blick aus der Vogelperspektive, der Baum fehlt hier, oben rechts soll ein kleiner Park mit einer Trauerweide in der Mitte entstehen. Das Gleis dahinter ist aufgelassen, ohne Anschluß und daher auch auf den Laufflächen verrostet….

Der Eingangsbereich vor der Haupthalle besteht aus 1mm Heki Konstruktionsplatten – ebenfalls mit einem Prägeroller behandelt, der finale Anstrich steht noch aus.

Blick auf den „Kreisel“ ohne Baum und den frischen Bodenbelag des Parks: Klopapier/Weißleim mit brauner Abtönfarbe und „Earth Blend“ von Woodland Scenics.

Der Zustand letzte Woche: noch ohne das Gleis, den Park und die Treppenaufgänge und Grünstreifen.

Weiterlesen

Seilbahn

Stellprobe für eine Seilbahn – geplant ist hier eine Brawa Hahnenkammbahn, die Gäste vom Bahnhof zum (nicht im Bild) befindlichen Aussichtspavillion bringt.

Lebkuchen – geschüttelt, nicht gerührt

Zutaten (für ein Backblech)

  • 350g Mehl
  • 300g Zucker
  • 150g kandierte Früchte
  • 100g gemahlene Haselnüsse
  • 3 TL Lebkuchengewürz
  • 1 TL Nelkenpulver
  • 1 EL Vanillezucker
  • 1 Pkg Backpulver
  • 250ml Milch
  • 150g Butter
  • 2 EL Honig
  • 4 Eier

Zubereitung

  1. Die trockenen Zutaten in einer großen Schüssel vermischen
  2. Milch, Butter (flüßig), Honig und Eier in einer eigenen Schüssel verrühren und zu den restlichen Zutaten geben
  3. auf ein Backblech verteilen, bei 200 Grad ca. 20 Minuten backen
  4. noch warmen Teig in Stücke schneiden

Kreislaufprobleme auf der Neubaustrecke

Ich hatte das mal so geplant, aber im so langsam einsetzenden Spielbetrieb fehlt mir nun doch eine Möglichkeit auch auf der Neubaustrecke „ordentlich“ im Kreis zu fahren. Nach zwei Wochenenden abschätzen und rumtüfteln wird dieses „Kreislauproblem“ nun mit einem Bypass behoben 🙂

Hier braucht es zwar keine OP am offenen Herzen, aber Spähne gab es genug – der Bogen der bereits bestehenden Abfahrt in den Schattenbahnhof wird auf 70cm Länge nach hinten verschoben damit die neu gebaute Auffahrt am oberen Schattenbahnhof vorbei Platz hat.

Die neue Auffahrt erlaubt nun eine kreuzungsfreie Rundfahrt auf dem inneren Gleis der NBS sowie einen direkten Wechsel in dieser Fahrtrichtung auf den oberen Rundkurs und (wenn dort nichts fährt) auch eine „acht“.

U-Bahn

Nachdem ich nun schon mehr als einmal nach dem Gleisplan gefragt wurde, möchte ich hier nun auch den unterirdischen Teil der Anlage nocheinmal vorstellen.

Im Vordergrund befindet sich ein 12-gleisiger Schattenbahnhof der von rechts nach links durchfahren wird. Die Ausfahrt geht über eine Gleiswendel (hellblau) nach oben. Nach einer 3/4 Drehung zweigt einen weiterhin unterirdische Trasse nach rechts ab (gelb) und verläuft über dem SBH nach oben und geht in das innere Gleis der blauen Paradestrecke über. Nach einer weiteren 3/4 Drehung zweigt eine zweigleisige Rampe ab (hellgrün), die an der hinteren Plattenkante nach oben führt und dort in den Rundkurs des Bahnhofs übergeht. Nach einer weiteren 1/4 Drehung kreuzt die Strecke unter dem Bahnhof und geht unten links in das äußere Gleis der Paradestrecke über.

Parallel zu diese Auffahrten laufen die Abfahrten der jeweiligen Gegenrichtung, diese „treffen“ sich unter dem Bahnhof und verlaufen dann im oberen Anlagenteil als eingleisige Rampe in Richtung rechte Anlagenseite (hellblau). Nach einer 90 Grad Kurve zweigen dann die Einfahrten in den SBH in die vier Bündel mit je 3 Gleisen ab (rosa).

Der Bahnhof im mittleren Anlagenteil ist ein klassischer „Hundeknochen“ mit je zwei Gleisen als Mini-SBH von dem aus eine Überfahrt in die Paradestrecke möglich ist.

Nachdem die Einrichtung der Pendelstrecke auf der Nebenbahn (orange) so gut lief und das Stumpfgleis vorne rechts irgendwie blöd aussah habe ich dieses nun in eine zweite Nebenbahnstrecke verwandelt. Hier soll künftig mein guter alter roter Schienebus einen Haltepunkt anfahren und anschliessend im Mini-SBH verschwinden.

Aus einem Erbfall im Bekanntenkreis durfte ich die Anlage „plündern“, darunter waren unter anderem einige Industriegebäude die ich sehr schön fand. Der „Werkzeuglagerplatz (siehe Titelbild)“ mußte also einer Stellprobe weichen und es folgte mal wieder eine Umplanung des Industriegebietes. Der neue Gleisverlauf ist bereits auf dem Plan oben zu sehen – von rechts kommend, an der Anhöhe entlang, zieht sich die Zufahrt, hinter dem ersten Gebäude zweigt ein Ladegleis ab das Schuppen in der Bildmitte enden soll. Auf selber Höhe fächert sich die Zufahrt dann auf in ein Lokgleis, ein Ladegleis zum Steinbruch (hinten links zu erkennen) und zwei Ladegleisen, die am Ladeschuppen links vor dem Brückepfeiler enden sollen, auf.

Der Bau der Gleisanlagen muss leider noch ein wenig warten bis der darunterliegende Schattenbahnhof fertig verkabelt ist….

SRS / DKIM per qmail-remote wrapper Script

Ohne SPF/SRS und DKIM ist es inzwischen fast unmöglich Mail an Google oder GMX zu senden. Support für SRS soll im nächsten sqmail Release nativ kommen aber nachdem ich für DKIM sowieso einen Wrapper brauchte habe ich gleich beides integiert. Das nachfolgende Script wird an die Stelle des Original qmail-remote binary kopiert.

Ich DKIM nutze ich nur EINEN Schlüssel für alle Domains und SRS verwendet anstatt der Originaldomain ebenfalls eine systemweite Domain weil es einfacher war das dem vorgeschalteten Spam-Filter beizubringen.

#!/usr/bin/perl 
#
# Based on dkimsign.pl written by Jason Long, jlong@messiah.edu.

use strict;
use warnings;

use Net::DNS;
use Data::Dumper;
use Mail::SRS;
use Mail::DKIM::Signer;
use Mail::DKIM::TextWrap;
use Pod::Usage;
use File::Temp;
use Log::Log4perl qw(:easy);
my $expiration;
my $identity;

my @args = @ARGV;

Log::Log4perl->easy_init( { level => $INFO,
                            file    => ">>/tmp/qmail-remote.log" } );
 
# check if sender is from a local domain
my $sender = $args[1] || '';
#my ($nn, $domain) = $sender =~ m{ \@([\w-]+\.)*([\w-]+\.[\w-]+) \z}xms;
my $local;
my $domain = '';
($local, $domain) = split /\@/, $sender;

eval{
DEBUG("Sender is $sender - Domain is $domain");
if (!is_local_domain($domain)) {
    # Not a local domain -> add srs but not for postmaster
    if ($sender =~ /^postmaster\@/) {
        DEBUG("Remote postmaster address $sender");
        $domain = "";
    } elsif(need_spf($domain)) {
        $domain = "serverpilot.net";
        my $srs = new Mail::SRS( Secret  => "ReplaceMe" );
        # sender is second argument in @args
        $args[1] = $srs->forward($sender, 'mail@srs.serverpilot.net');
        INFO("SRS $sender -> " . $args[1]);
    }
}

my $cmd;
my $fh_msg = new File::Temp();
my $fh_head; # must be defined here to avoid early deletion of tempfile
# disables DKIM for forwarded postmaster mail 
if (!$domain) {
    DEBUG("No DKIM");
    while ()
    {
        print $fh_msg $_;
    }
    $cmd = "/var/qmail/bin/qmail-remote.orig @ARGV < $fh_msg";
} else {
    my $dkim = new Mail::DKIM::Signer(
        Policy => \&signer_policy,
        Algorithm => 'rsa-sha1',
        Method => 'relaxed',
        Selector => 'serverpilot',
        KeyFile => "/var/qmail/dkim/rsa.private",
    );

    while ()
    {
        print $fh_msg $_;
        {
            chomp $_;
            s/\015?$/\015\012/s;
        }
    $dkim->PRINT($_);
    } 

    $dkim->CLOSE;

    $fh_head = new File::Temp();
    my $dkim_sig = $dkim->signature->as_string;
    $dkim_sig =~ s{\r}{}gxms;
    print $fh_head $dkim_sig . "\n";
    close $fh_head;
    INFO("DKIM added for $sender");
    DEBUG("DKIM Sig: " . $dkim_sig );

    $cmd = "cat $fh_head $fh_msg | /var/qmail/bin/qmail-remote.orig @args";
}

die "Error handling message" unless($cmd);
system($cmd) && die "DKIM Error ($cmd)";
};

if ($@) {
    die "Z$@";
}

sub signer_policy
{
    my $dkim = shift;

    use Mail::DKIM::DkSignature;

    $dkim->domain($domain);

    my $sig = Mail::DKIM::Signature->new(
            Algorithm => $dkim->algorithm,
            Method => $dkim->method,
            Headers => $dkim->headers,
            Domain => $dkim->domain,
            Selector => $dkim->selector,
            defined($expiration) ? (Expiration => time() + $expiration) : (),
            defined($identity) ? (Identity => $identity) : (),
        );
    $dkim->add_signature($sig);
    return;
}

sub is_local_domain {

    my $domain  = shift || '';
return 1;
    return unless ($domain);

    $domain =~ s/\./\\./;
    my $pattern = '\A\+'.$domain.'-';

    open(my $users, "    my $found = 0;
    while (<$users>) {
        if ($_ =~ qr/$pattern/) {
            $found = 1;
            last;
        }
    }
    close $users;
    return $found;
}


sub need_spf {

    my $domain  = shift || '';

    # fail safe
    return 1 unless ($domain);

    my $res = Net::DNS::Resolver->new(
        tcp_timeout => 2,
        udp_timeout => 2,
    );
    my $reply = $res->search( $domain, "TXT");
    if (!$reply) {
        WARN('DNS Query failed for domain ' . $domain);
 DEBUG('DNS Error: ' . $res->errorstring);
        return 1;
    }
       
    my $need_srs = 0;
    foreach my $rr ($reply->answer) {
        if ($rr->can('txtdata')) {
            if ($rr->txtdata =~ /\Av=spf/) {
 DEBUG('SPF Record found ' . $rr->txtdata);

                # if rackport is in spf record stop checks - its ok
 return 0 if ($rr->txtdata =~ /spf\.rackport\.net/);
 
 # non rackport spf record found, so srs is needed
                $need_srs = 1;
            }
        }
    }
    return $need_srs;

}

__END__

Um die SRS Rückläufer wieder an den Originalempfänger zuzustellen, wird für die SRS Domain ein .qmail-default Eintrag angelegt der alle eingehenden Mails an ein Maildrop Filter weiterleitet (| maildrop ~vpopmail/etc/mailfilter.srs-reverse ).
Das Filterscript stellt die Mails per qmail-inject zu bzw. schiebt diese in eine Sammelmailbox falls das SRS Decoding schief geht:

NEWRCPT=/usr/local/sbin/srsr.pl $EXT
if ($NEWRCPT) {
to "| /var/qmail/bin/qmail-inject $NEWRCPT"
}
to "/var/vpopmail/domains/5/srs.serverpilot.net/bounces"

Das SRS Script selber verwendet wieder Mail::SRS:

#!/usr/bin/perl

use strict;
use Mail::SRS;

my $rcpt = shift || '';
eval {
    my $srs = new Mail::SRS( Secret  => "SRSSecret" );
    print $srs->reverse($rcpt.'@srs.serverpilot.net');
} if ($rcpt =~ /\ASRS/);
# Do not handle non SRS Mail

vpopmail

Vpopmail ist zwar auch schon steinalt und etwas „rostig“ aber es funktioniert noch immer 😉
Die Quellen gibt es auf Sourceforge zum Download: https://sourceforge.net/projects/vpopmail/

# Benutzer und Gruppe anlegen
groupadd -g 89 vpopmail
useradd -g vpopmail -u 89 vpopmail

# Da ich ein Altsystem mit Bestand migriere benötige ich einen abweichenden Verzeichnisnamen für das Maildir:
sed -i -e 's|Maildir|.maildir|g' \
      vchkpw.c vconvert.c vdelivermail.c \
      vpopbull.c vpopmail.c vqmaillocal.c \
      vuserinfo.c maildirquota.c || die

# Konfigurieren
./configure\
--enable-auth-module=mysql\
--enable-sql-logging\
--enable-valias\
--enable-mysql-limits\
--enable-qmaildir=/var/qmail\
--enable-qmail-newu=/var/qmail/bin/qmail-newu\
--enable-qmail-inject=/var/qmail/bin/qmail-inject\
--enable-qmail-newmrh=/var/qmail/bin/qmail-newmrh\
--enable-vpopuser=vpopmail\
--enable-vpopgroup=vpopmail\
--enable-file-locking\
--enable-md5-passwords\
--enable-logging\
--enable-auth-logging\
--enable-log-name=vpopmail\
--enable-qmail-ext\
--disable-tcpserver-file\
--disable-roaming-users\
--disable-clear-passwd\
--enable-libdir=/usr/lib\
--enable-domainquotas\
--disable-users-big-dir

# Die lokale Mailzustellung soll per dovecot-lda erfolgen - das ginge zwar auch über alias Einträge und/oder maildrop, geht aber auch über einen kleinen Trick nativ aus vdelivermail und reduziert dabei auch noch die Prozessanzahl.
echo '
#define MAILDROP 1
#define MAILDROP_PROG "-f /usr/lib/dovecot/dovecot-lda -d $EXT@$HOST"
' >> config.h

# Jetzt noch bauen und installieren
make && make install

# Da wir eine mysql Datenbank als Backend benutzen wollen, müssen wir nun noch die SQL Zugangsdaten in der Datei /home/vpopmail/etc/vpopmail.mysql eintragen. Der User muß zumindest zum Start das Recht haben Tabellen anzulegen.

# Jetzt Domain und User anlegen und eine Testmail senden
vadddomain -r acme.test
vadduser -r mail@acme.test
echo "Hallo" | /var/qmail/bin/sendmail  -v mail@acme.test

# Die Mail sollte nun unter /home/vpopmail/domains/acme.test/mail/.maildir ankommen