Python logging über den syslogd (rsyslog)

In diversen Programmen logge ich gerne unter Umständern sehr viele Daten mit. Gerade für die Fehlersuche finde ich das sehr hilfreich.
Nach verschiedenen Test ist das hier für mich bisher die beste Lösung.

Über das Python logging Module baue ich mir in jedem Programm mit folgender Funktion schnell einen Logger. Rufe ich das Programm dann mit dem Parameter -d auf, wird das Logging direkt auf das debug Level gestellt. Hier exemplarisch unter der Version 3.3:

import argparse
import logging
import logging.handlers


def create_logger():
    # parse commandline arguments
    parser = argparse.ArgumentParser()
    # define arguments
    parser.add_argument("-d", "--debug", help="Run in debug mode.", action="store_true")
    # get args
    args = parser.parse_args()

    # define logger
    my_logger = logging.getLogger('logger')

    # define log level based on commandline arguments
    if args.debug:
        my_logger.setLevel(logging.DEBUG)
    else:
        my_logger.setLevel(logging.INFO)

    # create logging handler
    handler = logging.handlers.SysLogHandler(address='/dev/log', facility=20)

    # define log format
    formatter = logging.Formatter('image_creator [%(process)s]: %(message)s')
    handler.setFormatter(formatter)

    # add handler to logger
    my_logger.addHandler(handler)
    return my_logger

logger = create_logger()
logger.info('info')
logger.warn('warn')
logger.debug('debug')
logger.error('error')

Um in Zeile 24 die facilitiy zu definieren, ist diese Tabelle sehr hilfreich:

Numerical Code Facility Description
0 kern kernel messages
1 user user-level messages
2 mail kernel messages
3 daemon system daemons
4 auth security/authorization messages
5 syslog messages generated internally by syslogd
6 lpr line printer subsystem
7 news network news subsystem
8 uucp UUCP subsystem
9 cron clock daemon
10 security security/authorization messages
11 ftp FTP daemon
12 ntp NTP subsystem
13 logaudit log audit
14 logalert log aler
15 clock clock daemon
16 local0
16 local0
16 local0 local use 0(local0)
17 local1 local use 1(local1)
18 local2 local use 2(local2)
19 local3 local use 3(local3)
20 local4 local use 4(local4)
21 local5 local use 5(local5)
21 local6 local use 6(local6)
22 local7 local use 7(local7)

Wer dann noch alles in ein extra Log schreiben möchte, kann dies über folgende Änderung in der Datei /etc/rsyslog.conf tun:

local4.*		/var/log/pylogging.log
&~

Die im Script genutzt facility sollte dann natürlich zu der in der rsyslog.conf passen. Die letzten zwei Zeichen &~ sorgen dafür, dass keine weiter Konfiguration ausgewertet wird. D.h. es wird nur in die entsprechende Datei geschrieben.

Dadurch, dass der Systemlogger genutzt wird, muss man sich keine Gedanken mehr über große Logsfiles, Archivierung etc. machen. Diese übernimmt alles der Systemlogger.

bash history and a lot of terminals

If you are using many terminals you know the problem, that the bash_history is only written after logging out. So if you want to share commands between two terminals you have to copy and paste them.

Reading the bash man page i found the PROMPT_COMMAND:

PROMPT_COMMAND
    If set, the value is executed as a command prior to issuing each primary prompt.

With this little guy it’s easy. Simple write this to your .bashrc and commands will be written directly to your history:

export PROMPT_COMMAND='history -a'

Server-"Umzug"

Dieses Wochenende habe ich mich mal wieder ein wenig mit meinem Server beschäftigt. Da der Wartungsaufwand immer mehr und die Zeit immer knapper wurde, habe ich mich entschlossen nun doch Debian zu installieren. Hinzu kam, dass die Jails (7 Stück) zum Schluss eine hohe Last erzeugt haben und der Server damit gut beschäftigt war.

D.h. aber nicht, dass ich FreeBSD nicht weiter im Auge behalten werde. Es ist nach wie vor ein cooles OS mit einer Menge interessanter Ansätzen.

Mit dem Umzug sind auch ein paar neue Features hinzugekommen:

* alle Dienste sind vollständig auch über IPv6 erreichbar
* das Zertifikat wurde erneuert und gegen eins mit mehreren “CN’s” ausgetauscht:

