Samsung Q330 Hotkeys

Emerge app-laptop/samsung-tools (more precise app-laptop/easy-slow-down-manager) for the samsung-backlight module, or try the SAMSUNG_LAPTOP option in the staging drivers area.

Put

{
    /* Samsung Q330 */
    .matches = {
        DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
        DMI_MATCH(DMI_PRODUCT_NAME, "Q330"),
    },
    .callback = atkbd_setup_forced_release,
    .driver_data = atkbd_samsung_forced_release_keys,
}

in the /usr/src/linux/drivers/input/keyboard/atkbd.c file around line 1675. Recompile and reboot.

Use

setkeycodes e008 225
setkeycodes e009 224

to make this keys known.

Advanced DHCP Options: Pushing static routes to clients

The DHCP protocol contains several more or less options to configure the clients (e.g. PAC-Files, NTP-Servers, etc.). One of these cool options is the ability to push static routes to clients. This can be done in two different ways:

Single route

Pushing a single route is very easy. The configuration value consists of two ip address pairs in hex. The first address is the destination host, the second is the router.

Example:
Destination: 192.168.123.234 (Hex: C0:A8:7B:EA)
Router: 10.34.72.42 (Hex: 0A:22:48:2A)

The value is: C0:A8:7B:EA:0A:22:48:2A

If you configure a pfsense box, go to Services -> DHCP Server and add the value to the box "Additional BOOTP/DHCP Options". Its important to choose the type "String"!

Advanced DHCP Options: Pushing static routes to clients

Classless Static Routing

The DHCP option 121 follows a slightly different format. The format is <width of the subnetmask>:<netaddress>:<router address> (again, in hex).

Example:
Destination: 192.168.123.0 (Hex: C0:A8:7B:0)
Router: 10.34.72.42 (Hex: 0A:22:48:2A)
Subnet mask width: 24

Value: 24.192.168.123.10.34.72.42, in hex 18:C0:A8:7B:0A:22:48:2A

Advanced DHCP Options: Pushing static routes to clients

To provide multiple static routes, just concat all encoded values. According to RFC 3442, you should include the default route in the DHCP option 121, since clients are allowed to ignore the "default route" DHCP option if the server provides a value for the classless static routing option. The default route option is: 00:0A:0A:0A:02 (the routers ip is 10.10.10.2, the last 4 bytes), combined: 00:0A:0A:0A:02:18:C0:A8:7B:0A:22:48:2A.

Note: Windows systems up to Windows XP/Windows Server 2003 do not request the dhcp option 121 (they have to be tweaked manually to request this option). The linux dhcp client "dhcpcd" requests this option per default (if not, set option classless_static_routes in /etc/dhcpcd.conf).

Blogvorstellung

Heute stelle ich mal ein paar der Blogs aus dem Blogroll vor (in beliebiger Reihenfolge):

Im Bestatterweblog kann man interessante, traurige aber informative Geschichten (gerne auch in mehreren Teilen) über den Tod, Bestattungen und dem ganzen Drumherum lesen. Hin und wieder kommen erheiternde Geschichten über den Nachwuchs des Bestatters hinzu. Passend dazu das Buch "Gestatten, Bestatter: Bei uns liegen sie richtig".

Im Blog Code Inside dreht sich alles um Microsoft .NET Technologien und deren Anwendung. Immer informativ, allerdings sehr Microsoft-lastig.

Der Shopblogger schreibt aus und über einen Spar-Markt in Bremen. Neben Geschichten über Ladendiebe und Leergutautomaten gibt es hier Einblicke in das schon fast alltägliche Chaos eines (ehemals 24h)-Supermarkts.

Diego E. Pettenò schreibt über Gentoo Development, Build-Probleme und Continuous Integration (wenn er sich nicht gerade über DRM/propietäre Ebook-Reader aufregt). Nicht immer leichte Lektüre, hat aber immer Hand und Fuß.

Im Law Blog erfährt man so einiges über Stilblüten der deutschen Justiz und öfter differenzierte Kommentare und Einschätzungen zu aktuellen Themen.

Aus dem Taxi-Blog kommen herrliche Geschichten über den Alltag eines Taxifahrers in Paderborn.

Partitionstabelle clonen

Damit ich das nicht wieder vergesse:

sfdisk -d /dev/sda > layout_sda
sfdisk /dev/sdb < layout_sda

Nützliche Webseiten

Wenn man an einem Nameserver oder Mailserver schraubt, kommt man oft in die Situation testen zu müssen wie es denn von "aussen" aussieht. Hierzu ein paar nützliche Seiten:

  • IPTools.com: Verschiedene Möglichkeiten Routen, Domains, etc. zu testen
  • intoDNS: Verschiedene Tests für Nameserver
  • DNSsy: Prüft ähnlich wie intoDNS verschiedene Einstellungen von Nameservern
  • MXToolbox: Verschiedene Tests für Mailserver
  • Open Relay Test: Prüft auf verschiedene Arten ob ein Mailserver Mails von/für beliebige Adressen annimmt.

