Geburtstage

Inzwischen hab ich eine einigermassen gepflegte Kontaktliste, Google Contacts sei Dank. Früher hatte ich ein kleines Skript das über meine Datenbank gegangen ist und die heutigen und morgigen Geburtstage rausgesucht hat und per E-Mail verschickt hat. Hier mal die Version für Google Contacts/Calendar:

#!/bin/bash
TODAY=$(date +%Y-%m-%d) # 2010-03-30
TOMORROW=$(date --date=tomorrow +%Y-%m-%d)

TODAY2=$(echo ${TODAY} | cut -d "-" -f 2,3 )
TOMORROW2=$(echo ${TOMORROW} | cut -d "-" -f 2,3 )

YEAR=$(echo ${TODAY} | cut -d "-" -f 1 )
FOUND="false"

google calendar list --cal '.*birthday.*' --date ${TODAY},${TOMORROW} --field title | grep "^[^[]" | sed -e "s/'s birthday//g" > /tmp/file.txt
while read line; do
  LASTNAME=$(echo $line | rev | cut -d " " -f 1 | rev)
  BIRTHDAY=$(google contacts list "$LASTNAME" --fields birthday | grep "${TODAY2}\|${TOMORROW2}")
  if [ "${BIRTHDAY}" != "" ]; then
    BIRTHYEAR=$(echo ${BIRTHDAY} | cut -d "-" -f 1)
    echo "${line}: ${BIRTHDAY} -> $(( ${YEAR} - ${BIRTHYEAR} )). Geburtstag"
    FOUND="true"
  fi
done < /tmp/file.txt

if [ "${FOUND}" == "false" ]; then
  echo "no birthdays"
fi

rm /tmp/file.txt

Potthässlich, aber funktional. Man braucht dafür zwei Dinge

  1. https://code.google.com/p/googlecl/
  2. http://www.google.com/support/calendar/bin/answer.py?hl=en&answer=37098 -> More -> „Contacts‘ birthdays and events“

Wird bei mir per Cronjob aufgerufen und produziert dann beispielsweise sowas:

Peter Test: 1981-11-05 -> 29. Geburtstag
Karlheinz Mustermann: 2009-11-06 -> 1. Geburtstag

Quassel – Client vom Server aus trennen

Hatte am Wochenende wieder das Problem, dass ich einen Quassel-Cient (kennt ihr von hier) zuviel laufen hatte. Zwar kann Quassel dies ohne Probleme handhaben, nur markiert mir dieser Client das aktuelle Fenster immer als gelesen, so dass ich nix mitkrieg in diesem Channel. Aber wie trennt man den Client wenn man keinen Zugriff auf den Client-PC hat? Ganz einfach: Zuerst findet man raus, von welcher IP bzw. URL der Client sich konnektiert. In meinem Fall war das einfach

~ netstat --numeric-ports -W | grep 4242
tcp        0      0 meinserver.de:4242        derersteclient.de:1348 VERBUNDEN
tcp        0      0 meinserver.de:4242        derzweiteclient.de:53575 VERBUNDEN

dann nutzt man tcpkill. Das tötet einfach alles was an TCP/IP von diesem Host kommt. Find ich gut 🙂

~ tcpkill host derzweiteclient.de
tcpkill: listening on eth0 [derzweiteclient.de]
213.*.*.* - 212.*.*.*:50937: R 1398992140:1398992140(0) win 0
213.*.*.* - 212.*.*.*:50937: R 1398992260:1398992260(0) win 0
213.*.*.* - 212.*.*.*:50937: R 1398992500:1398992500(0) win 0
212.*.*.*:50937 - 213.*.*.*:22: R 2312272914:2312272914(0) win 0
212.*.*.*:50937 - 213.*.*.*:22: R 2312273916:2312273916(0) win 0
212.*.*.*:50937 - 213.*.*.*:22: R 2312275920:2312275920(0) win 0
CTRL^C

ACHTUNG: Man sollte tunlichst das nicht vom „derzweiteclient.de“-PC machen, weil man sich damit komplett aussperrt. tcpkill läuft solange bis man es abbricht, in der Regel reichen schon 3-5 Sekunden für Quassel zum disconnecten.

Man kann das optimieren mit der Port-Angabe, z.B.: tcpkill host derzweiteclient.de port 4242. Einfach mal bei tcpdump nachlesen was es alles für Optionen gibt.