Category Archives: Linux/BSD

RSS Feeder für pushover.net (Teil 2)

Der pushover.net Dienst begeistert mich immer noch und ich habe das RSS Script um ein Channel Management erweitert. Somit lassen sich jetzt die Channel in der Datenbank speichern und man muss nicht mehr für jeden Feed einen Cronjob starten.

Das Script kann man wieder über github beziehen und dafür braucht man rss2pushover.db und rss2pushover.pl. Um einen neuen Channel hinzuzufügen muss dieser in der Datenbank gespeichert sein. Dieses kann man folgendermaßen machen:

sqlite> INSERT INTO channel (status, url, token, user) VALUES (1,$FEED_URL,$PUSH_TOKEN,$PUSH_USER);

Über den Status kann man einstellen ob der Channel aktiv (1) oder deaktiviert (0) is. Die Url ist die des RSS Feeds und Token sowie User sind von pushover für die Applikation. Anschließend kann man das Script einfach wie gewohnt starten und erhält die Push Nachrichten.

Beispiel Screenshot:

Pushover

RSS Feeder für pushover.net (Teil 1)

UPDATE: Bessere Version gibt es jetzt mit Channel Managment.

Als ich auf Android umgestiegen bin musste ich auf meine selbst geschriebenen Apps für Blackberry verzichten. Für vieles gibt es eine Android App, aber z.B. für Exbir gibt es auch nicht mal diese. Eigentlich wollte ich mir wieder meinen eigenen Pushdienst für Android aufbauen, aber momentan fehlt dafür einfach die Zeit.

Dann bin ich auf pushover.net gestoßen. Ein Dienst der einen Push Gateway anbietet und eine Android/iOS app die diese empfängt. Die App kostet 3.66 EUR und diese sind einmalig und es entstehen keine monatlichen Kosten. Ich finde das ist eine ziemlich geniale Idee, weil wer will sich schon monatlich binden. Für die Anbieter ist das auch angenehm und ich denke das diese eine Mischrechnung haben, denn viele werden die App vielleicht nicht lange benutzen.

Wenn man sich registriert hat, muss man eine Applikation erstellen und erhält einen API Key für diese. Im Monat hat man 7,500 Nachrichten inklusive und für ein paar private kleine sachen sollte das Problemlos ausreichen – pro Applikation. Man kann sich natürlich mehrere erstellen ;)

Wie bekomme ich also meine Nachrichten auf die App? Natürlich über die API und diese ist sehr einfach gehalten. Ein einfacher POST Request mit User Key und Privaten Token. Auf der Homepage findet man Beispiele von curl bis Ruby. Das Einbinden von diesem hat keine 10 Minuten gedauert und ich kann mir schon verschiedene Einsatzmöglichkeiten vorstellen. So kann man unnötige Emails loswerden und sein Postfach schonen.

Das rss2pushover Script auf Github ermöglicht es einen RSS feed zu parsen und neue Einträge per pushover.net auf ein Endgerät pushen. Dabei wird eine kleine Datenbank eingesetzt um zu prüfen ob Einträge bereits verarbeitet wurden. Somit erhält man keine doppelten Nachrichten.

Beim Pushen der Nachrichten hat man mehrere Optionen angeben wie z.B. Sound, Wichtigkeit, Link etc.

Push Beispiel:


# send item to pushover.net
my $response = LWP::UserAgent->new()->post(
	"https://api.pushover.net/1/messages.json", [
	"token" => $PUSH_TOKEN,
	"user" => $PUSH_USER,
	"message" => $description,
	"title" => $title,
	"url" => $link,
	"url_title" => $title
]);

if ($response->is_success) {
	# push accepted
} else {
	# push not accepted
}

Einfacher kann man es nicht mehr machen. Bis jetzt sind die Nachrichten immer direkt und ohne merkbare Verzögerung angekommen. Mal schauen wo man das noch überall einbauen kann :)

dmesg mit Zeitangabe

Die dmesg Zeitangaben sind nicht wirklich zu lesen, aber manchmal braucht man sie dann doch eben. So einfach ist es dann doch wieder nicht:

# perl -e 'openf,"/proc/uptime";=~/\s/;$x=time-$`;for(qx{dmesg}){s/^\[\s*([\d.]+)\]\s+//;@t=(localtime($x+$1))[5,4,3,2,1,0];$t[0]+=1900;$t[1]+=1;printf"[%04d-%02d-%02d%02d:%02d:%02d] %s",@t,$_}'

MtGox Trader