How to boot a gentoo LiveCD via PXE

Today i will show you how to boot a Gentoo LiveCD via PXE (aka network boot).

  1. Download a minimal install iso
  2. Prepare a TFTP Server
  3. Mount the ISO file as a loopback device (mount -o loop /path/to/install-x86-minimal-20100216.iso /mnt/cdrom/)
  4. Copy the Kernel (/mnt/cdrom/isolinux/gentoo) to your TFTP-Root
  5. Copy the InitramFS and the squash'ed root fs to a temp dir (/mnt/cdrom/isolinux/gentoo.igz and /mnt/cdrom/image.squashfs)
  6. Unpack the initramfs (gunzip -c gentoo.igz | cpio -idv)
  7. Patch the init script with this patch.
  8. Copy the RootFS to mnt/cdrom inside the initramfs (mkdir -p mnt/cdrom; cp image.squashfs mnt/cdrom/)
  9. Repack the initramfs (find . -print | cpio -o -H newc |gzip -9 -c - > /path/to/tftp/root/initramfs.gz)
  10. Edit your pxelinux.cfg/default file:
kernel gentoo
append initrd=initramfs.gz root=/dev/ram0 init=/linuxrc loop=/image.squashfs looptype=squashfs cdroot=1 real_root=/

Mailserver, Root-Alias und die üblichen Merkwürdigkeiten

Bevor man das nächste Mal stundenlang rumprobiert, warum der Root-Alias nicht richtig funktioniert, sollte man in die /etc/mail.rc schauen!

PXE-Boot

Ich habe mich ein wenig mit PXE-Boot und initramfs auseinander gesetzt, und ich muss sagen: das macht echt Spass!

Damit ich das nicht wieder vergesse, hier eine Step-by-Step-Anleitung wie man einen Rechner mit einem selbstgebauten Kernel und initramfs per PXE booten lässt:

Kernel-Konfiguration

Diese Konfiguration bezieht sich auf den Kernel der über das Netzwerk geladen und auf dem Client gestartet wird. Der Kernel muss alle Treiber beinhalten, die der Client zum booten und laden des initramfs braucht. Die Treiber müssen dabei einkompiliert werden; Module können zu diesem Zeitpunkt logischerweise noch nicht verwendet werden.

Die einzig wichtige Option in dem Kernel ist:

General Setup
 --> Initial RAM filesystem and RAM disk (initramfs/initrd) support (=y)

Initramfs erstellen

Für das initramfs legen wir uns ein paar Verzeichnisse an:

mkdir /usr/src/initramfs
cd /usr/src/initramfs
mkdir -p bin lib dev etc mnt/root proc root sbin sys

In dieses root-fs kopieren wir jetzt einfach alle Programme die wir in unserer initrd benötigen. Idealerweise baut man die Programme mit +static/+livecd so dass man nur das Executable kopieren muss. Falls das Ebuild das USE-Flag nicht bereitstellt, muss man entweder schauen ob das (hoffentlich vorhandene) configure-Script eine solche Option bereitstellt, oder mittels ldd <executable> herausfinden welche Dateien noch benötigt werden.

Anschliessend müssen wir nur noch das eigentliche Init-Script (PID=1) anlegen. Dieses Script wird nach dem mounten des initramfs gestartet und ist dafür verantwortlich, das neue Root zu mounten und den Init-Prozess an jemand anderen abzugeben.

#!/bin/busybox sh

# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys

# Mount the root filesystem.
mount -o ro /dev/sda1 /mnt/root

# Clean up.
umount /proc
umount /sys

# Boot the real thing.
exec switch_root /mnt/root /sbin/init

Das init-Script mountet momentan einfach /dev/sda1 und startet den normalen Init-Prozess. Sicherlich nichts wildes, aber der Fantasie sind da keine Grenzen gesetzt :) Anschliessend noch +x setzen und fertig. Das initramfs-File ist ein gzip-komprimiertes cpio-Archiv. Ein find . -print0 | cpio -ov -0 --format=newc | gzip -9 > /tmp/initramfs.cpio.gz erstellt das passende Archiv.

TFTP-Server konfigurieren

Ich habe hier als TFTP-Server net-ftp/atftp verwendet. In /etc/conf.d/atftp stellt man ein beliebiges Verzeichnis ein, das als Root des TFTP dienen soll. In diese Verzeichnis kopiert man den gebauten Kernel, das initramfs-Image und /usr/share/syslinux/pxelinux.0 (PXE Bootloader aus sys-boot/syslinux). Weiterhin legt man ein Verzeichnix pxelinux.cfg an, das die Configs für die Clients behinhalten wird. Der Bootloader sucht automatisch nach einer Datei mit seiner MAC-Adresse in dem Verzeichnis. Falls er die nicht findet, nimmt der die Datei default. Das ist ganz praktisch, da man so Client-spezifische Konfigurationen anlegen kann.

