My Universe Logo

My Universe Blog » Entries Tagged as scripting

New Release Candidate for jail-update 0.2

Posted by Jesco Freund at Jan. 31, 2010 12:45 p.m.

Today, after a long period of… doing nothing concerning the root-tools project, I uploaded a new release candidate for jail-update 0.2 (download). The current release candidate (rc5) now works fine with portmaster >=2.17 and got some bug fixes. For update checks, I also switched back to the more compact output format of the 0.1 releases – much more legible as for my taste…

I recommend updating to this release candidate even though it's not a release yet (but likely to become one) since portmaster's command line syntax has changed with version 2.17. This prevents older versions of jail-update from working properly (you have to confirm each single port upgrade, so you might be even quicker jumping into each jail and starting the upgrade manually :-().

No comments | Defined tags for this entry: FreeBSD, root-tools, scripting, shell

[CFT] jail-update 0.2.0-rc2 Ready for Testing

Posted by Jesco Freund at Oct. 10, 2009 4:35 p.m.

I am happy to announce that the second release candidate for the upcoming jail-update-0.2 release is ready for testing. You can grab the archive either from SourceForge or from my personal server (more convenient if you would like to download it using wget or fetch).

What's new? Most changes are not visible to users and only concern implementation internals. However, there are some major changes having a visible impact on the application behaviour:

  • The new -n option prevents any escape sequences in the output of jail-update. This is useful if you would like to run jail-update in a non-interactive way (e. g. as a cron job) and redirect its output into a file, email or similar.
  • Warnings and errors occurring entail a clearly visible, colour-coded output (amber for warnings, red for errors) – of course these colour markings get deactivated when run with the -n option…
  • The unpredictable behaviour concerning the jail order should be fixed by now; jails are now always processed in ascending order of their numeric jail ID.
  • The portmaster output indicating available port updates is more detailed now and contains the old version as well as the new one. Furthermore, the output is now grouped among the package classes used by portmaster (root, trunk, branch and leaf ports).

Please test this release candidate. Should you discover any issues, please let me know. Any feedback, particularly concerning the new output format, is welcome and will be taken into account.

Happy Testing!

No comments | Defined tags for this entry: FreeBSD, packet management, root-tools, scripting

Portable Shell-Skripte mit absoluten Pfaden

Posted by Jesco Freund at Oct. 3, 2009 2:23 p.m.

Gute Shell-Skripte sprechen Binaries mit dem absoluten Pfad an. Dadurch wird das Skript unabhängig von der Umgebungsvariablen $PATH und funktioniert auch manierlich, wenn es beispielsweise üder die Crontab oder unter einem andere User aufgerufen wird. Soweit die Theorie, doch in der Praxis gibt es einen gemeinen Fallstrick, der den Wanderer zwischen den Unix-Welten das Leben bzw. Skripten schwer macht. Betrachten wir einmal das folgende Beispiel:

#!/bin/sh

b_uname="/bin/uname"
b_awk="/bin/awk"

name=`$b_uname -n | $b_awk -F. '{print $1}'`

echo "Das System heisst ${name}."
exit 0

Dieses kleine Skript ist ein (zugegebenermaßen etwas umständlicher) Ersatz für den Befehl hostname -s – das tut aber eigentlich nichts zur Sache. Viel spannender ist die Frage, wie portabel dieses Skript arbeitet. Unter CentOS 5.3 kann ich es fehlerfrei ausführen. Anders sieht es aus, wenn dieses Skript auf einer Maschine mit FreeBSD oder Solaris aufgerufen wird: Unter FreeBSD erhält man Fehlermeldungen („Command not found“), da uname und awk nicht wie bei CentOS und Solaris in /bin liegen, sondern in /usr/bin (bei Solaris kommt es ebenfalls zu Problemen, die aber darin begründet sind, dass die Solaris-Implementierungen von uname und awk von den GNU-Implementierungen abweichen – doch dazu später).

Unter den verschiedenen Unix-Derivaten und sogar Linux-Distributionen liegen Binaries also nicht immer am selben Ort. Müssen portable Skripte also darauf verzichten, absolute Pfade zu verwenden und sich auf $PATH verlassen? Natürlich nicht. Allerdings funktioniert der Schnellschuss „dann definiere ich Binaries eben systemabhängig“ auch nicht so ohne weiteres – man sieht ja, dass das häufig dazu herangezogene uname schon nicht sehr portabel gelagert ist. Es gibt jedoch einen eleganteren Weg, der sich nur auf Shell-interne Funktionen stützt und daher tatsächlich komplett portabel ist:

#!/bin/sh

detect_binary() {
    local BINDIRS="/bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin /opt/csw/bin /opt/sfw/bin /usr/openwin/bin"

    for i in $BINDIRS; do
        if [ -x "${i}/${1}" ]; then
            echo "${i}/${1}"
            break
        fi
    done
}

b_uname=$(detect_binary "uname")
b_awk=$(detect_binary "awk")

Die Funktion detect_binary probiert alle angegebenen Pfade durch, bis sie in einem auf eine ausführbare Datei mit dem gesuchten Namen stößt. Anschließend gibt sie den absoluten Pfad des gefundenen Binaries zurück. Auf diese Weise wird zum einen sichergestellt, dass nur Binaries aus den vorgegebenen Pfaden verwendet werden, und zum anderen, dass die Binaries weiterhin unabhängig von der Umgebungsvariable $PATH gefunden werden können.

Eines löst dieser Code-Schnipsel jedoch nicht: Das unterschiedliche Verhalten von gleichnamigen Binaries unter verschiedenen Unix-Derivaten. Auf vielen Nicht-Linux Systemen stehen Binaries der GNU-Implementierung zur Verfügung, oder zumindest Binaries, die das Verhalten der GNU-Implementierungen nachahmen. Unter FreeBSD beispielsweise findet man in gsed und gawk die GNU-Implementierungen, während sich hinter sed und awk die traditionellen BSD-Implementierungen verbergen. Die <programm>-Binaries findet man im übrigen auch unter Linux. Benötig man also in einem Skript explizit das GNU-Verhalten (beispielsweise beim Einsatz von sed -i, so sollte man auch die GNU-Binary-Namen verwenden.

Happy Scripting!

4 comments | Defined tags for this entry: code, FreeBSD, Linux, programming, scripting, shell, Solaris

Sudoko - solved!

Posted by André Mühlnikel at May 2, 2009 10:14 p.m.

Es hat mich einfach nicht in Ruhe gelassen … also habe ich einen Solver für Sudokus gebaut. Da ich aber „Ausprobieren“ nicht für „logisch erschließen“ halte, habe ich demonstrativ diesen Lösungsweg weggelassen ;-)

Wers ausprobieren möchte, kann hier sehr schön Beispiele finden und die Lösungen nachvollziehen – einfach dazu am Ende des Skripts das Log-Level auf 5 setzen, dann erhält man die detaillierte Finde-Systematik ausgegeben. Hier muss ebenfalls (da ich zu faul und unwissend in Bezug auf Python bin) der Dateiname der Input-Datei jeweils angepasst werden!

Ein paar Notizen zur Vorgehensweise:

  • Quasi-Singles sind Werte, die innerhalb eines Blockes (also 3×3-Feldes) in nur einer Zeile oder Spalte zu finden sind, und somit in der restlichen Zeile bzw. Spalte ausgeschlossen werden können.
  • Unknown Singles sind solche Felder, die nach Ausschluss aller durch Zeile, Spalte und Block wegfallenden Optionen nur noch einen möglichen Wert enthalten. Wurden sie allerdings auf diese Weise einmal erkannt, werden sie danach zu „Known Singles“, damit sie nicht immer wieder aufs neue verarbeitet werden und das Programm irgendwann terminieren kann.
  • Single Options sind diejenigen Felder, die, obwohl sie selbst noch mehr als einen möglichen Wert zur Verfügung haben, innerhalb ihres Blocks oder ihrer Zeile/Spalte das einzige Vorkommen eines dieser Werte sind und somit zwingend auf diesen Wert festzulegen sind.

Alles klar? Fragen beantworte ich gerne (auch in den Kommentaren)! :-)