Nachdem MtGox jetzt endgültig tot ist kann ich auch endlich mal meinen Trading Bot veröffentlichen. Eigentlich wollte ich das schon früher machen, aber bin noch nicht dazu gekommen.
Der Bot handelt nur wenn es auch einen Gewinn abwirft und somit kann man eigentlich nichts verlieren. Dadurch ist er natürlich sehr sehr langsam und meistens habe ich nur einen Trade pro Tag hinbekommen, aber dafür mit Gewinn.

Die Konfiguration ist nicht ganz einfach, weil man die sqlite Datenbank einmal per Hand befüllen muss. Wenn man Bitcoins kaufen will, muss man einen Eintrag in die Tabelle “sold” mit der Anzahl der Bitcoins und eines Preises füllen. Der Preis bestimmt wie niedrig der Preis des nächsten kaufes sein muss. Abhängig je nachdem wie hoch man die Gewinnschwelle einstellt.

Den Code gibt es auf github.com.

Wer nicht immer auf Logfiles lesen steht – es gibt auch ein kleines mini Webinterface dass die letzten Transkationen anzeigt und einen Graphen mit pchart erstellt.

Nagios check_disk wrapper für PHP

Manchmal muss man auch mal die Disk durch einen einfachen HTTP request abfragen. Warum also nicht bestehende Scripte, wie das Nagios Plugin check_disk dafür verwenden. Anbei ein kleines Script, dass genau dieses macht. Eine kleine Einschränkung, der HTTP Response Code ist bei Warning und Critial der gleiche – natürlich leicht zu erweitern ;)

<?php

// global binary
$NAGIOS_DISK = "/usr/lib/nagios/plugins/check_disk";
$DISK_KEY = "Uvg2kFMfy3DU";

if (isset($_GET['key'], $_GET['w'], $_GET['c'])) {
	// okay
	$key = $_GET['key'];
	$warning = $_GET['w'];
	$critical = $_GET['c'];

	if(! (preg_match('/^[0-9]+%$/', $warning) && preg_match('/^[0-9]+%$/', $critical)) ) {
		echo "Critical or Warning values are not a valid value.\n";
		header("HTTP/1.0 510 Not Extended");
		exit;
	}

	if ($key == $DISK_KEY ) {
		// correct key

		$return = shell_exec("$NAGIOS_DISK -l -x /dev/shm -w $warning -c $critical");

		if (stripos($return,"OK")) {
			print "$return\n";
			header("HTTP/1.0 200 Okay");
		} else {
			print "$return\n";
			header("HTTP/1.0 507 Insufficient Storage");
		}

	} else {
		print "ERROR\n";
		header("HTTP/1.0 401 Unauthorized");
	}

} else {
	// error
	print "ERROR\n";
	header("HTTP/1.0 418 I’m a teapot");
}

?>

Android und OpenVPN

Auf einem aktuellen Android (4.x) einen OpenVPN Client einzurichten ist dank OpenVPN for Android auch kein Problem mehr. Einfach die App installieren und man könnte eigentlich schon fast loslegen, wenn man auch einen OpenVPN Server hätte.

Die Jungs von Tinfoil Security haben sich ein paar Minuten hingesetzt und haben ein sicheres Script geschrieben, dass einen Server in Minuten aufsetzt. Dieses ist zwar nur für Debian basierte Systeme geeignet, aber das sollten die meisten sein die man mal so hat. Notfalls kann man sich schnell ein Droplet bei DigitalOcean, etc. einrichten.
Das Script muss man als root ausführen und es erstellt die Server und Client Konfiguration, sowie das Zertifikat. Anschließend muss man nur noch /etc/openvpn/client.ovpn sicher (nein nicht per Email!) auf sein Android laden und man kann sich per ipv4 sicher in öffentlichen Netzen herumtreiben. Happy VPN!

Offene SSH Verbindungen anzeigen

Wow! Ich glaube das ich den Blog ein bisschen vernachlässigt habe. Es sind schon ein paar Monate vergangen seitdem ich das letzte mal etwas geschrieben habe, aber natürlich war ich in der IT nicht untätig. Bin jedoch seit ein paar Wochen kein Blackberry jünger, sondern ein Android Evangelist geworden und bin mit dem Nexus 5 super zufrieden.

In den vergangenen Monaten habe ich selber natürlich in vielen Blogs und Seiten gelesen und dabei recherchiert. So viele Leute beteiligen sich am Open Source und so will ich auch mal wieder was der Community zurückgeben – so gut es geht.

