#!/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
	case "$f" in
	    *.bak|*~|*.rpmsave|*.rpmnew)
		echo "$f ignored"
		continue
		;;
	    *.issue)
		echo "$f ignored, printed by agetty"
		continue
		;;
	esac
	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|devpath"
    echo "       issue-generator ssh add|remove"
    exit $1
}

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

while true; 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

	    # Support both ifname (eth0) as well as devpath (/devices/virtual/net/lo)
	    if [[ "${3}" =~ ^/ ]]; then
	        ifname="${3##*/}"
	    else
	        ifname="${3}"
	    fi

	    [[ "${ifname}" =~ ${NETWORK_INTERFACE_REGEX} ]] || exit 0

	    case "$2" in
		add)
		    mkdir -p "${PREFIX}"/run/issue.d
		    echo "${ifname}: \\4{$ifname} \\6{$ifname}" > "${PREFIX}/run/issue.d/70-$ifname.conf"
		    ;;
		del|delete|rm|remove)
		    rm -f "${PREFIX}/run/issue.d/70-$ifname.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 ] && [ -e /run/agetty.reload ]; then
    > /run/agetty.reload
fi