Die default-Datei beinhaltet folgendes:

prompt 0
timeout 30

label linux
menu label Freaky PXE
kernel bzImage
append initrd=initramfs.cpio.gz vga=0x307

DHCP-Server konfigurieren

Während eines PXE-Boots stellt der Client eine DHCP-Anfrage. Daher müssen wir noch dem DHCP-Server sagen, was er denn einem Client antworten soll. Für dnsmasq gibt man folgendes an:

dhcp-boot=pxelinux.0,,192.168.0.123

Dies weist den Client an von dem Server 192.168.0.123 den Bootloader in pxelinux.0 zu laden.

Durchkicken

Nun kann man den Client neustarten. Wenn man im BIOS das booten vom Netz aktiviert hat, sollte der Rechner nun vom Netz sich das initramfs holen, und danach lokal weiterbooten. Je nachdem was noch in init steht, kann man hier noch die abgefahrensten Sachen machen.

Zum weiterlesen:

How to parse a syslog logfile in python

Thanks to the incredible pyparsing module it is really easy to parse arbitrary files without the hassle of regular expressions.

The following code parses a standard syslog-ng logfile:

from pyparsing import Word, alphas, Suppress, Combine, nums, string, Optional, Regex

month = Word(string.uppercase, string.lowercase, exact=3)
integer = Word(nums)
serverDateTime = Combine(month + " " + integer + " " + integer + ":" + integer + ":" + integer)
hostname = Word(alphas + nums + "_" + "-")
daemon = Word(alphas + "/" + "-" + "_") + Optional(Suppress("[") + integer + Suppress("]")) + Suppress(":")
message = Regex(".*")
bnf = serverDateTime + hostname + daemon + message

with open('/path/to/logfile') as syslogFile:
	for line in syslogFile:
		fields = bnf.parseString(line)
		print fields

Bash-Autocompletion per PageUp

Wenn die Autocompletion in Bash per PageUp nicht mehr funktioniert, hat das i.d.R. nichts mit den X-Treibern oder der keymap zu tun: Dann wird die /etc/inputrc nicht verarbeitet.

Wenn man eine ~/.inputrc hat, dann wird die globale in /etc/ auch nicht verwendet - hier müssen also alle Befehle kopiert, oder die global angepasst werden

libvirt: Nützliche Befehle

Hier ein paar nützliche Befehle um den libvirtd in meinem neuen KVM/Qemu/libvirtd-Setup von der Console aus zu steuern (hauptsächlich für mich als Erinnerung):

virsh define <vm-xml>: Neuladen oder Hinzufügen einer VM ohne den libvirtd neustarten zu müssen
virsh undefine <vm-xml>: Entfernen einer VM ohne den libvirtd neustarten zu müssen
virsh pool-refresh <storage-name>: Neuladen eines Storage-Pools

Wenn man eine VM-Definition (=XML-Datei) kopiert muss man die uuid anpassen, da die Datei sonst nicht vom libvirtd verwendet werden kann, wenn die uuid kollidiert. Eine neue UUID kann man sich mittels uuidgen aus sys-apps/util-linux generieren.

Rsync über SSH

Um ein lokales Verzeichnis per Rsync über SSH auf einen anderen Rechner zu pusten, kann man dem rsync Kommando einen Tunnel mitgeben:

rsync -r -v -z --progress -t -e "ssh -i <YOUR-PRIVATE-KEYFILE> -l <REMOTEUSER>" 
<LOCAL-DIR> <REMOTE-USER>@<REMOTE-HOST>:<REMOTE-DIR>

MySQL: Insert or Update

INSERT INTO <tabelle> (spalte1, spalte2, spalte3) VALUES('a','b', 'c')
ON DUPLICATE KEY UPDATE spalte2='blah';

Siehe auch:

Mehrere IPs

Um mehrere IPs an eine NIC zu binden muss man in der /etc/conf.d/net folgendes eintragen:

config_ethN=(
"192.168.0.1 netmask 255.255.255.0 brd 192.168.0.255"
"192.168.0.2 netmask 255.255.255.0 brd 192.168.0.255"
"192.168.0.3 netmask 255.255.255.0 brd 192.168.0.255"
"192.168.0.4 netmask 255.255.255.0 brd 192.168.0.255"
)
routes_ethN=( "default gw 192.168.0.1" )

Dann nur noch das Netzwerkinterface neustarten und fertig.

Eclipse SVN auto keywords

In ~/.subversion/config unter

[miscellany]
enable-auto-props = yes

setzen und unter

[auto-props]
*.java = svn:eol-style=native;svn:keywords=Id 
*.php = svn:eol-style=native;svn:keywords=Id 

eintragen. Dann wird bei jedem svn add auch die Properties auf *.java gesetzt.