Neueste Postings

Contabo und SPF

Seit wir unseren neuen Server, einen VPS bei Contabo haben, bekommen wir für angenehm wenig Geld relativ viel Leistung. Auf dem VPS betreiben wir auch einen Mailserver, der (basierend auf einem Debian) für verschiedene Domains Mails ausliefert und annimmt.

Die Tage fiel mir auf, dass einige Mails, vornehmlich solche an @gmail.com oder @live.de mit Fehlermeldungen zurückkamen:

empfaenger@gmail.com
SMTP error from remote mail server after end of data:
host gmail-smtp-in.l.google.com [2a00:1450:4013:c01::1b]:
550-5.7.1 [2a02:c200:1:10:3:0:6175:1 12] Our system has detected that this
550-5.7.1 message is likely unsolicited mail. To reduce the amount of spam sent
550-5.7.1 to Gmail, this message has been blocked. Please visit
550-5.7.1 http://support.google.com/mail/bin/answer.py?hl=en&answer=188131 for
550 5.7.1 more information. lj18si16872950wic.58 - gsmtp

In erster Instanz sah es so aus, als würden unsere Mails als SPAM klassifiziert. Die Ursachenforschung begann.

Google verwendet diverse Dienste/Protokolle, um festzustellen, ob es sich bei einer eingehenden Mail um SPAM oder normale Post handelt. Hierzu zählen z.a. DKIM und SPF. Eigentlich sollte unsere Domain SPF unterstützen und einen gültigen Record zurückliefern. Die Domain heißt „ff-holsterhausen.de“, der Mailserver identifiziert sich unter dem Namen „hora.tempus-vivit.net“ und der IP 213.136.68.159.

Die erste Anlaufstelle ist das Linux-Tool dig, mit dem man DNS-Informationen abfragen kann. Eine Abfrage auf die Domain zeigte folgendes:

user@tempus-vivit.net:# dig ff-holsterhausen.de any

; <<>> DiG 9.9.5-8-Debian <<>> ff-holsterhausen.de any
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36513
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ff-holsterhausen.de.
Weiter lesen

FHEM: Zufällige Zeit-Offsets

Möchte man sein Haus automatisieren, stehen einem ein ganzer Zoo von verschiedenen Systemen zur Verfügung: HomeMatic, FS20, EnOcean, Peha, KNX und viele mehr. Leider haben die Steuerzentralen der einzelenen Systeme eins gemeinsam: Sie können nur Komponenten des eigenen Systems ansprechen und lassen sich schlecht erweitern.

Daher hat Rudolf Koenig mit einigen anderen Entwicklern eine universelle Hausautomatisierungszentrale entwickelt: FHEM. Hiermit lassen sich, wenn man entsprechende Gateways auf die jeweiligen Funksysteme hat, beliebige Systeme anbinden.

Möchte man Rollos automatisieren, so bietet die Sunset-Funktion einen einfachen Weg, bei Sonnenuntergang die Rollos herunterzufahren. So sorgt der Befehl


define Zimmer1.Rollo.Herunter at *{sunset(0,"17:00","22:00")} set Zimmer1.Rollo off

dafür, dass das Rollo Kueche.Rollo bei Sonnenuntergang heruntergefahren wird, jedoch nicht vor 17:00 und nicht nach 22:00.

Macht man das für alle Rollos auf diesem Weg, ergibt sich jedoch ein Problem. Das ganze sieht ziemlich automatisiert aus und taugt für keine 5 Pfennig (ähh…Cent) als Anwesenheitssimulation. Man würde schließlich wenn man anwesend ist, auch nicht alle Rollos gleichzeitig herunterfahren können. Praktisch wäre ein zufälliger Offset. FHEM bietet diese Funktion leider nicht von Haus aus, aber man kann sich schnell so eine Funktion selber bauen:

