Category Archives: Linux/BSD

Javascript: Multilingual

Wenn man eine Seite oder Applikation für mehrere Sprachen zur Verfügung stellen will braucht man Bausteine. Hier und Jetzt ganz einfach:

 var language = {
 	"en": {
 		bla: "Englisch"
 	},
 	"de": {
 		bla: "Deutsch"
 	}
 };

var lang = "en";
var text = language[lang];
alert(text.bla);
Das lag schon länger als Draft herum, aber ein Devblog Eintrag hat es wieder zum Vorscheinen gebracht.

Bonding unter Debian/Ubuntu

Damit wir bonding benutzen können müssen wir “ifenslave” installieren und danach können wir schon mit der Konfiguration loslegen.

Als erstes müssen wir festlegen welche Art von Bonding wir benutzen wollen. Ich benutze dafür “active-backup”. Das heist nur ein interface ist Aktiv. Damit wir das nicht nach jedem Boot machen müssen legen wir das beim laden des Modules fest

cat /etc/modprobe.d/aliases.conf
alias bond0 bonding
options bonding mode=1 miimon=10

Jetzt müssen wir nur noch unserer physikalischen Interfaces in /etc/network/interfaces konfigurieren:

auto bond0
iface bond0 inet static
        pre-up modprobe bond0
        address 192.168.1.10
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        dns-nameservers 192.168.1.1
        up      ifenslave    bond0 eth0 eth1
        down    ifenslave -d bond0 eth0 eth1

Und Fertig! Man muss keine Konfiguration für die Netzwerkinterfaces vornehmen welche benutzt werden.

Raspberry Pi + Archlinux

Vergangene Woche wurde ich ein glücklicher Besitzer eines Raspberry Pi. Ich war relative überrascht als ich die Versandbestätigung bekam – natürlich im positiven. Als erstes war ich sehr von der größe des kleinen überrascht. Der Pi ist wirklich nicht viel größer als eine Kreditkarte und sieht ordentlich kompakt aus. An RS habe ich inklusive Versand genau 39,89 EUR bezahlt. Der Preis ist unschlagbar jedoch braucht man noch eine SD Karte + Power. Als SD Karte habe ich mich für eine 16GB Transcend Class 10 entschieden. Als Stromlieferant kann fast jedes MicroUSB Ladegerät benutzt werden.

Als Betriebssystem habe ich mir für mein Haus-OS Archlinux entschieden. Das Image kann man sich bei Raspberry Pi direkt von der Homepage herunterladen. Ein aufspielen des Images geht problemlos mit dd:

# dd bs=1M if=archlinuxarm-29-04-2012.img of=/dev/sde

Wobei /dev/sde die angeschlossene SD Karte ist. Das Image ist für eine zwei Gigabyte große Karte. Deswegen müssen wir das Image noch anpassen. Dies können wir Problemlos mit fdisk erledigen:

# fdisk /dev/sde + p + d + 2 + n + p + 2 + (start der zweiten partition von der ersten ausgabe) + <enter> + w

# resize2fs /dev/sde2

Somit hat man schon die Partition angepasst. Wenn man möchte kann man sich noch eine swap Datei anlegen und sie einbinden. Das war auch schon die Installation von dem OS und man kann beginnen mit dem Pi zu spielen…

Git Repository Erstellen

Die meisten Projekte fangen meistens mit einer guten Idee an und man fängt drauf los zu arbeiten. Sobald das Projekt ein paar Monate alt ist und man vielleicht dem einen oder anderen darüber erzählt hat, wollen mehr mitarbeiten. Dann stellt sich die Frage wie stellt man den anderen die Daten zur Verfügung damit jeder immer aktuell ist und ungestört arbeiten kann. Mit einer Versionskontrolle wie GIT geht das Wunderbar. Jetzt muss man nur seine lokalen Daten auf einen für alle erreichbaren Server zur Verfügung stellen. Mit ein paar Befehlen kann man ein lokales Repository erstellen, seine Daten hinzufügen und auf einen entfernten Server ablegen.

Server:

cd /home/ordner/pfad/zum/repo.git
git --bare init

Lokal:

