#!/bin/bash -efu
# SPDX-License-Identifier: GPL-2.0-only
#
# Generate /etc/sysconfig/netconsole
#
# Copyright (c) 2022 Vitaly Chikunov <vt@altlinux.org>

usage() {
	echo "Usage: $0 <TARGET-IP>[:TARGET-PORT]"
	exit 0
}

[ ${#@} -lt 1 ] && usage

if [[ $1 =~ ^([[:digit:]]+):(.*\..*)$ ]]; then
	# IPv4 target address can be prefixed with source port.
	lport=${BASH_REMATCH[1]}
	set -- ${BASH_REMATCH[2]}
fi

case "$1" in
	\[*:*\]:*)
		# IPv6 with port.
		ip=${1%]*}
		ip=${ip#[}
		port=${1##*:}
		;;
	*.*:*)
		# IPv4 with port.
		ip=${1%:*}
		port=${1#*:}
		;;
	*.* | *:*)
		# IPv6/IPv4 w/o port.
		ip=$1
		;;
	*)
		echo >&2 "$0: Unknown argument: $1"
		exit 1
		;;
esac

route=$(ip -o route get "$ip")
dev=$(echo "$route" | grep -Pwo 'dev \K\S+')
src=$(echo "$route" | grep -Pwo 'src \K\S+')
via=$(echo "$route" | grep -Pwo 'via \K\S+' ||:)
if [ -z "$via" ]; then
	# Broadcast
	lladdr=
else
	neigh=$(ip ne show to "$via")
	lladdr=$(echo "$neigh" | grep -Pwo 'lladdr \K\S+')
fi

conf=/etc/sysconfig/netconsole
echo "Will set these values in $conf:"
[ -z "${lport-}" ] ||
echo "	SRCPORT=$lport"
echo "	SRCIP=$src"
echo "	SRCDEV=$dev"
[ -z "${port-}" ] ||
echo "	TGTPORT=$port"
echo "	TGTIP=$ip"
echo "	TGTMAC=$lladdr"
echo -n "Confirm changes [Y/n]? "
while true; do
	read -r || { echo "Aborting"; exit 1; }
	shopt -s nocasematch
	case "$REPLY" in
		n|no|0|q) exit 0 ;;
		y|ye|yes|'') break ;;
		*) ;;
	esac
	echo -n "[Y/n] "
	shopt -u nocasematch
done

sed -i -e "s/^SRCIP=.*/SRCIP=$src/" \
	-e "s/^SRCDEV=.*/SRCDEV=$dev/" \
	-e "s/^TGTIP=.*/TGTIP=$ip/" \
	-e "s/^TGTMAC=.*/TGTMAC=$lladdr/" \
	$conf
[ -z "${lport-}" ] ||
sed -i "s/^SRCPORT=.*/SRCPORT=$lport/" $conf
[ -z "${port-}" ] ||
sed -i "s/^TGTPORT=.*/TGTPORT=$port/" $conf

echo "-- New $conf --"
sed 's/#.*//' $conf | grep '[^[:space:]]' | sed 's/^/  /'
echo "--"