...
X509v3 Subject Alternative Name:
DNS:*.pcspinnt.de, othername:<unsupported>, DNS:*.pc-spinnt.de, othername:<unsupported>, DNS:*.hellmann-it.de, othername:<unsupported>
...

Geplant ist auch noch ein VPN Server, damit ich zu Hause auch echts IPv6 bekomme. Die generellen Arbeiten sollten eigentlich abgeschlossen sein…hoffe ich zumindest.

Lazy admins using the shell (third one)

Another thing i always use, is a separate file for my aliases, functions etc. I always call this file .bash_common. To use it just source it in your .bashrc:

...
. ~/.bash_common
...

This is my .bash_common: show

Older Posts:

Lazy admins… the second one
Lazy admins using the shell

Tips und Tricks zur Pfsense

Da eine neue Pfsense Version raus ist, habe ich mich mal dran gesetzt und ein paar nützliche Sachen zusammen geschrieben:

Zusätzliche Pakete installieren

/etc/rc.conf_mount_rw
setenv PKG_TMPDIR /root/    # /var ist zu klein für Paketinstallationen
pkg_add -r vim-lite
/etc/rc.conf_mount_ro

Menü beim SSH Login deaktivieren

chsh -s /bin/tcsh admin

Für das Menue habe ich mir dann einfach einen alias angelegt (~/.tcshrc):

alias menu /etc/rc.initial

Achtung: Ein ändern des Benutzers auf der Weboberfläche führt dazu, dass die shell wieder auf /etc/rc.initial gesetzt wird.

Nützliche aliase

alias menu /etc/rc.initial
alias rw /etc/rc.conf_mount_rw
alias ro /etc/rc.conf_mount_ro
alias ta tmux attach
alias ll ls -ahlt

Farben

Falls z.B.tmux nicht farbig ist, in der ~/.tcshrc folgendes eintragen:

setenv TERM xterm-256color

vim

Da in vim z.B. die Backspacetaste nicht sauber funktioniert habe ich meine ~/.vimrc wie folgt angepasst:

syntax on
set number
set expandtab
set incsearch
set nocompatible
set backspace=indent,eol,start
fixdel

UPDATE:

Paket Dateien

Ab Version 2.1 liegen aller Konfigurationsdateien, bins etc unter

/usr/pbi

History in der shell

Um die History auf der Konsole zu aktivieren muss man folgendes in die .tcshrc eintragen:

set history=200
set savehist=(200 merge)

vim tabs und spaces

Irgendwie wurden in meine python scripten alles tabs durch 4 spaces ersetzt. Ziemlich ärgerlich.
Eigentlich hatte ich erwartet das meine IDE das wieder gerade biegen kann. Aber Fehlanzeige!
Also habe ich vim rausgeholt und schnell gegoogelt wie man das wieder reparieren kann. Die Lösung ist ziemlich simpel:

:set tabstop=4        " Tablänge eingeben.
:set noexpandtab    " Benutze Tabs, keine Lspaces
:%retab!                    " Noch mal durch tabben
:wq                            " abspeichern und raus

Hacken in der Warpzone oder Wie finde ich meinen Pi?

Letztes WE war ich mal wieder seit langem in der Warpzone. Mit im Gepäck hatte ich meinen Raspberry Pi und wie jedes mal stellte sich dann die Frage: “Welche IP hat er denn nun bekommen?”
Um diese herauszufinden gibt es natürlich mehrere Möglichkeiten, wobei keine wirklich komfortabel ist. Damit ich nicht jedes mal Ewigkeiten damit verbringe die IP meinese Pi’s rauszubekommen habe ich mir ein kleines Tool geschrieben:

show

Diese Tool speichern, ausführbar machen (chmod +x …) und anschliessen in die /etc/rc.local eingetragen:

...
/usr/bin/ipmailer.py

 

Nach jedem Boot wird eine Mail versendet mit den IP Adressen der angegebenen Interfaces und zusätzlich auch noch die extern IP. Nun kann man ganz einfach per ssh und den IP Adressen aus der E-Mail auf seinen Raspberry Pi zugreifen.

UDATE:
Gerade habe ich per Twitter eine “einfache” Lösung bekommen (Danke an Fenk):

ifconfig eth0|sendxmpp user@host.de


Eine gute Anleitung zum einrichten von sendxmpp findet man sendxmpp.