git init
git add *
git commit -m "first"
git config --global user.email "meine.email@example.org"
git config --global user.name "Mein Name"
git remote add master ssh://name@example.org/home/ordner/pfad/zum/repo.git
git push master master
git push master

Als erstes muss auf dem Server ein Repository erstellt werden, damit wir unsere Daten auch ablegen können. Ich benutze hier als Protokoll SSH. Jetzt kann man glücklich drauf los commit’en und alle sind glücklich…

Blackberry Playbook und Linux

Damit man auf die SMB Freigabe auf dem Playbook unter Linux zugreifen kann muss man ein bisschen was machen. Als erstes müssen wir auf dem Playbook die Datenfreigabe aktivieren:

Settings -> Storage & Sharing -> USB Connections -> Connect to Mac

Dann muss man noch “File Sharing” und “Password Protect” aktivieren und ein Passwort vergeben. Dann können wir auch schon das Playbook per USB verbinden. Mittels “ifconfig -a” sollten wir jetzt ein usb0 Gerät sehen:

usb0: flags=4098<BROADCAST,MULTICAST>  mtu 1500  metric 1
ether XX:XX:XX:XX:XX:XX  txqueuelen 1000  (Ethernet)
RX packets 0  bytes 0 (0.0 B)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 0  bytes 0 (0.0 B)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ein Gerät ohne IP hilft uns nicht wirklich, also lassen wir dhcpd die Arbeit machen:

[root@host ~]# dhcpcd usb0
dhcpcd[9533]: version 5.2.12 starting
dhcpcd[9533]: usb0: rebinding lease of 169.254.91.114
dhcpcd[9533]: usb0: NAK: from 169.254.74.157
dhcpcd[9533]: usb0: broadcasting for a lease
dhcpcd[9533]: usb0: offered 169.254.74.158 from 169.254.74.157
dhcpcd[9533]: usb0: acknowledged 169.254.74.158 from 169.254.74.157
dhcpcd[9533]: usb0: checking for 169.254.74.158
dhcpcd[9533]: usb0: leased 169.254.74.158 for 43200 seconds
dhcpcd[9575]: usb0: usb0: MTU set to 1500
dhcpcd[9533]: forked to background, child pid 9590

usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500  metric 1
inet 169.254.74.158  netmask 255.255.255.252  broadcast 169.254.74.159
inet6 XXXX::XXXX:XXXX:XXXX:XXXX  prefixlen 64  scopeid 0x20<link>
ether XX:XX:XX:XX:XX:XX  txqueuelen 1000  (Ethernet)
RX packets 71  bytes 12014 (11.7 KiB)
RX errors 0  dropped 0  overruns 0  frame 0
TX packets 16  bytes 1880 (1.8 KiB)
TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Das “mini subnet” das wir bekommen ändert sich jedes mal. Das muss man beachten wenn man ein Script schreibt. Nachdem wir jetzt eine IP haben können wir die Freigabe mounten:

mount -t cifs -o username=playbook,password=XXX,rw //169.254.74.157/media /mnt/playbook

XXX spiegelt das Passwort wieder welches wir auf dem Playbook festgelegt haben. Und vola wir können Daten kopieren.

Ich habe mir ein kleines Script geschrieben das mir die Arbeit abnimmt. Download: playbook

WordPress und mod_status

Wenn man WordPress mit einer schönen .htaccess benutzt, dann hat man vermutlich so etwas:

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

Dabei wird dank der RewriteBase alles umgeschrieben (was man in dem Fall will) und es gibt keine Möglichkeit auf /server-status zuzugreifen. Damit dies möglich ist muss man eine weitere Bedingung einbauen:

RewriteCond %{REQUEST_URI} !=/server-status

Sobald dies eingetragen ist, kann man auf /server-status zugreifen. Auf das Problem kommt man wenn man ein 404 bekommt, wenn man auf den Status zugreifen will (obwohl Modul und Zugriffsrechte gegeben sind).

Amazon KDP Reporting Script

Das Amazon KDP Portal bietet leider keine Möglichkeit Reports per Email zu bekommen. Das ist ein bisschen Umständlich und manchmal will man die Umsätze per Email bekommen. Amazon berechnet die “Royalities” immer erst am Sonntag und so braucht man sich unter der Woche keine Sorgen zu machen. Ich habe mir ein kleines Perl script geschrieben das mir jeden Sonntag eine Email schickt mit meinen neu errechneten Umsätzen aus dem US Geschäft. Leider habe ich noch keinen Weg gefunden um auf die Umsätze für den Britischen und Deutschen Shop zuzugreifen, aber vielleicht findet jemand anderes einen Weg.