Fangen wir mal etwas klein an und als erstes gibt es ein Script das ganz einfach offene SSH Verbindungen anzeigt und man sich somit schnell auf einen Server einloggen kann. Das ist sehr Hilfreich, wenn man auf vielen Server unterwegs ist und deren DNS oder IP man nicht immer im Kopf hat. Leider hatte ich noch nicht die Lust das Script “IPv6 ready” zu machen, aber vielleicht findet sich da ja jemand ;)

Update: Das Script kann jetzt ordentlich mit v6 umgehen und auch Optionen der SSH Verbindung. Läuft wunderbar unter Linux und MacOSX.

Update 2: noch besser: https://github.com/bert2002/ossh

Blackberry BB10 Webworks SDK auf Linux

Bisher musste ich immer ein Windows oder MacOSX dafür missbrauchen meine Blackberry Applikationen zu bauen, aber das wird sich für BB10 sehr schnell ändern. Das BB10 Webworks SDK wird zwar nicht offiziell unterstützt, aber badtoyz ist es gelungen, relativ einfach, das SDK auf Linux zu portieren.

Was brauchen wir?

  • Java
  • Signing Keys (entweder von einer alten Installation oder über das Native SDK erstellbar)
  • BB10 Webworks SDK von badtoyz

Falls man seine Singin Keys von einer vorherigen Installation benutzen will, benötigt man ein paar Dateien: yourkeyname.p12, barsigner.csk and barsigner.db. Die befinden sich, je nach Betriebssystem, an unterschiedlichen stellen:

  • Windows® XP:  %HOMEPATH%\Local Settings\Application Data\Research In Motion
  • Windows Vista® and Windows 7®:  %HOMEPATH%\AppData\Local\Research In Motion
  • Mac OS:  ~/Library/Research In Motion

Die Keys kopieren wir nach: ~/.rim/ Wenn jedoch das Native SDK benutzt werden soll,brauchen wir nach Erhalt der Keys diese noch aktivieren:

blackberry-signer -register -csjpin PIN -storepass KeystorePassword AppSigningCSJFile DebugTokenCSJFile

Als nächstes brauchen wir das SDK und das bekommen wir am besten direkt über guthub:

$ git clone https://github.com/badtoyz/BB10-WebWorks-SDK-Linux.git
Cloning into ‘BB10-WebWorks-SDK-Linux’…
remote: Counting objects: 527, done.
remote: Compressing objects: 100% (413/413), done.
remote: Total 527 (delta 65), reused 525 (delta 63)
Receiving objects: 100% (527/527), 10.54 MiB | 887 KiB/s, done.
Resolving deltas: 100% (65/65), done.

Über git kann man dann auch das SDK aktuell halten und ich empfehle jedem @bbdevlinux und @badtoyz zu folgen um auf dem aktuellen Stand zu bleiben.

Jetzt haben wir das BB10 Webworks SDK auf Linux und können direkt die erste Applikationen bauen. Ich habe dazu die bbui.js samples genommen:

bbwp samples.zip -g KeyStorePassword -buildID number -o /path/to/folder

So einfach ist das und da fragt man sich doch warum RIM das nicht selber unterstützt…

GIT auf Low-End Server

Wenn man auf einem System mit wenig Arbeitsspeicher, aber einem großen Repo arbeite kann es beim pushen von dem git zu Speicherproblemen kommen. Als Abhilfe ist es möglich dem git einen Limit für der verbrauch vom Speicher zu setzen.

$ git push master
user@example.orge’s password:
Counting objects: 139, done.
Delta compression using up to 2 threads.
error: pack-objects died of signal 9
error: pack-objects died with strange error
[…]

Lösung:

$ git config –global pack.windowMemory “32m”
$ git config –global pack.SizeLimit “32m”
$ git config –global pack.threads “1”

WordPress XMLRCP API

Ich glaube die WordPress API ist einer der am wenigsten dokumentierten API die ich jemals gesehen habe. Deswegen gibt es jetzt ein Beispiel um in Perl ein Bild hochzuladen, einen Post zu erstellen mit Categories, Custom Fields und einem Featured Image.

