#!/bin/sh
#
# Dieses Skript startet das Shell-Skript "skript_mit_trap.sh" und sorgt mittels
# "tee" dafür, dass alle Ausgaben von "skript_mit_trap.sh" sowohl nach stdout
# als auch in eine Log-Datei geschrieben werden. Mit den Signalen SIGINT und
# SIGQUIT, die typischerweise durch die Tastenkombinationen Ctrl-C und Ctrl-\
# erzeugt werden können, soll das "skript_mit_trap.sh" sauber beendet werden,
# indem es die beiden Signale einfängt und gezielt behandelt. Das vorliegende
# Skript muss also dafür sorgen, dass diesen beiden Signale an das andere
# Skript durchgereicht werden.
#
# 25.2.2006

# Log-Datei festlegen
LOG_FILE=/tmp/logfile.txt

# Die Kommandos "skript_mit_trap.sh" sowie "tee" werden über eine benannte Pipe
# (FIFO) miteinander kommunizieren. Sie dient dazu, alle Ausgaben von
# "skript_mit_trap.sh" an das asynchron gestartete Kommando "tee"
# weiterzuleiten.
#
# Eine gewöhnliche Pipe der Form
#
#  ./skript_mit_trap.sh | tee ...
#
# ist hier weit weniger günstig, da man dort schlechtere Möglichkeiten der
# Signabehandlung hat. Wenn man die Pipe synchron startet, werden SIGINT und
# SIGQUIT an alle Prozesse der Pipe weitergeleitet. Diese beiden Signale
# beenden das Kommando "tee", so dass ggf. die letzten Ausgaben von
# "./skript_mit_trap.sh" verloren gehen, weil "tee" keine Daten mehr aus der
# Pipe auslesen kann, da es schon nicht mehr existiert.
#
# Wenn man die Pipe asynchron startet, kann man die Signale gar nicht an die
# Pipe weitergeben, weil die Bash die Hintergrund-Prozesse immer so startet,
# dass SIGINT und SIGQUIT ignoriert werden. Innerhalb eines Bash-Skripts kann
# man dann keinen eigenen Signal-Handler mehr installieren, weil dies für
# ignorierte Signale unmöglich ist.

# Zunächst legen wir in einer sicheren Art und Weise ein temporäres Verzeichnis
# an. In diesem wird danach die benannte Pipe angelegt.
if ! FIFO_DIR=$(mktemp -d /tmp/fl_fifo.XXXXXXXX)
then
  echo 'Verzeichnis für eine benannte Pipe (FIFO) kann nicht angelegt werden --> Abbruch!'
  exit 1
fi

# jetzt die benannte Pipe selbst anlegen
fifo=$FIFO_DIR/fifo
if ! mkfifo $fifo
then
  echo 'Benannte Pipe (FIFO) kann nicht angelegt werden --> Abbruch!'
  exit 1
fi

# Vor dem eigentlichen Programm-Start protokollieren wir, welcher Nutzer das
# Skript wann auf welchem Rechner gestartet hat.
{
  echo '---------------------'
  date
  echo "Nutzer: $(id -un)"
  echo "Host  : $(hostname -f)"
} >>$LOG_FILE

# Das Kommando "tee", welches aus der benannten Pipe liest, wird asynchron
# gestartet. Damit ignoriert es die beiden Signale SIGINT und SIGQUIT.
tee -a $LOG_FILE < $fifo &

# Jetzt starten wir "skript_mit_trap.sh", wobei sowohl stdout als auch stderr
# in die benannte Pipe umgelenkt werden.
./skript_mit_trap.sh >$fifo 2>&1

# Unser Skript wartet auf das Ende des Kommandos "tee", das eintritt, nachdem
# "skript_mit_trap.sh" beendet wurde, weil dann "tee" beim Lesen aus der
# benannten Pipe ein EOF (end of file) erhält.
wait
echo "$(date) skript_mit_trap.sh beendet"

# temporäres FIFO-Verzeichnis am Ende löschen
rm -rf $FIFO_DIR