# Zufälligen Offset auf Zeitstamp addieren/subtrahieren
sub
time_random_offset
{
  # Eingangs-Zeitstempel in Variable holen
  my ($timestamp) = shift;

  # Maximalen Zeitoffset (in Sekunden) in Variable speichern
  my ($maxoffset) = shift;

  # Zeitstempel in das interne Format konvertieren: 17:30:09 ==> 17.5025
  # Stunden werden als ganze Zahlen gespeichert, minuten als 1/60 und sekunden als 1/3600
  my ($t) = hms2h($timestamp);

  $t += rand()  * $maxoffset / 3600;

  # Zurück in HH:MM:SS konvertieren.
Weiter lesen

Speicher beim STM32 (Cortex-M3/Cortex-M0) sparen

In der letzten Zeit programmiere ich recht viel mit dem STM32. Dabei handelt es sich um einen Microcontroller mit ARM-v7 Kern (Cortex-M0, Cortex-M3, Cortex-M4), der sich grob im Preisniveau von AVRs bewegt, aber deutlich performanter ist. Seitens des Herstellers (ST Microelectronics) wird eine angenehm nutzbare Firmware-Library (Standard Peripherals Library) mitgeliefert, sodass man eigentlich direkt starten kann. Achsoo, GCC gibts natürlich auch als Compiler: . Das ganze wird dann unter Eclipse programmiert und mit OpenOCD debuggt.

Jetzt aber zum eigentlichen Thema. Wenn man nämlich wie von ST in den Beispielen der Firmware-Library die Peripherie initialisiert, dann sieht das in etwa so aus:

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

GPIO_InitTypeDef gpio;
gpio.GPIO_Mode = GPIO_Mode_OUT;
gpio.GPIO_OType = GPIO_OType_PP;
gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
gpio.GPIO_Speed = GPIO_Speed_Level_1;
gpio.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOC, &amp;gpio);

