#!/bin/bash

#
# generate issue file on stdout
# snippets needs to be put in /etc/issue.d, /run/issue.d/ or
# /usr/lib/issue.d
# snippets are sorted for output
# the script assumes this directory exist already, else it will fail
#

PREFIX=""

declare -A FILES

find_files() {
    for f in ${PREFIX}/usr/lib/issue.d/* ${PREFIX}/run/issue.d/* ${PREFIX}/etc/issue.d/* ; do
	test -f "$f" || continue
	T=`basename "$f"`
	FILES[${T}]="$f"
    done
}

generate_issue() {
    for key in "${!FILES[@]}"; do
	keys="${keys}\n${key}";
    done
    for key in `echo -e ${keys} | sort -u`; do
	cat "${FILES[$key]}"
    done
}

usage() {
    echo "Usage: issue-generator [--prefix <path>]"
    echo "       issue-generator network add|remove interface"
    echo "       issue-generator ssh add|remove"
    exit $1
}

print_version() {
    echo "issue-generator 1.7"
    exit 0;
}

while [ 1 ]; do
    if [ $# -eq 0 ]; then
        break
    fi

    case "$1" in
	network)
	    if [ $# -ne 3 ]; then
		usage 1;
	    fi

	    if [ -f /etc/sysconfig/issue-generator ]; then
		. /etc/sysconfig/issue-generator
	    else
		NETWORK_INTERFACE_REGEX="^[be]"
	    fi
	    [[ ${3} =~ ${NETWORK_INTERFACE_REGEX} ]] || exit 0

	    case "$2" in
		add)
		    mkdir -p ${PREFIX}/run/issue.d
		    echo "${3}: \\4{$3} \\6{$3}" > "${PREFIX}/run/issue.d/70-$3.conf"
		    ;;
		del|delete|rm|remove)
		    rm -f "${PREFIX}/run/issue.d/70-$3.conf"
		    ;;
	    esac
	    shift 3;
	    ;;
	ssh)
	    if [ $# -ne 2 ]; then
		usage 1;
	    fi

	    case "$2" in
		add)
		    mkdir -p ${PREFIX}/run/issue.d
		    for KEY_FILE in $(find /etc/ssh -name 'ssh_host_*_key') ; do
			ssh-keygen -l -f ${KEY_FILE};
		    done | awk '{print "SSH host key: " $2 " " $4}' > ${PREFIX}/run/issue.d/60-ssh_host_keys.conf
		    ;;
		del|delete|rm|remove)
		    rm -f ${PREFIX}/run/issue.d/60-ssh_host_keys.conf
		    ;;
	    esac
	    shift 2;
	    ;;
	--prefix)
	    PREFIX=$2
	    shift 2
	    ;;
	-h|--help)
	    usage 0
	    ;;
	--version)
	    print_version
	    ;;
	*)
	    if [ $# -ge 1 ]; then
		usage 1;
	    fi
	    ;;
    esac
done

find_files
# We should only create a new /run/issue file, if something has
# really changed. And reload only in this case
BACKUPFILE=`mktemp -q ${PREFIX}/run/issue.XXXXXXXXXX`
if [ $? -ne 0 ]; then
    echo "issue-generator: Can't create temp file..."
    # Safe fallback: generate new file and reload
    generate_issue > ${PREFIX}/run/issue
    RELOAD=1
else
    generate_issue > ${BACKUPFILE}
    cmp -s ${BACKUPFILE} ${PREFIX}/run/issue
    if [ $? -ne 0 ]; then
	chmod 644 ${BACKUPFILE}
	mv ${BACKUPFILE} ${PREFIX}/run/issue
	RELOAD=1
    else
	rm -f ${BACKUPFILE}
	RELOAD=0
    fi
fi
if [ ${RELOAD} -eq 1 ]; then
    [ -x /usr/sbin/agetty ] && /usr/sbin/agetty --reload > /dev/null || :
fi
