add more files
authorJoerg Jaspert <joerg@debian.org>
Sun, 3 Mar 2013 19:58:29 +0000 (20:58 +0100)
committerJoerg Jaspert <joerg@debian.org>
Sun, 3 Mar 2013 19:58:29 +0000 (20:58 +0100)
.dotfiles/host:gkar/.reminders [new file with mode: 0644]
.dotfiles/host:gkar/bin/echolon [new file with mode: 0755]
.dotfiles/host:gkar/bin/train.sh [new file with mode: 0755]
.publish.cfg [new symlink]
bin/dnslint [new file with mode: 0755]
bin/gpgget [new file with mode: 0755]
bin/lexi [new file with mode: 0755]
bin/nils [new file with mode: 0755]
bin/org-git-sync.sh [new file with mode: 0755]
bin/publish [new file with mode: 0755]
bin/tm [new file with mode: 0755]

diff --git a/.dotfiles/host:gkar/.reminders b/.dotfiles/host:gkar/.reminders
new file mode 100644 (file)
index 0000000..72d4777
--- /dev/null
@@ -0,0 +1,325 @@
+BANNER REMINDERS FOR [today()]
+SET $LatDeg 9
+SET $LatMin 40
+SET $LatSec 0
+SET $LongDeg 50
+SET $LongMin 33
+SET $LongSec 0
+
+RUN OFF
+
+######################################
+# Symbolic constants for weekdays... #
+######################################
+SET Monday    1
+SET Tuesday   2
+SET Wednesday 3
+SET Thursday  4
+SET Friday    5
+SET Saturday  6
+SET Sunday    7
+
+SET Mon 1
+SET Tue 2
+SET Wed 3
+SET Thu 4
+SET Fri 5
+SET Sat 6
+SET Sun 7
+
+#########################################
+# Symbolic constants for month names... #
+#########################################
+SET Jan 1
+SET Feb 2
+SET Mar 3
+SET Apr 4
+SET May 5
+SET Jun 6
+SET Jul 7
+SET Aug 8
+SET Sep 9
+SET Oct 10
+SET Nov 11
+SET Dec 12
+
+SET January   1
+SET February  2
+SET March     3
+SET April     4
+SET May       5
+SET June      6
+SET July      7
+SET August    8
+SET September 9
+SET October   10
+SET November  11
+SET December  12
+
+###########################################################
+# Other symbolic constants and functions for "pasting"... #
+###########################################################
+SET Quote CHAR(34)
+
+# Handy constants/function for specifing week of month...
+SET  Week_1              1
+SET  Week_2              8
+SET  Week_3             15
+SET  Week_4             22
+FSET _last(mo)          "1 " + MON((mo%12)+1)+" --7"
+
+# Shorthand for commonly used expression...
+FSET _trig()            TRIGGER(TRIGDATE())
+
+# Handy function to provide SCANFROM dates...
+FSET _back(days)        TRIGGER(TODAY()-days)
+
+#################################################################
+# Function which removes a single leading zero from a string... #
+#################################################################
+FSET _no_lz(s) IIF(SUBSTR(s, 1, 1)=="0", SUBSTR(s, 2), s)
+
+#################################################################
+# Return the length of the daylight/night portion of a date,    #
+# in minutes.                                                   #
+#################################################################
+FSET _light_len(date) MAX(SUNSET(date)-SUNRISE(date), 0)
+FSET _dark_len(date) 1440-_light_len(date)
+
+FSET monthsince(y,m) 12*(year(trigdate())-y) + monnum(trigdate())-m
+FSET yearsince(y) year(trigdate())-y
+
+; simple countdown to a date
+FSET _vacdays() coerce("STRING", trigdate()-today()) + plural((trigdate()-today()), " day")
+FSET vacdays2(day) coerce("STRING", day-today()) + plural((day-today()), " day")
+
+############################################################
+# Function to calculate number of years since a given year #
+# or number of months since a given month and year...      #
+############################################################
+
+FSET _yr_num(yr)                ORD(YEAR(TRIGDATE()) - yr)
+FSET _mo_num(mo, yr)            ORD(12 * (YEAR(TRIGDATE()) - yr) + MONNUM(TRIGDATE()) - mo)
+
+
+##################################################################################
+
+##########################################################################
+#                                                                        #
+# This contains sample ANSI escape sequences for coloring messages.      #
+# It should work on an IBM PC with the ANSI.SYS driver, and on           #
+# other terminals which use the ANSI sequences.                          #
+#                                                                        #
+##########################################################################
+# Colors - use Nrm to reset to normal text.
+SET Esc   CHAR(27)
+
+SET Nrm   Esc + "[0m"
+SET Blk   Esc + "[0;30m"
+SET Red   Esc + "[0;31m"
+SET Grn   Esc + "[0;32m"
+SET Ylw   Esc + "[0;33m"
+SET Blu   Esc + "[0;34m"
+SET Mag   Esc + "[0;35m"
+SET Cyn   Esc + "[0;36m"
+SET Wht   Esc + "[0;37m"
+SET Gry   Esc + "[30;1m"
+SET BrRed Esc + "[31;1m"
+SET BrGrn Esc + "[32;1m"
+SET BrYlw Esc + "[33;1m"
+SET BrBlu Esc + "[34;1m"
+SET BrMag Esc + "[35;1m"
+SET BrCyn Esc + "[36;1m"
+SET BrWht Esc + "[37;1m"
+
+
+; prettify the sunrise/sunset/moon data
+fset _srtd() coerce("STRING", _no_lz(_am_pm(sunrise(today()))))
+fset _sstd() coerce("STRING", _no_lz(_am_pm(sunset(today()))))
+fset _srtm() coerce("STRING", _no_lz(_am_pm(sunrise(today()+1))))
+fset _sstm() coerce("STRING", _no_lz(_am_pm(sunset(today()+1))))
+MSG Sunrise at [sunrise(trigdate())], sunset at [sunset(trigdate())], next full moon at [moontime(2)] on [moondate(2)]%
+
+########################################################################
+########################################################################
+# Events follow here                                                   #
+########################################################################
+########################################################################
+
+REM [trigger(moondate(0))] MSG New moon
+REM [trigger(moondate(1))] MSG First quarter moon
+REM [trigger(moondate(2))] MSG Full moon
+REM [trigger(moondate(3))] MSG Third quarter moon
+
+# Familie
+REM 12 December ++3 AT 12:00 +15 *5 MSG Geburtstag Esther
+REM 5 March ++3 AT 12:00 +15 *5 MSG Geburtstag Mutter
+# Geburtstag Lea-Marie
+REM 6 Nov ++20 MSG %"[BrRed]Lea-Marie[Nrm]'s [BrBlu][_yr_num(2008)][Nrm] birthday%" is %b.
+REM 6 MSG [BrRed]Lea-Maries[Nrm]'s [BrBlu][_mo_num(11, 2008)][Nrm] 'monthly' anniversary
+
+# Pei-Hua
+REM 3 Jun ++20 MSG %"[BrRed]Pei-Hua[Nrm]'s [BrBlu][_yr_num(1981)][Nrm] birthday%" is %b.
+REM 3 MSG [BrRed]Pei-Hua[Nrm]'s [BrBlu][_mo_num(6, 1981)][Nrm] 'monthly' anniversary
+
+# Nils
+REM 2 May ++20 MSG %"[BrRed]Nils[Nrm]'s [BrBlu][_yr_num(2008)][Nrm] birthday%" is %b.
+REM 2 MSG [BrRed]Nils[Nrm]'s [BrBlu][_mo_num(5, 2012)][Nrm] 'monthly' anniversary
+
+
+
+# SPI
+# REM 20 May 2009 *14 AT 22:00 +15 MSG SPI Board Meeting
+
+# Debian
+#REM July 16 2009 +200 MSG [_vacdays()] left until DebCamp, [vacdays2(date(2009,07,23))] left until DebConf!%"%"%
+
+# Taiwan
+#REM April 28 2010 +200 MSG [_vacdays()] left until Taiwan, [vacdays2(date(2010,04,29))] left until arrival!%"%"%
+
+# Geburtstage
+REM Jan 30 MSG Geburtstag HE
+REM Jan 31 MSG Geburtstag Tolimar
+REM Mar 24 MSG Geburtstag Zobel
+REM May 10 MSG Geburtstag weasel
+REM May 30 MSG Geburtstag Marillion
+REM Oct 26 MSG Geburtstag alphascorpii
+
+# Arbeit
+#REM 1 MSG Netextend Userimport checken
+#REM 1 MSG Netextend Batchimport - Uli fragen und dann tun.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+REM  MSG Calendar Events:%"%"%
+REM Jan 6 2009 +5  MSG %a %"Epiphany (Heilige Drei Könige)%"%
+REM Feb 23 2009 +5  MSG %a %"Carnival (Rosenmontag)%"%
+REM Feb 24 2009 +5  MSG %a %"Shrove Tuesday (Faschingsdienstag)%"%
+REM Feb 25 2009 +5  MSG %a %"Ash Wednesday (Aschermittwoch)%"%
+REM Apr 5 2009 +5  MSG %a %"Palm Sunday (Palmsonntag)%"%
+REM Apr 9 2009 +5  MSG %a %"Green Thursday (Gründonnerstag)%"%
+REM Apr 10 2009 +5  MSG %a %"Good Friday (Karfreitag)%"%
+REM Apr 12 2009 +5  MSG %a %"Easter (Ostersonntag)%"%
+REM Apr 13 2009 +5  MSG %a %"Easter Monday (Ostermontag)%"%
+REM May 1 2009 +5  MSG %a %"Labour Day\n(Tag der Arbeit)%"%
+REM May 21 2009 +5  MSG %a %"Ascension Day (Christi Himmelfahrt)%"%
+REM May 31 2009 +5  MSG %a %"Whit Sunday (Pfingstsonntag)%"%
+REM Jun 1 2009 +5  MSG %a %"Whit Monday (Pfingstmontag)%"%
+REM Jun 11 2009 +5  MSG %a %"Corpus Christi (Fronleichnam)%"%
+REM Jun 27 2009 +5  MSG %a %"Seven Sleepers' Day (Siebenschläfer)%"%
+REM Aug 15 2009 +5  MSG %a %"Assumption Day (Mariä Himmelfahrt)%"%
+REM Oct 3 2009 +5  MSG %a %"German Reunification (Tag der Deutschen Einheit)%"%
+REM Oct 30 2009 +5  MSG %a %"World Savings Day (Weltspartag)%"%
+REM Oct 31 2009 +5  MSG %a %"Reformation Day\n(Reformationstag)\n%"%
+REM Nov 1 2009 +5  MSG %a %"All Saints Day\n(Allerheiligen)%"%
+REM Nov 22 2009 +5  MSG %a %"Sunday for the Dead (Totensonntag)%"%
+REM Nov 22 2009 +5  MSG %a %"Prayer and Repentance Day (Buß- und Bettag)%"%
+REM Nov 29 2009 +5  MSG %a %"First Sunday of Advent (1. Advent)%"%
+REM Dec 6 2009 +5  MSG %a %"Second Sunday of Advent (2. Advent)%"%
+REM Dec 6 2009 +5  MSG %a %"St. Nikolaus Day (Nikolaus)%"%
+REM Dec 8 2009 +5  MSG %a %"Feast of the Immaculate Conception (Mariä Empfängnis)%"%
+REM Dec 13 2009 +5  MSG %a %"Third Sunday of Advent (3. Advent)%"%
+REM Dec 20 2009 +5  MSG %a %"Fourth Sunday of Advent (4. Advent)%"%
+REM Dec 24 2009 +5  MSG %a %"Christmas Eve (4. Advent\, Heiligabend)%"%
+REM Dec 25 2009 +5  MSG %a %"Christmas (1. Weihnachtsfeiertag)%"%
+REM Dec 26 2009 +5  MSG %a %"Second Day of Christmas (2. Weihnachtsfeiertag)%"%
+REM Dec 31 2009 +5  MSG %a %"New Year's Eve (Silvester)%"%
+REM Jan 1 2010 +5  MSG %a %"New Year's Day\n(Neujahr)%"%
+REM Jan 6 2010 +5  MSG %a %"Epiphany (Heilige Drei Könige)%"%
+REM Feb 15 2010 +5  MSG %a %"Carnival (Rosenmontag)%"%
+REM Feb 16 2010 +5  MSG %a %"Shrove Tuesday (Faschingsdienstag)%"%
+REM Feb 17 2010 +5  MSG %a %"Ash Wednesday (Aschermittwoch)%"%
+REM Mar 28 2010 +5  MSG %a %"Palm Sunday (Palmsonntag)%"%
+REM Apr 1 2010 +5  MSG %a %"Green Thursday (Gründonnerstag)%"%
+REM Apr 2 2010 +5  MSG %a %"Good Friday (Karfreitag)%"%
+REM Apr 4 2010 +5  MSG %a %"Easter (Ostersonntag)%"%
+REM Apr 5 2010 +5  MSG %a %"Easter Monday (Ostermontag)%"%
+REM May 1 2010 +5  MSG %a %"Labour Day\n(Tag der Arbeit)%"%
+REM May 13 2010 +5  MSG %a %"Ascension Day (Christi Himmelfahrt)%"%
+REM May 23 2010 +5  MSG %a %"Whit Sunday (Pfingstsonntag)%"%
+REM May 24 2010 +5  MSG %a %"Whit Monday (Pfingstmontag)%"%
+REM Jun 3 2010 +5  MSG %a %"Corpus Christi (Fronleichnam)%"%
+REM Jun 27 2010 +5  MSG %a %"Seven Sleepers' Day (Siebenschläfer)%"%
+REM Aug 15 2010 +5  MSG %a %"Assumption Day (Mariä Himmelfahrt)%"%
+REM Oct 3 2010 +5  MSG %a %"German Reunification (Tag der Deutschen Einheit)%"%
+REM Oct 30 2010 +5  MSG %a %"World Savings Day (Weltspartag)%"%
+REM Oct 31 2010 +5  MSG %a %"Reformation Day\n(Reformationstag)\n%"%
+REM Nov 1 2010 +5  MSG %a %"All Saints Day\n(Allerheiligen)%"%
+REM Nov 21 2010 +5  MSG %a %"Sunday for the Dead (Totensonntag)%"%
+REM Nov 22 2010 +5  MSG %a %"Prayer and Repentance Day (Buß- und Bettag)%"%
+REM Nov 28 2010 +5  MSG %a %"First Sunday of Advent (1. Advent)%"%
+REM Dec 5 2010 +5  MSG %a %"Second Sunday of Advent (2. Advent)%"%
+REM Dec 6 2010 +5  MSG %a %"St. Nikolaus Day (Nikolaus)%"%
+REM Dec 8 2010 +5  MSG %a %"Feast of the Immaculate Conception (Mariä Empfängnis)%"%
+REM Dec 12 2010 +5  MSG %a %"Third Sunday of Advent (3. Advent)%"%
+REM Dec 19 2010 +5  MSG %a %"Fourth Sunday of Advent (4. Advent)%"%
+REM Dec 24 2010 +5  MSG %a %"Christmas Eve (4. Advent\, Heiligabend)%"%
+REM Dec 25 2010 +5  MSG %a %"Christmas (1. Weihnachtsfeiertag)%"%
+REM Dec 26 2010 +5  MSG %a %"Second Day of Christmas (2. Weihnachtsfeiertag)%"%
+REM Dec 31 2010 +5  MSG %a %"New Year's Eve (Silvester)%"%
+REM Jan 1 2011 +5  MSG %a %"New Year's Day\n(Neujahr)%"%
+REM Jan 6 2011 +5  MSG %a %"Epiphany (Heilige Drei Könige)%"%
+REM May 1 2011 +5  MSG %a %"Labour Day\n(Tag der Arbeit)%"%
+REM Jun 27 2011 +5  MSG %a %"Seven Sleepers' Day (Siebenschläfer)%"%
+REM Aug 15 2011 +5  MSG %a %"Assumption Day (Mariä Himmelfahrt)%"%
+REM Oct 3 2011 +5  MSG %a %"German Reunification (Tag der Deutschen Einheit)%"%
+REM Oct 30 2011 +5  MSG %a %"World Savings Day (Weltspartag)%"%
+REM Oct 31 2011 +5  MSG %a %"Reformation Day\n(Reformationstag)\n%"%
+REM Nov 1 2011 +5  MSG %a %"All Saints Day\n(Allerheiligen)%"%
+REM Nov 22 2011 +5  MSG %a %"Prayer and Repentance Day (Buß- und Bettag)%"%
+REM Dec 6 2011 +5  MSG %a %"St. Nikolaus Day (Nikolaus)%"%
+REM Dec 8 2011 +5  MSG %a %"Feast of the Immaculate Conception (Mariä Empfängnis)%"%
+REM Dec 24 2011 +5  MSG %a %"Christmas Eve (4. Advent\, Heiligabend)%"%
+REM Dec 25 2011 +5  MSG %a %"Christmas (1. Weihnachtsfeiertag)%"%
+REM Dec 26 2011 +5  MSG %a %"Second Day of Christmas (2. Weihnachtsfeiertag)%"%
+REM Dec 31 2011 +5  MSG %a %"New Year's Eve (Silvester)%"%
+REM Jan 1 2012 +5  MSG %a %"New Year's Day\n(Neujahr)%"%
+REM Jan 6 2012 +5  MSG %a %"Epiphany (Heilige Drei Könige)%"%
+REM May 1 2012 +5  MSG %a %"Labour Day\n(Tag der Arbeit)%"%
+REM Jun 27 2012 +5  MSG %a %"Seven Sleepers' Day (Siebenschläfer)%"%
+REM Aug 15 2012 +5  MSG %a %"Assumption Day (Mariä Himmelfahrt)%"%
+REM Oct 3 2012 +5  MSG %a %"German Reunification (Tag der Deutschen Einheit)%"%
+REM Oct 30 2012 +5  MSG %a %"World Savings Day (Weltspartag)%"%
+REM Oct 31 2012 +5  MSG %a %"Reformation Day\n(Reformationstag)\n%"%
+REM Nov 1 2012 +5  MSG %a %"All Saints Day\n(Allerheiligen)%"%
+REM Nov 22 2012 +5  MSG %a %"Prayer and Repentance Day (Buß- und Bettag)%"%
+REM Dec 6 2012 +5  MSG %a %"St. Nikolaus Day (Nikolaus)%"%
+REM Dec 8 2012 +5  MSG %a %"Feast of the Immaculate Conception (Mariä Empfängnis)%"%
+REM Dec 24 2012 +5  MSG %a %"Christmas Eve (4. Advent\, Heiligabend)%"%
+REM Dec 25 2012 +5  MSG %a %"Christmas (1. Weihnachtsfeiertag)%"%
+REM Dec 26 2012 +5  MSG %a %"Second Day of Christmas (2. Weihnachtsfeiertag)%"%
+REM Dec 31 2012 +5  MSG %a %"New Year's Eve (Silvester)%"%
+REM Jan 1 2013 +5  MSG %a %"New Year's Day\n(Neujahr)%"%
+REM Jan 6 2013 +5  MSG %a %"Epiphany (Heilige Drei Könige)%"%
+REM May 1 2013 +5  MSG %a %"Labour Day\n(Tag der Arbeit)%"%
+REM Jun 27 2013 +5  MSG %a %"Seven Sleepers' Day (Siebenschläfer)%"%
+REM Aug 15 2013 +5  MSG %a %"Assumption Day (Mariä Himmelfahrt)%"%
+REM Oct 3 2013 +5  MSG %a %"German Reunification (Tag der Deutschen Einheit)%"%
+REM Oct 30 2013 +5  MSG %a %"World Savings Day (Weltspartag)%"%
+REM Oct 31 2013 +5  MSG %a %"Reformation Day\n(Reformationstag)\n%"%
+REM Nov 1 2013 +5  MSG %a %"All Saints Day\n(Allerheiligen)%"%
+REM Nov 22 2013 +5  MSG %a %"Prayer and Repentance Day (Buß- und Bettag)%"%
+REM Dec 6 2013 +5  MSG %a %"St. Nikolaus Day (Nikolaus)%"%
+REM Dec 8 2013 +5  MSG %a %"Feast of the Immaculate Conception (Mariä Empfängnis)%"%
+REM Dec 24 2013 +5  MSG %a %"Christmas Eve (4. Advent\, Heiligabend)%"%
+REM Dec 25 2013 +5  MSG %a %"Christmas (1. Weihnachtsfeiertag)%"%
+REM Dec 26 2013 +5  MSG %a %"Second Day of Christmas (2. Weihnachtsfeiertag)%"%
+REM Dec 31 2013 +5  MSG %a %"New Year's Eve (Silvester)%"%
+REM Jan 1 2014 +5  MSG %a %"New Year's Day\n(Neujahr)%"%
diff --git a/.dotfiles/host:gkar/bin/echolon b/.dotfiles/host:gkar/bin/echolon
new file mode 100755 (executable)
index 0000000..0973b29
--- /dev/null
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+# (c) Andreas Barth <aba@not.so.argh.org> 2004
+
+import ldap, ldap.modlist, string, sys, getopt, os
+
+key='joerg'
+#if os.environ.has_key('SSH_ORIGINAL_COMMAND'): key=os.environ['SSH_ORIGINAL_COMMAND']
+if len(sys.argv) >= 2: key=sys.argv[1]
+
+uri="ldap://db.debian.org/"
+l=ldap.initialize(uri)
+baseDN="dc=debian,dc=org"
+searchFilter="(|(uid=%s)(cn=%s)(sn=%s)(ircNick=%s)(supplementaryGid=%s))" % (key,key,key,key,key)
+searchScope=ldap.SCOPE_SUBTREE
+retrieveAttributes=['uid', 'supplementaryGid', 'ircNick', 'sn', 'cn', 'activity-from', 'activity-pgp', 'onvacation',
+'labeledURI', 'createtimestamp', 'modifyTimestamp', 'dn']
+#retrieveAttributes=None
+result = l.search_s(baseDN, searchScope, searchFilter, retrieveAttributes)
+#print result
+
+for k in result:
+       print "%s:" % (k[0])
+       for l in k[1].keys():
+               for m in k[1][l]:
+                       print "%s: %s" % (l, m)
+       print ""
+
diff --git a/.dotfiles/host:gkar/bin/train.sh b/.dotfiles/host:gkar/bin/train.sh
new file mode 100755 (executable)
index 0000000..8619cf6
--- /dev/null
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+set -e
+
+# train a spamassassin on kosh and vir as user amavis
+
+rm -f ~/Mail/archive/*~
+rsync -v --progress -B 8192 -a ~/Mail/archive/* kosh.ganneff.de:train/.
+rsync -e 'ssh -4 ' -v --progress -B 8192 -a ~/Mail/archive/* vir.ganneff.de:train/.
+
+ssh -t4 vir.ganneff.de /home/joerg/bin/train.sh
+ssh -t4 kosh.ganneff.de /home/joerg/bin/train.sh
+
+rm ~/Mail/archive/Ham*
+touch ~/Mail/archive/Ham
+rm ~/Mail/archive/Spam*
+touch ~/Mail/archive/Spam
+sleep 3
diff --git a/.publish.cfg b/.publish.cfg
new file mode 120000 (symlink)
index 0000000..5df5d33
--- /dev/null
@@ -0,0 +1 @@
+/home/joerg/dotfiles/.publish.cfg
\ No newline at end of file
diff --git a/bin/dnslint b/bin/dnslint
new file mode 100755 (executable)
index 0000000..a22466d
--- /dev/null
@@ -0,0 +1,44 @@
+#!/usr/bin/perl -w
+use strict;
+use Net::DNS;
+my %cache;
+my $res = Net::DNS::Resolver->new;
+my ($c1, $c2) = ("", "");
+($c1, $c2) = ("\033[32m", "\033[0m") if (-t 1);
+sub dns ($$);
+sub dns ($$)
+{
+        my ($q, $depth) = @_;
+        return if $cache{$q};
+        $cache{$q} = 1;
+        my $query = $res->search($q, 'ANY');
+        if (! $query) {
+                warn "    " x $depth, "$c1$q$c2 query failed: ", $res->errorstring, "\n";
+                return;
+        }
+        foreach my $rr ($query->answer) {
+                my $t = $rr->type;
+                my $a = $rr->rdatastr;
+                print "    " x $depth, "$c1$q$c2 $t $a\n";
+                if ($t eq 'MX') {
+                        $a =~ s/\d+ //;
+                } elsif ($t eq 'TXT') {
+                        next;
+                } elsif ($t eq 'SOA') {
+                        next;
+                } elsif ($t eq 'SSHFP') {
+                        next;
+                }
+                next unless $a;
+                dns ($a, $depth + 1);
+        }
+}
+dns (shift, 0);
diff --git a/bin/gpgget b/bin/gpgget
new file mode 100755 (executable)
index 0000000..cc9fb01
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/bash
+gpg $2 --recv-keys 0x$1
+gpg --fast-list-mode --list-sigs $1 | grep '^sig' | cut -b 13-21 | sort -u | xargs gpg $2 --recv-keys
+gpg --with-fingerprint --check-sigs $1
+
diff --git a/bin/lexi b/bin/lexi
new file mode 100755 (executable)
index 0000000..7226f08
--- /dev/null
+++ b/bin/lexi
@@ -0,0 +1,233 @@
+#! /usr/bin/perl
+
+#   lexi - Translate words with LEO.org
+#   Copyright (c) 2000-5,7,8,11-13  Martin Schulze <joey@infodrom.org>
+#
+#   This program is free software; you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation; either version 2 of the License, or
+#   (at your option) any later version.
+#
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#
+#   You should have received a copy of the GNU General Public License
+#   along with this program; if not, write to the Free Software
+#   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
+
+# For updates see http://www.infodrom.org/Infodrom/tools/lexi.html
+
+use strict;
+use warnings;
+
+use LWP::UserAgent;
+use Getopt::Long;
+use Text::Iconv;
+use POSIX qw(setlocale LC_CTYPE);
+
+# URL to LEO (translation)
+my %config = (
+          'url_ende' => 'http://dict.leo.org/ende?search=%s',
+          'url_esde' => 'http://dict.leo.org/esde?search=%s',
+          'url_frde' => 'http://dict.leo.org/frde?search=%s',
+          'verbose' => 0,
+          'pager' => undef,
+          # URL to the Merriam Webster dictionary (pronunciation)
+          'pron-url' => 'http://www.m-w.com/cgi-bin/dictionary?book=Dictionary&va=%s',
+          'color' => undef,
+          );
+my $rev = q{$Revision: 1.43 $};
+$rev =~ s/.*(\d+\.\d+).*/$1/;
+my $pronguide = 'http://www.m-w.com/help/pronguide.htm';
+
+$config{color} = $ENV{LEXI_COLOR} if exists $ENV{LEXI_COLOR};
+$config{pager} = $ENV{LEXI_PAGER} if exists $ENV{LEXI_PAGER};
+
+my $opt_espanol;
+my $opt_french;
+my $opt_pronounce;
+my %options = (
+    'color' => \$config{color},
+    'pager' => \$config{pager},
+    'help' => \&help,
+    'espanol' => \$opt_espanol,
+    'french' => \$opt_french,
+    'pronounce' => \$opt_pronounce,
+    );
+
+sub url
+{
+    my $urlform = shift;
+    my $word = shift;
+
+    $word =~ tr/ /+/;
+
+    return sprintf ($urlform, $word);
+}
+
+sub fetch
+{
+    my $url = shift;
+
+    my $ua = LWP::UserAgent->new;
+    $ua->timeout(10);
+    $ua->env_proxy;
+
+    printf "%s\n", $url if $config{'verbose'};
+    my $response = $ua->get($url);
+
+    die $response->status_line unless $response->is_success;
+    printf "%s\n", $response->decoded_content if $config{'verbose'} > 1;
+
+    return $response->decoded_content;
+}
+
+sub results
+{
+    my $text = shift;
+    my @lines = split (/\n/, $text);
+    my $line;
+    my $results;
+
+    $text =~ s/\r?\n//g;
+    my @res;
+    while ($text =~ m,<td class="text" lang="(.*?)">(.*?)</td>,g) {
+       push @res, [$1, $2];
+
+       if (@res == 2) {
+           push @$results, {$res[0]->[0] => $res[0]->[1], $res[1]->[0] => $res[1]->[1]};
+           @res = ();
+       }
+    }
+
+    return $results;
+}
+
+sub print_results
+{
+    my $results = shift;
+    my $foreign = shift;
+    my @lines;
+    my $line;
+    my $fromcode = 'utf-8';
+    my $converter = undef;
+
+    my $tocode = lc(setlocale(LC_CTYPE));
+    $tocode = $2 if $tocode =~ /^(.*)\.(.*)$/;
+
+    $converter = Text::Iconv->new($fromcode, $tocode) if $fromcode ne $tocode;
+
+    if (!$config{pager} || !open (OUT, '|-', $config{pager})) {
+       open (OUT, ">-");
+    }
+
+    foreach my $res (@$results) {
+       my $line = $res->{$foreign} . ' - ' . $res->{de};
+
+       $line =~ s/\xa0//g;
+
+       $line =~ s/<A HREF="[^"]+">([^<]*)<\/A>/$1/g;
+       $line =~ s/\&nbsp;/ /g;
+       $line =~ s/\&#160;/ /g;
+       $line =~ s,<font size=-1>\s*(\S.*\S)\s*</font>,($1),g;
+       $line =~ s,<font size="-1">(.*?)</td>, ($1)</td>,g; #notes
+       $line =~ s,<font size=-1>,,g;
+       $line =~ s,</font>,,g;
+       $line =~ s,</?small>,,g;
+       $line =~ s,\s*<br/>\s*, | ,g;
+       $line =~ s,&reg;,(®),g;
+       $line =~ s,<sup>\s*([^<]*)\s*</sup>, [$1],g;
+       $line =~ s/\s{2,}/ /g; # this may be caused by removing <b></b> etc.
+       $line =~ s/<I>\s*([^<]*)\s*<\/I>/$1/gi;
+       $line =~ s/<I>\s*([^<]*)\s*<\/I>/$1/gi;
+       $line =~ s/\[<span class="[^">]*">([^<]*)<\/span>\]/[$1]/;
+       $line =~ s/<small class="[^">]*">([^<]*)(<\/span>)?/$1/;
+
+       if ($config{color} && -t OUT) {
+           $line =~ s,<b>(.*?)</b>,\x1b[$config{color}m$1\x1b[0m,g;
+       } else {
+           $line =~ s,<b>(.*?)</b>,$1,g;
+       }
+
+       $line = $converter->convert($line) if $converter;
+       printf OUT "  %s\n", $line;
+    }
+    close (OUT);
+}
+
+sub print_pron
+{
+    my $page = shift;
+    my $pron;
+
+    if ($page =~ /Pronunciation:\s+<tt>(.*)<\/tt><br>/s) {
+       $pron = $1;
+       $pron =~ s/&amp;/\&/g;
+       $pron =~ s/&auml;/ä/g;
+       $pron =~ s/&uuml;/ü/g;
+       $pron =~ s/&divide;/÷/g;
+       $pron =~ s/<u>/\033[4m/g; # underline
+       $pron =~ s/<\/u>/\033[0m/g;
+       $pron =~ s/<i>/\033[1m/g; # italics -> bold
+       $pron =~ s/<\/i>/\033[0m/g;
+       $pron =~ s/<sup>/^/g; # sup -> ^
+       $pron =~ s/<\/sup>//g;
+       print "$pron\n" if(defined($pron));
+    }
+}
+
+
+# Help
+sub help
+{
+       print <<EOF;
+Usage: lexi [-efhp] TERM
+Translate German <> English, French or Spanish
+   and give pronunciation hints (English only)
+   Revision $rev
+
+-e    translate German <> Spanish
+-f    translate German <> French
+-h    this help text
+-p    show pronunciation (see <$pronguide>)
+EOF
+exit 0;
+}
+
+GetOptions %options;
+
+# Pronunciation
+if (defined($opt_pronounce)) {
+       my $url = url ($config{'pron-url'}, $ARGV[0]);
+       my $page = fetch $url;
+       print_pron ($page);
+       exit;
+}
+
+#Spanish
+my $url;
+my $foreign;
+if (defined($opt_espanol)) {
+    $url = url($config{'url_esde'}, $ARGV[0]);
+    $foreign = 'es';
+}
+
+#French
+elsif (defined($opt_french)) {
+    $url = url($config{'url_frde'}, $ARGV[0]);
+    $foreign = 'fr';
+}
+
+#English
+else {
+    $url = url($config{'url_ende'}, $ARGV[0]);
+    $foreign = 'en';
+}
+
+# Translation
+my $page = fetch $url;
+my $results = results $page;
+print_results $results, $foreign if ($results);
+
diff --git a/bin/nils b/bin/nils
new file mode 100755 (executable)
index 0000000..669df8d
--- /dev/null
+++ b/bin/nils
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+set -u
+set -E
+
+days=$(( ( $(date --utc +%s)-$(date --utc --date "2012-05-02" +%s) )/(3600*24) ))
+weeks=$( echo "scale=2; ${days}/7"|bc )
+echo Nils is now ${days} days or ${weeks} weeks old
+
diff --git a/bin/org-git-sync.sh b/bin/org-git-sync.sh
new file mode 100755 (executable)
index 0000000..39da201
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# Add org file changes to the repository
+REPOS="org"
+
+for REPO in $REPOS
+do
+    echo "Repository: $REPO"
+    cd ~/$REPO
+    # Remove deleted files
+    git ls-files --deleted -z | xargs -0 git rm >/dev/null 2>&1
+    # Add new files
+    git add . >/dev/null 2>&1
+    git commit -m "$(date)"
+done
diff --git a/bin/publish b/bin/publish
new file mode 100755 (executable)
index 0000000..43d5b43
--- /dev/null
@@ -0,0 +1,189 @@
+#!/bin/bash
+
+# Copyright (c) 2009 Florian Reitmeir
+# Copyright (c) 2009 Peter Palfrader
+#
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+# Author: Florian Reitmeir
+# E-mail: florian@reitmeir.org
+
+# Publishes files on a webserver.
+#
+# This script copies files or directories as given on the command line,
+# or stdin or the xclipboard, to a remote location using rsync.  That
+# remote directory should be exposed online and ideally be o-r or have
+# indexing disabled.
+#
+# The directory names chosen by this script are random(ish) but still
+# contain a date string so one know how old things are when looking at them
+# (Or one can just have cron clean out stuff older than a week or a month
+# automagically).
+#
+# The random location chosen is printed to stdout when the script finishes,
+# and is copied to the xclipboard if the xclip(1) utility is installed·
+#
+# base_http and base_rsync can be overriden in a ~/.publish.cfg shell snippet.
+
+base_http=http://www.example.com/pub
+base_rsync=marvin.example.com:/var/www/www.example.com/htdocs/pub
+
+history_file=~/.publish.history
+history_lines=1000
+
+[ -e ~/.publish.cfg ] && . ~/.publish.cfg
+
+usage()
+{
+cat << EOF
+usage: $0 [<src> [<src> ...]]
+
+copy the file <src> to a server an report the URL.
+
+OPTIONS:
+   -n      no-do.  Just print what would have been done
+   -s      Show the history
+   -x      Publish the contents of the xclipboard
+   -h      Show this message
+EOF
+}
+
+uri_encode() {
+       perl -MURI::Escape -ne 'print uri_escape($_)'
+}
+
+get_random() {
+       head -c 8 /dev/urandom | base64 | tr '/+' 'xx' | tr -d '='
+}
+
+history_append() {
+    time=$(date --utc --rfc-3339='seconds')
+    echo $time $1 >>"$history_file"
+
+    history_tmp=$( tempfile )
+    cat "$history_file" | tail --lines="$history_lines" >"$history_tmp"
+    mv "$history_tmp" "$history_file"
+}
+
+history_show() {
+    cat "$history_file"
+}
+
+NODO=""
+inputxclip=0
+
+while getopts "hnsx" OPTION
+do
+     case $OPTION in
+         h)
+             usage
+             exit
+             ;;
+         n)
+             NODO="echo"
+             ;;
+         x)
+             inputxclip=1
+             ;;
+         s)
+             if [ -r "$history_file" ]; then
+                history_show
+                exit 0
+             else
+                echo "history file: '$history_file' not found"
+                exit 3
+             fi
+             ;;
+         *)
+             usage >&2
+             exit 1
+             ;;
+     esac
+done
+shift $(($OPTIND - 1))
+
+if [[ "$#" = 0 ]]; then
+       stdin=`tempfile`
+       trap "rm -f '$stdin'" EXIT
+       chmod a+r "$stdin"
+
+       if [ "$inputxclip" != 1 ] ; then
+               echo "No files given on the command line, using stdin" >&2
+               cat > "$stdin"
+       else
+               if which xclip >/dev/null 2>&1; then
+                       echo "Publishing x clipboard:" >&2
+                       xclip -o > "$stdin"
+                       cat "$stdin" | sed -e 's#^#| #'
+                       echo
+                       echo "EOF"
+               else
+                       echo "xclip not installed?" >&2
+                       exit 1
+               fi
+       fi
+       set dummy "$stdin"
+       shift
+elif [ "$inputxclip" = 1 ] ; then
+       echo "Ignoring -x because there are files on the command line" >&2
+fi
+
+d_date=$(date +'%Y-%m-%d')
+d_random=$(get_random)
+d_server="$d_date-$d_random"
+rsync_args="--partial --recursive --compress"
+
+d_server_http_base=$( echo -n "$d_server" | uri_encode )
+
+if [ "$#" = 1 ]; then
+       only_one=1
+else
+       only_one=0
+       echo "$base_http/$d_server_http_base/"
+       if which xclip >/dev/null 2>&1; then
+               echo -n "$base_http/$d_server_http_base/" | xclip
+       fi
+fi
+
+
+while [ "$#" -gt 0 ]; do
+       file="$1"
+       shift
+
+       uri="$base_http/$d_server_http_base/$( echo -n "`basename "$file"`" | uri_encode )"
+
+       trail=""
+       if [ "$only_one" = 1 ]; then
+               if [ -d "$file" ]; then
+                       trail="/"
+                       uri="$base_http/$d_server_http_base/"
+               fi
+               if which xclip >/dev/null 2>&1; then
+                       echo -n "$uri" | xclip
+               fi
+       fi
+
+       echo "$uri"
+       history_append "$uri"
+
+       $NODO rsync $rsync_args "$file$trail" $base_rsync"/$d_server/"
+done
diff --git a/bin/tm b/bin/tm
new file mode 100755 (executable)
index 0000000..33ab928
--- /dev/null
+++ b/bin/tm
@@ -0,0 +1,278 @@
+#!/bin/bash
+
+# Copyright (C) 2011, 2012, 2013 Joerg Jaspert <joerg@debian.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# .
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+# .
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Always exit on errors
+set -e
+# Undefined variables, we don't like you
+set -u
+# ERR traps are inherited by shell functions, command substitutions and
+# commands executed in a subshell environment.
+set -E
+
+########################################################################
+# The following variables can be overwritten outside the script.
+#
+
+# We want a useful tmpdir, so set one if it isn't already.  Thats the
+# place where tmux puts its socket, so you want to ensure it doesn't
+# change under your feet - like for those with a daily-changing tmpdir
+# in their home...
+declare -r TMPDIR=${TMPDIR:-"/tmp"}
+
+# Do you want me to sort the arguments when opening an ssh/multi-ssh session?
+# The only use of the sorted list is for the session name, to allow you to
+# get the same session again no matter how you order the hosts on commandline.
+declare -r TMSORT=${TMSORT:-"true"}
+
+# Want some extra options given to tmux? Define TMOPTS in your environment.
+# Note, this is only used in the final tmux call where we actually
+# attach to the session!
+TMOPTS=${TMOPTS:-"-2"}
+
+# The following directory can hold session config for us, so you can use them
+# as a shortcut.
+declare -r TMDIR=${TMDIR:-"${HOME}/.tmux.d"}
+
+# Where does your tmux starts numbering its windows? Mine does at 1,
+# default for tmux is 0. We try to find it out, but if we fail, (as we
+# only check $HOME/.tmux.conf you can set this variable to whatever it
+# is for your environment.
+if [ -f "${HOME}/.tmux.conf" ]; then
+    bindex=$(grep ' base-index ' ${HOME}/.tmux.conf || echo 0 )
+    bindex=${bindex//* }
+else
+    bindex=0
+fi
+TMWIN=${TMWIN:-$bindex}
+unset bindex
+
+########################################################################
+# Nothing below here to configure
+
+# Store the commandline
+declare -r cmdline=${1:-""}
+
+# Get the tmux version and split it in major/minor
+TMUXVERS=$(tmux -V)
+declare -r TMUXVERS=${TMUXVERS##* }
+declare -r TMUXMAJOR=${TMUXVERS%%.*}
+declare -r TMUXMINOR=${TMUXVERS##*.}
+
+# Save IFS
+declare -r OLDIFS=${IFS}
+
+########################################################################
+function usage() {
+    echo "tmux helper by Joerg Jaspert <joerg@ganneff.de>"
+    echo "Call as: $0 CMD [host]..."
+    echo ""
+    echo "CMD is one of"
+    echo " ls          List running sessions"
+    echo " s           Open ssh session to host"
+    echo " ms          Open multi ssh sessions to hosts, synchronizing input"
+    echo " \$anything   Either plain tmux session with name of \$anything or"
+    echo "             session according to TMDIR file"
+    echo ""
+    echo "TMDIR file:"
+    echo "Each file in \$TMDIR defines a tmux session."
+    echo "Filename is the commandline option \$anything"
+    echo "Content is defined as:"
+    echo "  First line: Session name"
+    echo "  Second line: extra tmux options"
+    echo "  Any following line: A hostname to open a shell with in the normal"
+    echo "  ssh syntax. (ie [user@]hostname"
+    echo ""
+    echo "Environment variables recognized by this script:"
+    echo "TMPDIR - Where tmux stores its session information"
+    echo "         DEFAULT: If unset: /tmp"
+    echo "TMSORT - Should ms sort the hostnames, so it always opens the same"
+    echo "         session, no matter in which order hostnames are presented"
+    echo "         DEFAULT: true"
+    echo "TMOPTS - Extra options to give to the tmux call"
+    echo "         Note that this ONLY affects the final tmux call to attach"
+    echo "         to the session, not to the earlier ones creating it"
+    echo "         DEFAULT: -2"
+    echo "TMDIR  - Where are session information files stored"
+    echo "         DEFAULT: ${HOME}/.tmux.d"
+    echo "TMWIN  - Where does your tmux starts numbering its windows?"
+    echo "         This script tries to find the information in your config,"
+    echo "         but as it only checks $HOME/.tmux.conf it might fail".
+    echo "         So if your window numbers start at anything different to 0,"
+    echo "         like mine do at 1, then you can set TMWIN to 1"
+    exit 42
+}
+
+# Check the first cmdline parameter, we might want to prepare something
+case ${cmdline} in
+    ls)
+        # Simple overview of running sessions
+        tmux list-sessions
+        exit 0
+        ;;
+    s|ms)
+        # Yay, we want ssh to a remote host - or even a multi session setup
+        # So we have to prepare our session name to fit in what tmux (and shell)
+        # allow us to have. And so that we can reopen an existing session, if called
+        # with the same hosts again.
+        sess="${*}"
+
+        if [[ "${TMSORT}" = "true" ]]; then
+            one=$1
+            # get rid of first argument (s|ms), we don't want to sort this
+            shift
+            sess="$one $(for i in $sess; do echo $i; done | sort | tr '\n' ' ')"
+            sess=${sess%% *}
+        else
+            # no sorting, wanted, so we just get rid of first argument (s|ms)
+            shift
+        fi
+
+        # Neither space nor dot are friends in the SESSION name
+        sess=${sess// /_}
+        sess=${sess//./_}
+
+        declare -r SESSION="${SESSION:-$(hostname -s)}${sess}"
+        ;;
+    *)
+        # Nothing special (or something in our tmux.d)
+        if [ $# -lt 1 ]; then
+            usage
+        fi
+        if [ -r "${TMDIR}/$1" ]; then
+            # Set IFS to be NEWLINE only, not also space/tab, as our input files
+            # are \n seperated (one entry per line) and lines may well have spaces
+            IFS="
+"
+            # Fill an array with our config
+            TMDATA=( $(cat "${TMDIR}/$1") )
+            # Restore IFS
+            IFS=${OLDIFS}
+
+            SESSION="$(hostname -s)_${TMDATA[0]}"
+            # Neither space nor dot are friends in the SESSION name
+            SESSION=${SESSION// /_}
+            declare -r SESSION=${SESSION//./_}
+
+            if [ "${TMDATA[1]}" != "NONE" ]; then
+                TMOPTS=${TMDATA[1]}
+            fi
+        else
+            # Not a config file, so just session name.
+            TMDATA=""
+            declare -r SESSION="${SESSION:-$(hostname -s)}${cmdline}"
+        fi
+        ;;
+esac
+
+# We only do special work if the SESSION does not already exist.
+if ! tmux has-session -t ${SESSION} 2>/dev/null; then
+    # In case we want some extra things...
+    # Check stupid users
+    if [ $# -lt 1 ]; then
+        usage
+    fi
+    case ${cmdline} in
+        s)
+            # The user wants to open ssh to one or more hosts
+            tmux new-session -d -s ${SESSION} -n "${1}" "ssh ${1}"
+            # We disable any automated renaming, as that lets tmux set
+            # the pane title to the process running in the pane. Which
+            # means you can end up with tons of "bash". With this
+            # disabled you will have panes named after the host.
+            tmux set-window-option -t ${SESSION} automatic-rename off >/dev/null
+            # If we have at least tmux 1.7, allow-rename works, such also disabling
+            # any rename based on shell escape codes.
+            if [ ${TMUXMINOR} -ge 7 ] || [ ${TMUXMAJOR} -gt 1 ]; then
+                tmux set-window-option -t ${SESSION} allow-rename off >/dev/null
+            fi
+            shift
+            count=2
+            while [ $# -gt 0 ]; do
+                tmux new-window -d -t ${SESSION}:${count} -n "${1}" "ssh ${1}"
+                tmux set-window-option -t ${SESSION}:${count} automatic-rename off >/dev/null
+                # If we have at least tmux 1.7, allow-rename works, such also disabling
+                # any rename based on shell escape codes.
+                if [ ${TMUXMINOR} -ge 7 ] || [ ${TMUXMAJOR} -gt 1 ]; then
+                    tmux set-window-option -t ${SESSION}:${count} allow-rename off >/dev/null
+                fi
+                count=$(( count + 1 ))
+                shift
+            done
+            ;;
+        ms)
+            # We open a multisession window. That is, we tile the window as many times
+            # as we have hosts, display them all and have the user input send to all
+            # of them at once.
+            tmux new-session -d -s ${SESSION} -n "Multisession" "ssh ${1}"
+            shift
+            while [ $# -gt 0 ]; do
+                tmux split-window -d -t ${SESSION}:${TMWIN} "ssh ${1}"
+                # Always have tmux redo the layout, so all windows are evenly sized.
+                # Otherwise you quickly end up with tmux telling you there is no
+                # more space available for tiling - and also very different amount
+                # of visible space per host.
+                tmux select-layout -t ${SESSION}:${TMWIN} main-horizontal >/dev/null
+                shift
+            done
+            # Now synchronize them
+            tmux set-window-option -t ${SESSION}:${TMWIN} synchronize-pane >/dev/null
+            # And set a final layout which ensures they all have about the same size
+            tmux select-layout -t ${SESSION}:${TMWIN} tiled >/dev/null
+            ;;
+        *)
+            # Whatever string, so either a plain session or something from our tmux.d
+            if [ -z "${TMDATA}" ]; then
+                # the easy case, just a plain session name
+                tmux new-session -d -s ${SESSION}
+            else
+                # data in our data array, the user wants his own config
+
+                # So lets start with the "first" line, before dropping into a loop
+                tmux new-session -d -s ${SESSION} -n "Multisession" "ssh ${TMDATA[2]}"
+
+                tmcount=${#TMDATA[@]}
+                index=3
+                while [ ${index} -lt ${tmcount} ]; do
+                    tmux split-window -d -t ${SESSION}:${TMWIN} "ssh ${TMDATA[$index]}"
+                    # Always have tmux redo the layout, so all windows are evenly sized.
+                    # Otherwise you quickly end up with tmux telling you there is no
+                    # more space available for tiling - and also very different amount
+                    # of visible space per host.
+                    tmux select-layout -t ${SESSION}:${TMWIN} main-horizontal >/dev/null
+                    (( index++ ))
+                done
+                # Now synchronize them
+                tmux set-window-option -t ${SESSION}:${TMWIN} synchronize-pane >/dev/null
+                # And set a final layout which ensures they all have about the same size
+                tmux select-layout -t ${SESSION}:${TMWIN} tiled >/dev/null
+            fi
+            ;;
+    esac
+    # Build up new session, ensure we start in the first window
+    tmux select-window -t ${SESSION}:${TMWIN}
+fi
+
+# And last, but not least, attach to it
+tmux ${TMOPTS} attach -t ${SESSION}