Mein E-Mail Setup

Eigentlich klingt mein E-Mail Setup recht einfach: Offlineimap, Mutt, ein Notificationscript und ein Script für das Adressbuch.

Bis diese Kombination aber für mich perfekt lief, hat es mich viele Nerven und Stunden gekostet. Deshalb stelle ich hier mal meine Konfiguration vor.

Alle Script und Config Dateien liegen in meinem Github-Account.

Fangen wir mit offlineimap an:

  1. Die Datei offlineimaprc muss im Homesverzeichnis des Benutzers als .offlineimaprc abgespeichert werden.
  2. Folgende Werte in dieser Datei müssen angepasst werden: remotehost, remoteuser, remotepass, cert_fingerprint (Die anderen Werte können angepasst werden.)
    Der Zertifikatsfingerprint wird bei der ersten Benutzung angezeigt. Wenn man sich sicher ist, dass dieser stimmt kann man ihn per Copy & Paste übernehmen. Wenn man sich unsicher ist kann man ihn mit dem openssl Befehl anzeigen lassen.
  3. Zuletzt sollte noch der Ordner, der unter localfolders definiert ist angelegt werden.

Das war schon der ganze Zauber für offlinemap. Das Programm kann jetzt ganz einfach mit dem Befehl offlineimap aufgerufen wurden.

Als nächstes kommt Mutt.

Ich nutze mutt mit der Sidebar, da ich sehr viele Ordner habe und so schnell zwischen den Ordnern wechseln kann und auch direkt sehe wo ich neue E-Mails bekommen haben. Außerdem nutzte ich noch abook für die Adressbuchverwaltung. Aber dazu später mehr.

Um die Übersichtlichkeit zu wahren habe ich die Config gesplittet. Die Datei muttrc muss im Homesverzeichnis als .muttrc abgelegt werden. Alle anderen Dateien werden in einem Unterordner .mutt abgelegt und über die .muttrc eingebunden.
In der .muttrc müssen die Werte my_user, my_pass und my_mailserver angepasst werden. Andere Werte können/müssen auch noch angepasst werden (z.B. in ~/.mutt/gpg der Wert set pgp_sign_as)

Bis hierher kann man von Hand die E-Mails mit offlineimap abrufen und anschliessend in mutt lesen.

Als nächstes wollte ich ein Script, was das abrufen automatisiert und mir bei neuen Mails in bestimmten Ordnern per notify-send eine entsprechende Info schickt. Hier begann dann die fiese Bastelei und Fummelei. Letztendlich sind es aber nur ein paar Zeilen.
Die Werte FOLDERSTOCHECK, DISPLAYUSER und eventuell DISPLAY müssen angepasst werden.
Anschließend kann das ganze dann als Cronjob eingebunden werden:

 */5 * * * * DISPLAY=0 sh /home/USER/tools/mailnotify_subfolder.sh /dev/null 2>&1

Mein Adressbuch verwalte ich komplett in meinem eigenen Owncloudserver. Über eine App lasse ich mir das ganze dann zu meinem Handy syncen. Rundum eine gute Sache. Auch die E-Mail Adressen werden hiermit verwaltet.
Um diese nun in mutt nutzen zu können, habe ich mir ein Script gebaut, welches die Kontakte importiert. Hierfür nutze ich abook und den Parameter –convert.
In der Datei ~/.mutt/options wird abook eingebunden (set query_command = “abook –mutt-query ‘%s'”).
Mit der Tastenkombination STRG-t kann ich dann, wenn ich eine E-Mail schreibe die E-Mail Adresse “vervolständigen”.

Firefox with black gtk theme and input fields

If you are using firefox with an black gtk+ theme you will run into the black-on-black Problem. Firefox is going crazy and will use a black font color in black input fields. Maybe some people like that, but for me that was disturbing.

You can fix this by adding a css file (/home/USER/.mozilla/firefox/FOO.BAR/chrome/userContent.css) to your firefox profile. I had to create the chrome folder.
The file content looks like this:

input {
    -moz-appearance: none !important;
    background-color: black;
    color: white;
}

textarea {
    -moz-appearance: none !important;
    background-color: black;
    color: green;
}

Of course you can change the colors.

EDIT:

Of course you can overwrite the default background color too:

body {
        background-color: white;
}