#!/bin/sh [ "$1" = tftp ] || exit 0 . samizdat-paths.sh TFTP_ROOT=${samizdat_isolinux_dir} TFTP_FILE=$4 TFTP_FILE_SIZE=$3 CLIENT_IP=$3 # dnsmasq clears the environment. kiki needs at least $HOME export USER=root export MAIL=/var/mail/root export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin export LANG=en_US.UTF-8 export HOME=/root export LANGUAGE=en_US:en export LOGNAME=root debug() { LOGDIR=/var/log/dnsmasq-dhcp-script mkdir -p "$LOGDIR" exec > "$LOGDIR/$$.log" 2>&1 set -x } new_child() { child_dir=$samizdat_child_dir/child.$$ if [ -d "$child_dir" ]; then rmdir "$child_dir" || exit 1 fi sh -x "$(which keygen.sh)" "$child_dir" || return tar --exclude '*~' -zcf "$child_dir"/gnupghome.tar -C "$child_dir"/root/.gnupg . || return tftp_dir="${TFTP_ROOT}"/"$CLIENT_IP" if [ ! -d "$tftp_dir" ]; then ATOMIC=y dest_dir="$tftp_dir"~ # DNSMASQ DOCUMENTATION IS WRONG OMFG # Otherwise this symlink farm would be unnecessary mkdir -p "$dest_dir" (cd "$dest_dir" && ln -sf ../* . && rm "$CLIENT_IP"~) || return else dest_dir="$tftp_dir" fi chown dnsmasq "$child_dir" "$child_dir"/gnupghome.tar ln -sf "$child_dir"/gnupghome.tar "$dest_dir"/ if [ "$ATOMIC" ]; then mv -T "$dest_dir" "$tftp_dir" fi } cleanup_after_fail() { umount "$child_dir" rmdir "$child_dir" } exit_unless_needed() { case "$TFTP_FILE" in "${TFTP_ROOT}/linux/vmlinuz") ;; "${TFTP_ROOT}/${CLIENT_IP}/linux/vmlinuz") [ -e "${TFTP_ROOT}/${CLIENT_IP}/gnupghome.tar" ] && exit ;; *) exit ;; esac } exit_unless_needed debug (new_child || cleanup_after_fail) &