No comments | Defined tags for this entry: programming, python, scripting, fun, Sudoku

FreeBSD rc-Skript für mehrere Zope-Instanzen mit ZEO

Posted by Jesco Freund at June 6, 2008 9:52 p.m.

Ich habe mir eben ein rc-Skript für Zope zusammengebaut, das auch ein Setup wie meinen Zweispänner bedienen kann. Die aktuelle Version kann aus dem SVN-Repository heruntergeladen werden (Link). Um das Skript zu nutzen, einfach nach /usr/local/etc/rc.d/ kopieren und die Dateirechte auf 0555 setzen.

Was nun noch fehlt sind die entsprechenden Einträge in /etc/rc.conf. Dazu hier ein kleines Beispiel:

plone_enable="YES"
plone_user="myploneuser"
plone_path="/home/myploneuser/zope/client0:/home/myploneuser/zope/client1:/home/myploneuser/zope/client2"
plone_zeo="/home/myploneuser/zope/zeo"

Zur Erläuterung: plone_enable steuert wie bei RC-Skripten üblich, ob überhaupt gestartet werden soll oder nicht. plone_user erlaubt es, den User vorzugeben, unter dem die Zope-Instanzen gestartet werden sollen. plone_path erlaubt die Angabe beliebig vieler Zope-Instanzen; die Pfade müssen nur wie im Beispiel durch einen Doppelpunkt getrennt werden. plone_zeo schließlich ermöglicht die (optionale) Angabe einer ZEO-Instanz, die vor den Zope-Instanzen gestartet wird. Im einfachsten Fall funktioniert das Skript auch ohne Parameter – dann startet es einfach die Zope-Instanz unter /usr/local/www/Zope29.

Wichtig: Alle Pfade müssen ohne abschließenden / angegeben werden!

No comments | Defined tags for this entry: FreeBSD, Plone, scripting

Admin Scripts online verfügbar

Posted by Jesco Freund at May 25, 2008 12:26 a.m.

Kein Unix-Admin kommt ohne das ein oder andere Shell-Skript aus – auch ich mache da keine Ausnahme. Für die im Laufe der Zeit entstandenen Skripte (hauptsächlich Bourne Shell) habe ich jetzt ein öffentlich zugängliches Subversion-Repository angelegt. Manche der Skripte sind zwar spezifisch auf meine Serverkonfigurationen ausgelegt, aber das ein oder andere ist sicherlich universell verwendbar oder kann leicht angepasst werden.

Wer mag, kann sich also gerne bedienen:

svn co http://svn.my-universe.com/Scripts/trunk Scripts

No comments | Defined tags for this entry: programming, scripting, server, svn

Page 1 of 1