Zum einen ist dieser Code recht unübersichtlich, zum anderen passiert aber hier etwas, was man eigentlich gar nicht möchte. Zuerst wird nämlich auf dem Stack Speicher für die Struktur reserviert, dann im Programm Feld für Feld mit Werten gefüllt und danach an die Init-Funktion übergeben. Im Assembler sieht das übrigens so aus:

  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
 800899a:	2380      	movs	r3, #128	; 0x80
 800899c:	031b      	lsls	r3, r3, #12
 800899e:	1c18      	adds	r0, r3, #0
 80089a0:	2101      	movs	r1, #1
 80089a2:	f7fa f919 	bl	8002bd8 <RCC_AHBPeriphClockCmd>

  GPIO_InitTypeDef gpio;
  gpio.GPIO_Mode = GPIO_Mode_OUT;
 80089a6:	1c3b      	adds	r3, r7, #0
 80089a8:	2201      	movs	r2, #1
 80089aa:	711a      	strb	r2, [r3, #4]
  gpio.GPIO_OType = GPIO_OType_PP;
 80089ac:	1c3b      	adds	r3, r7, #0
 80089ae:	2200      	movs	r2, #0
 80089b0:	719a      	strb	r2, [r3, #6]
  gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
 80089b2:	1c3b      	adds	r3, r7, #0
 80089b4:	2200      	movs	r2, #0
 80089b6:	71da      	strb	r2, [r3, #7]
  gpio.GPIO_Speed = GPIO_Speed_Level_1;
 80089b8:	1c3b      	adds	r3, r7, #0
 80089ba:	2200      	movs	r2, #0
 80089bc:	715a      	strb	r2, [r3, #5]
  gpio.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_15;
 80089be:	1c3b      	adds	r3, r7, #0
 80089c0:	22c0      	movs	r2, #192	; 0xc0
 80089c2:	0212      	lsls	r2, r2, #8
 80089c4:	601a      	str	r2, [r3, #0]
  GPIO_Init(GPIOC, &gpio);
 80089c6:	4a04      	ldr	r2, [pc, #16]	; (80089d8 <DIR_Config+0x44>)
 80089c8:	1c3b      	adds	r3, r7, #0
 80089ca:	1c10      	adds	r0, r2, #0
 80089cc:	1c19      	adds	r1, r3, #0
 80089ce:	f7f9 fddb 	bl	8002588 <GPIO_Init>

Ziemlich aufwendig für ein wenig Initialisierung, die sich nie ändert, gell?… Weiter lesen

OwnCloud 8 mit Custom User Backend

Die Einsatzgebiete von OwnCloud sind vielfältig. Man kann seine Kalender synchronisieren, Dateien austauschen oder aber die Arbeit in kleinen Gruppen organisieren. In solchen Fällen hat man häufig schon eine andere Software im Einsatz, sei es ein Wiki, einen Bugtracker oder eine andere Homepage, bei der man sich anmelden muss.

Wünschenswert wäre in diesem Fall, dass man nur einen Benutzernamen und ein Passwort hat, das für alle Dienste gilt. Praktischerweise bietet OwnCloud hier mit Hausmitteln schon eine Lösung, wenn man ein paar Fallstricke beachtet.

Dieses Beispiel geht davon aus, dass bereits eine OwnCloud 7 Installation vorhanden ist und dass als Backend MySQL verwendet wird.

Schritt 1: Vorbereiten der Datenbank

Leider werden bei der Installation von OwnCloud 7 nicht alle Tabellen automatisch angelegt, die für ein Custom User Backend notwendig sind. Daher muss man die Tabelle oc_users_external anlegen:

CREATE TABLE IF NOT EXISTS `oc_users_external` (
    `backend` varchar(128) NOT NULL,
    `uid` varchar(64) NOT NULL,
    `displayname` varchar(64) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Schritt 2: Erstellen eines eigenen Backends

Im Verzeichnis apps/user_external/lib/ finden sich einige Beispiele (z.B. imap.php), die man für seine eigenen Zwecke umschreiben kann. Ein Minimalbeispiel sieht so aus (Man ersetze MYSITE durch einen eigenen Identifier)

<?php 
class OC_User_MYSITE extends \OCA\user_external\Base{
    private $host;
    public function __construct($host, $secure=false) {
        $this->host=$host;
        parent::__construct('mysite://' .
Weiter lesen

Leiterwagen-Rekonstruktion, Teil 2

Der Mittelalter-Winter ist so langsam vorbei und das Handwagenprojekt nimmt nach einigen Stunden im Keller langsam Formen an. Aber alles der Reihe nach. Nachdem im ersten Teil bereits das Buchenholz zugesägt wurde, ist es zwischenzeitlich geobelt und geschliffen worden.

Danach wurden die Leiterholme an den Enden rundgedreht, die einzelnen Leitersprossen wurden an den Enden angefräst und die Leiterholme bekamen Nuten zur Aufnahme der Sprossen.



Von da aus war es nur noch ein kleiner Schritt, die Leiterteile zusammenzubauen und so schoneinmal die Seitenwände des Leiterwagens zu haben. Nun fehlte nur noch das Fahrwerk.

Dieses habe ich heute mit tatkräftiger Unterstützung meines Sohnemanns (1 3/4 Jahre) zusammengebaut, den Aufbau montiert und eine erste Probefahrt vorgenommen. Das Ergebnis der Kinder: Hoher Spaßfaktor, gute Sicht nach vorne und hinten, viel Beinfreiheit auch für die hinten sitzenden und wenig Aufwand beim Ein- und Aussteigen.

In den nächsten Tagen muss nun noch das Holz gestrichen werden, die Verstrebungen an der Hinterachse müssen noch montiert werden und einige provisorische Schrauben müssen noch ersetzt werden.… Weiter lesen

Leiterwagen-Rekonstruktion

In den letzten anderthalb Jahren war ich einige male mit bei den Furor Normannicus Gewanderungen. Dabei wird in, nach historischem Vorbild rekonstruierter Kleidung, eine Bestimmte Stecke gewandert. Man kann dabei neue Ausrüstung einem Alltagstest unterziehen, über alte Handelsstraßen, mittelalterliche Verhüttungstechniken sowie Ackerbau im Mittelalter lernen oder einfach nur die Natur genießen.

 

Laura hat nach ihren ersten beiden Lagern auch Spaß am Thema Mittelalter bekommen und will nun unbedingt mit. Jedoch ist eine Strecke von mehr als 5km für eine 3-jährige schon ziemlich weit, besonders bei unserer Marschgeschwindigkeit. Daher habe ich mal in historischen Quellen nach Handwagen gesucht, die es in unserer dargestellten Zeit schon gab. Leider ist die Quellenlage relativ mau in der Zeit. Schaut man jedoch ein paar Jahre weiter in die Vergangenheit, so findet man auf dem Teppich von Bayeux eine hervorragende Vorlage: Einen Leiterwagen, mit dem Rüstungen, Waffen und Wein transportiert werden.

Vergleicht man dieses Bild mit Leiterwagen aus dem Zeitraum 1920-1960, stellt man eine beeindruckende Ähnlichkeit fest. Also gesagt, getan. Ebay konsultiert und dort eine ziemlich große Anzahl Leiterwagen verschiedenster Größen gefunden. Bei einem schönen Leiterwagen hab ich sogar für 80 Euro den Zuschlag bekommen. Knapp eine Woche später kam ein Paket von dem Verkäufer.… Weiter lesen

Home-Automation Sniffing

Vor einiger Zeit habe ich mir von ELV für unser Wohnzimmer Funk-Heizkörperthermostate bestellt. Zuerst habe ich die ETH comfort 100 Thermostate zusammen mit der dazugehörigen Funkfernbedienung bestellt.

Leider endeten schon die ersten Tests in einer mittleren Katastrophe. Die Soll-Temperatur lässt sich nämlich an den Thermostaten einstellen und zeitgesteuert programmieren. Diese Prozedur darf man natürlich an jedem Thermostat wiederholen…und das bei jeder Änderung der Vorgaben. Die Fernbedienung war jedoch der absolute Super-GAU. Mit Ihr ließ sich nicht wie erwartet die gewünschte Temperatur einstellen, sondern nur der Offset zu der bereits gewählten Temperatur am Thermostat. Leider konnte man auf der Fernbedienung nicht ablesen, welche Temperatur grade am Thermostat eingestellt war, sodass das ganze zu einer Art „Blinde Kuh“ Spiel mutierte. Damit nicht genug; hatte ein Thermostat die Funkübertragung nicht mitbekommen, das andere aber doch, hatten sie fortan unterschiedliche Sollwerte, die sich mit der Fernbedienung auch nicht mehr in Einklang bringen ließen. Also wurden die Geräte wieder eingetütet und zum Verursacher zurückgeschickt.

Als nächstes habe ich mir dann von ELV die anderen Thermostate des Typs FHT8xx nebst Raumregler und Türkontakt bestellt. Außerdem habe ich noch ein kleines Empfangsmodul RX868-3V dazubestellt.

Die Inbetriebnahme gestaltete sich deutlich einfacher als bei den anderen Geräten, auch wenn eines der gelieferten Thermostate direkt defekt war (µC gestorben).… Weiter lesen

Gartenbauarbeiten

In den letzten Wochen ist bei uns im Garten einiges passiert. Hier ein kleiner zeitlicher Abriss:

5. April: Verlegen der Drainage

 

10. April: Einsaht des neuen Rasens

 

24. April: Die ersten Grashalme

 

1. Mai: Die ersten Untermieter

 

30. Mai: Fertigstellung des Pumpwerks, Elektroverkablung Garage, Sand im Sandkasten sowie eine Bodenhülse

 

26. Juni: Garenbewässerung

 

27. Juni: Anlieferung des Sandkastens von Christine, Julian, Helga und Udo

 … Weiter lesen

Blaulichtquiz

Feuerwehr ist ein schönes und vor allem interessantes Hobby. Aber es hat einen Nachteil: Man muss sich unheimlich viel Faktenwissen und Zusammenhänge merken.

Steigt ein bestimmtes Gas gen Himmel oder sinkt es zu Boden und sammelt sich in Kellern??

Wie ist die Funkkennung für einen Rüstwagen?

Was ist ein AED? Kann man das essen?

Um solche Fragen zu lernen bzw. zu widerholen hab ich ein Quiz mit vielen themenbezogenen Erläuterungen und aktuell 120 Fragen aufgesetzt. So kann man in der Mittagspause oder in ruhigen 5 Minuten mal einige Fragen beantworten und seinen eigenen Fortschritt anschauen.

Wer mag, kann sich das Blaulichtquiz einmal anschauen. Zu finden ist es auf www.blaulichtquiz.de. Das Quiz ist kostenlos.… Weiter lesen