#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;
use HTML::TokeParser;
use HTTP::Cookies;

# KDP credentials
my $email = “myemail\@example.org”;
my $password = “awesomepassword”;

# Mail Settings
my $from = “\”KDP Report\” <kdp\@example.org>”;
my $to = “$email”;
my $subject = “KDP Royalities Report (US)”;

my $agent = WWW::Mechanize->new();
$agent->agent_alias( ‘Linux Mozilla’ );
$agent->get(“https://kdp.amazon.com/self-publishing/signin/ap”);
$agent->field(“email”, $email);
$agent->field(“password”, $password);
$agent->click();
$agent->follow_link( text => ‘Reports’ );

$agent->get(‘https://kdp.amazon.com/self-publishing/reports/transactionSummary’);
my $response =  $agent->{content};

if ($response =~ m{.*Total: (.*)<\\\/div>.*}g) {

my $grandtotal = “$1”;
my $message = “Your revenue for the past six weeks of the Amazon KDP US store is $grandtotal.\n”;

# sending email
my $sendmail = ‘/usr/lib/sendmail’;
open(MAIL, “|$sendmail -oi -t”);
print MAIL “From: $from\n”;
print MAIL “To: $to\n”;
print MAIL “Subject: $subject\n\n”;
print MAIL “$message\n”;
close(MAIL);

}

Es ist gleichermaßen ein kleines Beispiel wie man WWW::Mechanize benutzen kann. Das Script kann man sich nun auf einen sicheren Server packen und mittels Cron am Sonntag früh ausführen lassen. Ich hoffe natürlich das Amazon sein Reporting demnächst ausbaut, damit man nicht so eklige Scripte braucht.

Versteck mich – Eine VM im RAM

Ich möchte für meinen Mitbewohner ein Geburtstagsgeschenk kaufen, aber leider hackt er immer meinen Computer und würde so erfahren was er bekommt. Wie gehen wir also sicher das er nichts erfährt? Wir kaufen das Geschenk in einem Laden oder wir starten eine VMWare in unserem Arbeitsspeicher. Dafür brauchen wir nur /dev/shm/ und eine unschuldige virtuelle Maschine. Diese kopieren wir nach /dev/shm/ , starten sie, bestellen das Geschenk und danach überschreiben wir wieder die benutzte VM mit der unschuldigen VMware in /dev/shm/. Jetzt sollte es außerordentlich schwer sein an die Daten zu gelangen und falls ein Teil der VMWare auf die SWAP geschrieben wurde  – wird es nicht leichter.

Ubuntu mirror mit debmirror

Manchmal ist es sehr hilfreich wenn man einen eigenen Ubuntu mirror im Netzwerk hat. Mit dem Programm debmirror ist das auch nicht mehr schwierig und ist in ein paar Schritten erledigt. Bei ubuntuusers.de ist so gut wie alles beschrieben, aber leider fehlt das die GPG keys als “trusted” hinzugefügt werden müssen.

Fangen wir also an den User und die Gruppe anzulegen und wechseln zu dem User:

sudo bash
aptitude install debmirror ubuntu-keyring
groupadd mirror
useradd -g mirror  -c “Ubuntu Mirror” mirror
su – mirror
mkdir -p ~/scripts ~/ubuntu ~/ubuntu-security ~/ubuntu-updates
cd ~/scripts

Jetzt können wir die Scripte erstellen die zum aktualisieren des Mirrors verantworlich sind. Es ist möglich sie von ubuntuusers.de zu nehmen und muss nur den Pfad des Mirrors ändern. Zum Beispiel:

#!/bin/bash
#
# Spiegelt die Haupt-Ubuntu-Repostiories
#
logger -t mirror-ubuntu.bash[$$] Updating Ubuntu
debmirror /home/mirror/ubuntu –passive –progress –nosource \
–host=ftp.inf.tu-dresden.de –root=os/linux/dists/ubuntu
–dist=hardy,lucid \
–section=multiverse,universe,restricted,main –arch=amd64 –cleanup
\
–verbose
logger -t mirror-ubuntu.bash[$$] Finished Updating Ubuntu

Bei dem oben beschriebenen Script wird ein mirror für hardy und lucid erstellt. Die Architektur ist 64bit (amd64). Es ist also nicht nötig für jeden Release ein Mirror zu erstellen. Falls man einen eigenen dns eintrag für den Mirror erstellen möchte reicht eine sehr einfache apache Konfiguration:

NameVirtualHost mirror.example.org:80
<VirtualHost mirror.example.org:80>

DocumentRoot /home/mirror/
ServerName mirror.example.org

Alias /mirror/ “/home/mirror/”

<Directory “/home/mirror/”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
</Directory>

</VirtualHost>

Als user mirror müssen wir noch den GPG keyring als trustedkeys einbinden. Ansonsten können wir den Mirror nicht updaten.

gpg –no-default-keyring –keyring trustedkeys.gpg –import /usr/share/keyrings/ubuntu-archive-keyring.gpg

Zum Schluss tragen wir noch ein paar cronjobs (user: mirror) ein und der Mirror wird jede Nacht aktualisiert.

crontab -e

und fügen folgendes hinzu:

0 1 * * * bash -l -c “/home/mirror/scripts/mirror-ubuntu.bash”

Das war es auch schon. Zum testen und initialisieren des Mirros lohnt es sich das Script einmal per Hand auszuführen.

Der /etc/apt/sources.list des Clients kann dann zum Beispiel wie folgt aktualisiert werden:

deb http://mirror.example.org/mirror/ubuntu lucid universe multiverse main restricted

Fertig. Pro Mirror können schon mehr als 60GB zusammen kommen. Also Vorsichtig!

Debian Installation auf einer Seagate FreeAgent DockStar

Durch Zufall wurde ich auf die DockStar aufmerksam geworden und habe mir direkt eine bestellt. Findigen Leuten ist es nämlich gelungen Linux auf das kleine Gerät zum laufen zu bekommen. Das Geniale an dem Gerät ist das es nur 26EUR kostet und nur 8Watt verbraucht.

CPU & RAM Übersicht (aus der busybox):

-bash-3.2# cat /proc/cpuinfo
Processor       : ARM926EJ-S rev 1 (v5l)
BogoMIPS        : 1192.75
Features        : swp half thumb fastmult edsp
CPU implementer : 0x56
CPU architecture: 5TE
CPU variant     : 0x2
CPU part        : 0x131
CPU revision    : 1
Cache type      : write-back
Cache clean     : cp15 c7 ops
Cache lockdown  : format C
Cache format    : Harvard
I size          : 16384
I assoc         : 4
I line length   : 32
I sets          : 128
D size          : 16384
D assoc         : 4
D line length   : 32
D sets          : 128

Hardware        : Feroceon-KW
Revision        : 0000
Serial          : 0000000000000000
-bash-3.2# free
total         used         free       shared      buffers
Mem:       126064       123488         2576            0          104
Swap:            0            0            0
Total:       126064       123488         2576

Wir können das Linux nicht direkt auf dem Gerät Installieren sondern auf einem USB Stick oder externe Festplatte. Zum testen benutze ich hier einen 4GB USB Stick. Das Wichtigste ist dass das Gerät NIEMALS vorher mit dem Internet in Kontakt war. Es gibt auch verschiedene Anleitungen. Ich habe beide benutzt ;)

NOTE: So wie es aussieht hat Jeff es geschafft Debian auf das NAND zu installieren! Das probiere ich demnächst aus.

Als erstes müssen wir die Dockstar mit einem Computer verbinden und die IP des Gerätes heraus finden:

root@host ~ # ifconfig eth0 169.254.1.0
root@host ~ # nmap -e eth0 -sP 169.254.0.0/16

Danach melden wir uns mit folgenden Daten per ssh an:

user: root
password: stxadmin

Ab jetzt streiten sich die Geister was gemacht werden soll. Ich habe mich dazu entschieden die Pogo Software zu Beenden damit wir den Knilch an unser normales Netzwerk verbinden können.

-bash-3.2# killall hbwd
-bash-3.2# mount -o remount,rw /
-bash-3.2# chmod go+w /dev/null
-bash-3.2# vi /etc/init.d/rcS

folgendes kommentieren damit es wie folgt aussieht:

#/etc/init.d/hbmgr.sh start

Jetzt können wir das Gerät ausschalten und an unser normales Netzwerk anschliessen:

-bash-3.2# mount -o remount,ro /
-bash-3.2# /sbin/halt

Bevor wir weiter machen können muessen wir einen USB Stick vorbereiten auf dem wir Debian Installieren können. Dabei muss beachtet werden das die erste Partition die root Partition wird und die zweite die Swap.

Partition 1, primaer, Typ Linux, min. 280MB, Typisch 512MB
Partition 2, primaer, Typ Swap,  ~100-500MB (je groesser, desto besser fuer das Wear Leveling des Sticks)

Nachdem die DockStar von unserem DHCP (in unserem “nomalen” Netz”) eine IP bekommen hat können wir uns wieder mit der Box verbinden und anfangen Debian Installieren mit Hilfe einem Script von Jeff Dozan:

-bash-3.2#  cd /tmp
-bash-3.2# wget http://jeff.doozan.com/debian/dockstar.debian-squeeze.sh
-bash-3.2# chmod +x dockstar.debian-squeeze.sh
-bash-3.2# export PATH=$PATH:/usr/sbin:/sbin
-bash-3.2# ./dockstar.debian-squeeze.sh

Das wird ein bisschen dauern und danach ist Debian Squeeze und ein neuer Bootloader Installiert :D Bei der Einrichtung kann man getrost der Anleitung von mikrocontroller.net folgen. So schnell kann man einen kleinen 24/7 Server mit 4 USB Ports und einem 1GB RJ45 Anschluss haben mit nur 8Watt (inklusive Platten) verbrauch.

Twitter::Lite und OAuth

Wie manche früher oder später *hust* mitbekommen haben erlaubt Twitter jetzt nur noch OAuth als Authentifizierungsverfahren. Ich war in letzter Zeit irgendwie sehr beschäftigt und habe es erst gestern gemerkt. Also musste ich mein rss2twitter script auf OAuth umstellen und dabei hat bayashi sehr geholfen. Im großen und ganzen geht das sehr einfach und hier gibt es das Script zum Nachlesen:

#!/usr/bin/perl
# script: Using the latest RSS entry to update Twitter

use strict;
use warnings;
use Net::Twitter::Lite;
use LWP::Simple;
use XML::RSS::Parser::Lite;
use WWW::Shorten::Metamark;

my $feed = get(‘http://dailywadoku.itbert.de/feed.rss’);
my $rp = new XML::RSS::Parser::Lite;

$rp->parse($feed);

my $it = $rp->get(0);

my $long_url = $it->get(‘url’);
my $short_url = makeashorterlink($long_url);
my $message = $it->get(‘description’);

$message =~ s/^.+ – //; # remove dash seperator.
$message =~ s/^\s+//; # Nuke any leading space; every char counts.
$message =~ s/\s+$//; # Nuke any trailing space; every char counts.
$message =~ s/[_]+$//; # Nuke any trailing underscores; happens when message is short.

$message = substr $message , 0 , 116; # Twitter can only handle 140 chars.
$message .= ‘ -> ‘; # Append ellipse to denote further content available.
$message .= $short_url; # Append the shortened URL.

# get in http://dev.twitter.com/apps/XXXXXX
my %CONSUMER_TOKENS = (
consumer_key    => ‘** CONSUMER_KEY **’,
consumer_secret => ‘** CONSUMER_SECRET **’,);

# get in http://dev.twitter.com/apps/XXXXXX/my_token
my $ACCESS_TOKEN        = ‘** ACCESS_TOKEN **’;
my $ACCESS_TOKEN_SECRET = ‘** ACCESS_TOKEN_SECRET **’;

my $t = Net::Twitter::Lite->new(%CONSUMER_TOKENS);
$t->access_token($ACCESS_TOKEN);
$t->access_token_secret($ACCESS_TOKEN_SECRET);
my $status = $t->update($message);

So Sachen wie ** CONSUMER_KEY ** müssen natürlich ersetzt werden und sind hier nur Platzhalter.