Ich wollte nur [...] und dann ist das Universum explodiert.

Projects
Books
Archive
About









    Permalink
  1. Bash | NerdTool Config for MacOSX

    GeekTool und NerdTool für MacOSX sind schöne Programme, welche Ausgaben von Bash-Scripten auf den Desktop ausgeben und ständig aktualiseren. Kein Geheimnis und nichts Neues.
    Das Netz ist voll von schönen Spielereien für diese Tools. Hier mein Setup. (Benutze Nerdtool, Script ist aber unabhängig von der Software)

    Bash-Script: http://gist.github.com/525385

    ESC=$(printf "\e")
    echo "$ESC[34;47mDATE$ESC[0m"
    date
    echo ""
    echo "$ESC[34;47mUPTIME$ESC[0m"
    uptime
    echo ""
    echo "$ESC[34;47mSTATUS$ESC[0m"
    top -l1 -u -o cpu -S | head -n 12
    echo ""
    echo "$ESC[34;47mEstablished$ESC[0m"
    lsof -i -n | grep -i established | awk '{print $1" "$8" "$9 }' | head -n 18
    echo ""
    echo "$ESC[34;47mListen$ESC[0m"
    lsof -i -n | grep -i listen | awk '{print $1" "$8" "$9 }' | head -n 18 

    Besonderheit hierbei: Der Escape-Character muss so _zwingend_ wie beschrieben eingesetzt werden. Normale Ausgabe wird nicht entsprechend wahrgenommen. Er ist nötig um die Farbtöne innerhalb des Scripts zu managen ;)


  2. Permalink
  3. Bash | Linux und Scripting an meiner Schule

    Diese Woche war (bzw. ist immernoch, aber wenn ich in der Vergangenheit spreche fühlt es sich so an als wärs schon vorbei und das ist gut) Berufsschulwoche. Nun jedenfalls habe ich die grosse Freude dort in Bash-Scripting unterrichtet zu werden. Ungewöhnlich für Lehrkörper ist unserer relativ begeisterter Linux-Benutzer und schiebt an allen Enden etwas LinuxKnow-How mit ein. Das ist sehr schön weil ich Bash und Linux sehr mag.

    #!/bin/bash

    Morgen wird es einen Test geben, bei dem wir innerhalb 30 Minuten eine bestimmte Aufgabe scripten sollen und als “Abgabe” sozusagen vorführen müssen.

    Eine Vorbereitung für diesen Test lautete wie folgt:

    Schreibe ein Script, welches durch Angabe von Parametern in verschiedenen Zeitintervallen und maximaler Ausführdauer das aktuelle Datum und die Uhrzeit ausgibt. Außerdem soll zwischen 2 Modi gewechselt werden können. Mit vorangestelltem Text “Uhrzeit ist:” und nur die Uhrzeit.

    Usage Beispiel:
    ./zeitausgabe 2 10 modus

    Naja. Bevor wieder diverse Trolle in den Kommentaren ihrem Ruf gerecht werden: Die Klasse ist bis auf einen %-Anteil von ca 5 komplett Windows-User und haben Bash-Scripting seit ca 7 Schultagen unterrichtet bekommen. In dieser Dimension wird also auch der Test Morgen ausfallen. Ich bin gespannt.

    Meine Lösung der Aufgabe:

    #!/bin/bash
        interval=$1
        gesamtdauer=$2
        modus=$3
        count=0
    
        if [ "$modus" = "txt" ]; then
                while [ $count -lt $gesamtdauer ]; do
                let count+=$interval
                sleep $interval ; echo "Das ist die Systemzeit: $(date)"
                done
        else
                while [ $count -lt $gesamtdauer ]; do
                let count+=$interval
                sleep $interval ; echo $(date)
                done
        fi

  4. Permalink
  5. Web | Paste-Service via CommandLine (Sprunge.us)

    Sprunge.us ist ein Paste-Service den ich heute von Chris gezeigt bekommen habe. Sprunge ist aber außerdem noch _awesome_, weil er ohne Registrierung oder Umstände alles annimmt was man ihm via curl -F übergibt. Von den Entwicklern ist das wie folgt vorgesehen:

    <command> | curl -F 'sprunge=<-' http://sprunge.us
    INFO: Code: gJIJ
    INFO: URL: http://sprunge.us/gJIJ

    Und man kann unter der ausgespuckten URL den SourceCode begutachten. Den curl-Aufruf finde ich persöhnlich ziemlich lang und nicht wirklich eingängig. Das fanden anscheinend auch die Entwickler von “sprang“. Usage ungefähr so:

    cat /usr/local/scripts/script.sh | sprang
    INFO: Code: gJIJ
    INFO: URL: http://sprunge.us/gJIJ

    sprang ist ein Python-Script das mit dem sprunge.us Pastebin-Dienst interagieren kann. Man kann ihm zum Bleistift auch mit sprang -f ein Fileübergeben, mit -L Logfiles definieren oder ähnliches bewerkstelligen (genaueres mit sprang –help). Durch die Installation des python-setuptools bzw dem Kommando

    aptitude install python-setuptools; easy_install sprang

    wird der Helfer für den Dienst nutzbar. Ich muss ehrlich gestehen ich bin kein Fan von Fremdpaketsystemen. Aber diesbezüglich muss es eben sein. Alternative ist natürlich ein Bash-alias

    alias sprang="curl -F 'sprunge=<-' http://sprunge.us"

    Wobei somit die Restfunktionalität des sprang-scripts verloren geht. Besonders schön ist auch das Syntax Highlightning. Je nach Eingespeisten Source kann man der URL beispielsweise ein ?bash oder ?py mitgeben

    http://sprunge.us/gJIJ?bash

    http://sprunge.us/gJIJ?py

    und erhält schön bunt und leserlich ge-Highlightete Versionen des gesendeten.


  6. Permalink
  7. Mail | Postfix-Aliases mit MySQL-Backend erstellen

    Ich registrierte mich vor kurzem wiedermal bei einem etwas zwielichtigem Portal. Keine begründete Behauptung, es schien mir aber trotz allem so vorzukommen. Wie üblich loggte ich mich in meinen PHPMyAdmin ein und erstellte (um SpamEmails vorzubeugen) mithilfe meines MySQL-Backends von Postfix einen Alias. In einer Tabelle gesammelt liegen sämtliche aliase und deren Empfänger-Postfach.

    address | goto
    ubuntu@zwetschge.org | mail@zwetschge.org
    spam2@zwetschge.org | mail@zwetschge.org
    spam3@zwetschge.org | mail@zwetschge.org
    spam4@zwetschge.org | mail@zwetschge.org

    Es mag jetzt mit Sicherheit User geben die MySQL mit Postfix für unnötig halten, da die Steuerung über ConfigFiles ausreicht. Auf kurz oder lang gefällt mir die MySQL einfach besser. Einfach zuhandhaben. Flexibel. Schön. Das ständige eingelogge in HTpasswd, phpmyadmin-login und herumgeklicke war mir grad nur etwas zu blöd. Ich wollte ein kleines Skript basteln das mir das adden von Aliasen per CLI ermöglicht. In etwa so:

    aliasadd <alias> <recepient>

    Via echo lässt sich mysql (nach Authentifizierung) einen Befehl übergeben:

    echo "use maildb; insert into aliases values ('$1', '$2');" | mysql -u <user> --password=<pass>

    Damit wäre auch schon das gröbste geschafft. Zumindest das Einfügen. Ein Skript zeichnet allerdings mehr aus als nur die Aufgabe die es erledigen soll. Ein Skript muss zuverlässlich sicherstellen das die Aufgabe ausgeführt wurde und dies dem Benutzer nach Möglichkeit auch noch mitteilen.

    echo "use maildb; select * from aliases where address = '$1';" | mysql -u <user> --password=<pass>

    Die vorherige Zeile sieht eigentlich nur nach ob der eingegeben Alias wirklich in der Datenbank vorkommt. Freilich(wer findet ‘freilich’ eigentlich noch seltsam in Sätzen?) könnte ich jetzt noch nach Rückgabewerten mit $? Abfragen und ähnliche if-Vorraussetzungen einbauen. Aber für die 4-5 mal im Monat in denen ich es benutze wäre das übertrieben.

    Fertig sieht das ganze dann wie folgt aus:

    #!/bin/bash
    echo "use maildb; insert into aliases values ('$1', '$2');" | mysql -u <user> --password=<pass>
    echo "use maildb; select * from aliases where address = '$1';" | mysql -u <user> --password=<pass>

    Bildschirmfoto 2010-01-09 um 12.12.35

    nochmal als Plaintext:
    http://zwetschge.org/paste/6


  8. Permalink
  9. Teeworlds | Mehrere Server betreiben unter Linux

    Die 4 Teeworldsserver die auf zwetschge.org laufen, stellten ihre Dienste ehrilchgesagt in einem ziemlichen WirrWarr aus Binaries und Configfiles. Nach Neuorganisition, der technical Overview hier:

    Dateistruktur:
    Ausgabe mit tree -L 3 in /home/teeworlds/:
    http://zwetschge.org/paste/4

    Configfiles:
    Individuell für jeden Server
    http://zwetschge.org/paste/3

    Startskript:
    Nach Reboot automatisch ausgeführt
    http://zwetschge.org/paste/2
    Syntax: binary -f configfile >> ausgabe_logfile &(& = als hintergrundprozess)

    Sollte jemand auch mal mehrere Teeworldsserver nebeneinander betreiben und den Überblick behalten wollen ;)


  10. Permalink
  11. Backup | Bash vs. Python

    Mein erstes BackupScript war in Python geschrieben. Das sah dann wie folgt aus:

    #!/usr/bin/python
    import os
    import time
    quellen = ['/home/ /etc/ /var/www/ /root/ ']
    ziel_verzeichnis = ('/media/backup/backup/')
    ziel = ziel_verzeichnis + time.strftime('%Y-%m-%d') + '.tar.gz'
    zip_befehl = 'tar -czvf %s %s' % (ziel, ' '.join(quellen))
    loggingok = 'echo " " >> /var/log/backup.log; echo `date +%d-%m-%Y-%H:%M:%S` --- NEW Action ---  >> /var/log/backup.log; echo `date +%d-%m-%Y-%H:%M:%S` Erfolgreich gebackupped!  >> /var/log/backup.log; echo `date +%d-%m-%Y-%H:%M:%S` --- END Action ---  >> /var/log/backup.log '
    loggingno = 'echo " " >> /var/log/backup.log; echo `date +%d-%m-%Y-%H:%M:%S` --- NEW Action ---  >> /var/log/backup.log; echo `date +%d-%m-%Y-%H:%M:%S` Backup fehlgeschlagen! >> /var/log/backup.log; echo `date +%d-%m-%Y-%H:%M:%S` --- END Action ---  >> /var/log/backup.log '
    if os.system(zip_befehl) == 0:
    print 'Erfolgreiche Sicherung nach', ziel
    os.system(loggingok)
    else:
    print 'Sicherung fehlgeschlagen!'
    os.system(loggingno)

    Aber irgendwie… wurde mir das bissl zu blöd. Alle meine Skripte laufen auf Bash. Warum beim Backuppen aus der Reihe tanzen?
    Eigentlich wäre das ganze schon nach _einer_ Zeile gelaufen. Wenn ich nicht noch die LoggingFunktion hätte.

    #!/bin/bash
    tar -czvf /media/backup/backup/`date +%Y-%m-%d-%H-%M`.tar.gz /home /etc /var/www /root
    return=`echo $?`
    if [ $return -eq 0 ]; then
    echo " " >> /var/log/backup.log
    echo `date +%d-%m-%Y-%H:%M:%S` --- NEW Action ---  >> /var/log/backup.log
    echo `date +%d-%m-%Y-%H:%M:%S` Files Erfolgreich gebackupped!  >> /var/log/backup.log
    echo `date +%d-%m-%Y-%H:%M:%S` --- END Action ---  >> /var/log/backup.log
    else
    echo " " >> /var/log/backup.log
    echo `date +%d-%m-%Y-%H:%M:%S` --- NEW Action ---  >> /var/log/backup.log
    echo `date +%d-%m-%Y-%H:%M:%S` File Backup fehlgeschlagen! >> /var/log/backup.log
    echo `date +%d-%m-%Y-%H:%M:%S` --- END Action ---  >> /var/log/backup.log
    mail -s "Backup fehlgeschlagen!" root@zwetschge.org < /var/log/backup.log
    fi

    Ich weiss nicht. Mir gefällts besser.


  12. Permalink
  13. Shell | timeRobot 0.0.6

    Der Robot ist bei mir jetzt ca 4 Tage im Einsatz und ich muss sagen das ganze wird relativ schnell unübersichtlich. Jede angegebene Config wird bei jedem Cronjob komplett gesichert. Da sammeln sich nach einer weile Recht viele Daten. Um das zu umgehen gibts jetzt die neue Version von timeRobot:

    Changelog:

    • Via md5-Summe erkennt timeRobot automatisch ob die letzte gesicherte Datei der aktuellen Datei entspricht. Falls dies Eintritt erfolgt keine Sicherung der Datei, aber eine Ausgabe und ein Log-Eintrag.
    • timeRobot ist im allgemeinen “gesprächiger” geworden. Sowohl bei Einträgen, Updates als auch bei Auto-updates usw.
    • Es wird mehr geLoggt und vor allem detailierter.
    • Bugfix: Automatische Cron-Job Einrichtung gefixt.

    Rausgekommen ist also eine effizientere, humanere Version :D

    Zu finden wie bei den anderen Projekten auch unter:

    http://zwetschge.org/timerobot/timerobot-0.0.6/timerobot-0.0.6-all.deb

    to be continued..
    Flo


  14. Permalink
  15. Shell | TimeRobot – Strukturiertes/Zyklisches Backuppen ausgewählter Configs und Skripts

    Moin,
    aufgrund diverser Handling-Probleme mit RCS und anderen Structure-Backup-Tools, war ich einfach so frei und hab mein eigenes kleines System zusammen gebastelt. Denkbar einfach ist der Sinn des ganzen. Configdateien und Skripte ändern sich. Und manchmal funktioniert dank einer kleinen Änderung das ganze Programm nicht mehr. Wenn man nur wüsste welche kleine Änderung man nochmal getätigt hat? TimeRobot (so hab ich das ganze getauft) sichert sowohl manuell (kurzer Aufruf), als auch Zyklisch (Woche Tag Stunde, in timerobot.conf konfigurierbar) entsprechende Configfiles, Skripte und sonstige Dateien die vom User im .conf File hinterlegt wurden. Somit erstellt sich eigenständig eine Basis von Files auf die man im Notfall zurückgreifen kann.

    Wer intressiert ist:
    Runterzuladen gibts das ganze unter: http://zwetschge.org/timerobot/timerobot-0.0.5/timerobot-0.0.5-all.deb

    Und hier noch ein kurzes Anwendungsbeispiel:
    $ dpkg -i timerobot-0.0.5-all.deb # Installation

    $ vim /etc/timerobot.conf # Erstanpassung der Pfade (selbsterklärend)


    $ timerobot -t # Erst-Einrichtung der in timerobot.conf gesetzen zyklischen Sicherung


    $ timerobot -a X11 # Ersten Eintrag hinzufügen
    TimeRobot-Verzeichnis X11 wurde angelegt.
    Editiere /etc/timerobot.conf um die Pfade anzupassen


    $ timerobot -a aliases # Zweiter Eintrag
    TimeRobot-Verzeichnis aliases wurde angelegt.
    Editiere /etc/timerobot.conf um die Pfade anzupassen

    $ timerobot -a hosts # Dritter Eintrag (usw.)
    TimeRobot-Verzeichnis hosts wurde angelegt.
    Editiere /etc/timerobot.conf um die Pfade anzupassen

    $ timerobot -l # Struktur des Sicherungsverzeichnisses anzeigen
    /home/user/timerobot
    |-- X11
    |-- aliases
    `-- hosts
    3 directories, 0 files

    $ timerobot -u X11 # Erstmalige Sicherung zb der xorg.conf

    $ timerobot -l
    /home/user/timerobot
    |-- X11
    | `-- 2009-03-16-10-51-28-X11
    |-- aliases
    `-- hosts
    3 directories, 1 file


    $ timerobot --autoall # Komplett-Sicherung aller angegebenen Files


    $ timerobot -l
    /home/user/timerobot
    |-- X11
    | |-- 2009-03-16-10-51-28-X11
    | `-- 2009-03-16-10-52-07-X11
    |-- aliases
    | `-- 2009-03-16-10-52-07-aliases
    `-- hosts
    `-- 2009-03-16-10-52-07-hosts
    3 directories, 4 files


  16. Permalink
  17. CodeCocktail und “feeling right now” Widget

    Tag,
    ein paar ist es vielleicht schon aufgefallen, mittlerweile blogge ich bei der Linux und Coding Gemeinschaft Codecocktail mit. Je nach Genre werden hier oder bei Codecocktail nun Posts verfasst. Tut meiner Aktivität hier bei noqqe.de keinen Abbruch. Sondern erweitert letztendes nur meine “Beitrags-Rate” um ein paar Posts bei Codecocktail. Klar zu Kategoriesieren wo welcher Post hinkommt möchte ich aber trotzdem umgehen. Da demnächst auch weitere Projekte mit den Jungs von Codecocktail anstehen wird sich das auch relativieren. Um meinen Beitrag zur Gemeinschaft zu leisten habe ich spontanerweise den Post und das Zustandekommen des neuen BlogWidgets “feeling right now” mit Bash ZufallssZahlen auf Codecocktail gepostet. Er ist hier: http://codecocktail.wordpress.com/2009/02/01/zufallszahlen-mit-der-shell-bash/ abzurufen :)

    Ums kurz zusagen ist “Feeling right now” eine dynamische Sammlung von kleinen lustigen HäschenBildern die sich alle 5 Minuten zufällig neu schreiben.
    Bis demnächst.
    Flo


  18. Permalink
  19. awk und syncN

    awk hat mir tatsächlich geholfen ;) wer hätte das gedacht. Ich glaube ich habe die kleine Skriptsprache deutlich unterschätzt.

    Aber von Anfang an: In meinem Skript syncN gibt es eine Funktion “–check”. Die zwei Files miteinander vergleicht. Bisher nur über das Datum. Das sieht bis jetzt so aus :

    check ()
    {
    	ssh user@host "ls -lah /Route/to/SyncDir/ > /tmp/checkreturn"
    	scp user@host:/tmp/checkreturn /tmp/checkreturn
    	cat /tmp/checkreturn
    	rm /tmp/checkreturn
    }

    Die Ausgabe des ganzen ist relativ unschön.

    insgesamt 352K
    drwxr-xr-x 2 noqqe noqqe 4,0K 2009-01-09 16:10 .
    drwxr-xr-x 7 noqqe noqqe 4,0K 2009-01-13 12:29 ..
    -rw-r–r– 1 noqqe noqqe 337K 2009-01-14 20:07 $FILE

    Jetzt gibt es da wunderschön, awk.

    ssh user@host "ls -lah /Route/to/SyncDir/ | awk '{ print $6 " " $7 }' > /tmp/checkreturn"

    und schon bekommt man nur noch das Datum und die Uhrzeit ;)

    2009-01-14 20:09

    Demnächst gibts übrigens zusätzlich zur wunderschönen awk Ausgabe noch einen md5 Summen Vergleich ;)


Older »