#!/usr/bin/perl
# script: publish article to a wordpress blog using XMLRPC interface. Uploading a picture and setting this as a featured image. Additionally add custom fields.
# author: <bert2002>
use strict;
use utf8;
use XMLRPC::Lite;
use IO::Socket::SSL;
my ($buf,$contents);
my $pictureid;
my @categories;
# settings
my $username = “USERNAME”;
my $password = “PASWORT”;
my $server = “https://www.yourblog.com/xmlrpc.php”;
my $image = “PATHtoIMAGE”
my $htmlpost = “THErealCONTENT”;
# upload picture to wordpress
open(FILE, “$image”) or die “$!”;
while (read(FILE, $buf, 60*57)) {
        $contents .= $buf;
}
close(FILE);
my $res = XMLRPC::Lite
->proxy($server)
->call(‘metaWeblog.newMediaObject’, 1, $username, $password,
{ name => $image, type => ‘image/jpeg’, bits => $contents } )
->result;
if (defined ($res)) {
$pictureid = $res->{id};
print “. picture uploaded with id $pictureid\n”;
} else {
        print ” .. uploading picture failed: $!”;
}
# post article to wordpress
my $publishdate = “20100220T12:34:56”;
# prepare categories
my $multicategories = “cat1 cat2 cat3”;
@categories = split(/ /, $multicategories);
# finally create that fucking post
my $res = XMLRPC::Lite
->proxy($server)
->call(‘metaWeblog.newPost’, 1, $username, $password,
{
        categories => \@categories,
        custom_fields => [
                { “key” => “keyone”, “value” => “value one” },
                { “key” => “keytwo”, “value” => “value two” }
        ],
        description => $htmlpost,
        title => $productname,
# dateCreated => $publishdate,
        mt_allow_comments => 0,
        wp_post_thumbnail => $pictureid,
}, 1)->result;
if (defined ($res)) {
        print “. posted article id $res and picture id $pictureid\n”;
} else {
        print “.. posting article with id $res failed: $!”;
}
 oder auf gist.github.com

Raspberry Pi + Squid + Block Ads

Machen wir in meiner kleinen Pi Serie weiter. Auf normalen Desktop Computern hat man eigentlich immer AdBlock im Browser aktiviert um lästige Werbung loszuwerden. Auf den “neuen” Geräten wie Smartphone oder Tablet sind diese nicht verfügbar und man muss einen kleinen Umweg gehen.

Was bietet sich also nicht eher an als einen Proxy aufzusetzen und unerwünschten Inhalt zu filtern? Zensur im eigenen Netzwerk, basierent auf der Anleitung von calomel.org! Dank an pgl.yoyo.org gibt es eine ordentliche Liste die auch noch immer aktualisiert wird. Man kann sich die Liste in mehrere Formate ausgeben lassen und die Domains/IPs auch gerne per iptables sperren. Ich gehe den Weg des Proxies, weil zum Beispiel mein Blackberry Playbook kein IPv6 kann (ARGH!) (muss nur im Wlan Profil aktiviert werden) und ich durch den Proxy wenigstens sekundär v6 benutzen kann. Also erstmal Squid3 installieren, weil Squid2 kein v6 kann:

# apt-get install squid3

In der Konfiguration /etc/squid3/squid.conf müssen wir folgenden Eintrag hinzufügen. Dieser muss vor allen anderen acl Einträgen stehen (ungefähr Zeile: 693) und sieht folgendermaßen aus:

acl ads dstdom_regex "/etc/squid3/ad_block.txt"
http_access deny ads

Damit haben wir Squid gesagt, dass es allen Zugriff auf die Domains in der txt Datei sperren soll. Die Liste der zu sperrenden Domains erhalten wir durch einen Cronjob den wir uns schreiben:

#!/bin/bash
# script: update ad server list
# get new ad server list
wget -q -t 5 'http://pgl.yoyo.org/adservers/serverlist.php?hostformat=squid-dstdom-regex&showintro=0&mimetype=plaintext' -O /etc/squid3/ad_block.txt

# refresh squid /usr/sbin/squid3 -k reconfigure

Das Script speichern wir unter /etc/squid3/fetch_adserver.sh. Es lädt sich die Liste herunter und Squid wird dazu gezwungen die Liste neu einzulesen. Ein einfacher Cronjob führt das Script alle drei Tage aus:

35   5    *   *   */3 /etc/squid3/fetch_adserver.sh >> /dev/null 2>&1

Erstmalig das Script per Hand ausführen und die Datei erstellen. Squid wird automatisch neu geladen und schon kann man surfen. Ach auf dem Playbook macht es wieder mehr Spaß :)

Vorher:

Nachher:

Damit man nicht zu viele Fehlermeldungen vom Squid im Browser sieht, sollte man noch die Datei ” /usr/share/squid3/errors/English/ERR_ACCESS_DENIED” bearbeiten und die Fehlermeldungen entfernen. Dabei sollte man den Inhalt einfach durch ein “<a>” ersetzen.