#!/usr/bin/env bash

PKG_NAME="ideologic-intranet"
HOME_DIR="/var/lib/$PKG_NAME"
SHARE_DIR="/usr/share/$PKG_NAME"
LIB_DIR="/usr/lib/$PKG_NAME"

echo "Generating new config in '$HOME_DIR'"

source "/etc/local-domain/default.conf"

to-punycode() {
	node - "$1" <<-EOF
		console.log(new URL('http://' + process.argv[2]).hostname);
	EOF
}

to-rdn() {
	node - "$1" <<-EOF
		console.log(process.argv[2].split('.').reverse().join('.'));
	EOF
}

to-rdn-path() {
	node - "$1" <<-EOF
		console.log(process.argv[2].split('.').reverse().join('/'));
	EOF
}

first-host-address() {
	node - "$1" <<-EOF
		let [prefix, length] = process.argv[2].split('/');
		length = parseInt(length);
		let ip = prefix.split('.');
		ip.pop();
		ip.push('1');
		console.log([ip.join('.'),length].join('/'));
	EOF
}

strip-network-length() {
	node - "$1" <<-EOF
		let [ip, length] = process.argv[2].split('/');
		console.log(ip);
	EOF
}

arpa() {
	node - "$1" <<-EOF
		let [network, length] = process.argv[2].split('/');
		length = parseInt(length);
		prefix=network.split('.').slice(0, length/8);
		console.log([prefix.reverse().join('.'), 'in-addr', 'arpa'].join('.'))
	EOF
}

net-prefix() {
	node - "$1" <<-EOF
		let [network, length] = process.argv[2].split('/');
		length = parseInt(length);
		let prefix=network.split('.').slice(0, length/8);
		console.log(prefix.join('.'))
	EOF
}




MAIN_DOMAIN=$(to-punycode "$MAIN_DOMAIN")
SUB_DOMAIN=$(to-punycode "$SUB_DOMAIN")
FULL_DOMAIN="${SUB_DOMAIN}.office.${MAIN_DOMAIN}"
FULL_RDN=$(to-rdn "$FULL_DOMAIN")
MASTER_ZONE_DIR=$(to-rdn-path "$MAIN_DOMAIN")
LOCAL_ZONE_DIR=$(to-rdn-path "$FULL_DOMAIN")

NETWORK=$(cat "/var/lib/ideologic-intranet/network")
HOST_IP=$(first-host-address "$NETWORK")
HOST_IP_ADDRESS=$(strip-network-length "$HOST_IP")
NETWORK_PREFIX=$(net-prefix "$NETWORK")
ARPA_DOMAIN=$(arpa "$NETWORK")

mkdir -p "/etc/bind/conf.d/local"
mkdir -p "/etc/bind/conf.d/global"
mkdir -p /var/lib/bind
chown -R :bind /var/lib/bind
chmod g+s /var/lib/bind
mkdir -p "/var/lib/bind/$LOCAL_ZONE_DIR"
chmod g+w "/var/lib/bind/$LOCAL_ZONE_DIR"
mkdir -p "/var/lib/bind/arpa/in-addr"
chmod g+w "/var/lib/bind/arpa/in-addr"

zone_file="/var/lib/bind/$MASTER_ZONE_DIR/db.private"
sed \
-e "s/@DATE@/$(date +%Y%m%d)/g" \
-e "s/@MAIN_DOMAIN@/$MAIN_DOMAIN/g" \
-e "s/@SUB_DOMAIN@/$SUB_DOMAIN/g" \
-e "s/@HOSTNAME@/${HOSTNAME,,}/g" \
-e "s/@IP@/$HOST_IP_ADDRESS/g" \
\
"$SHARE_DIR/templates/master-zone" > "$zone_file" \
&& echo "Generated zone file $zone_file"

zone_file="/var/lib/bind/$LOCAL_ZONE_DIR/db.private"
sed \
-e "s/@DATE@/$(date +%Y%m%d)/g" \
-e "s/@HOSTNAME@/${HOSTNAME,,}/g" \
-e "s/@FULL_DOMAIN@/$FULL_DOMAIN/g" \
-e "s/@IP@/$HOST_IP_ADDRESS/g" \
\
"$SHARE_DIR/templates/local-zone" > "$zone_file" \
&& echo "Generated zone file $zone_file"

conf_file="/etc/bind/named.conf.local"
sed \
-e "s/@RDN@/$FULL_RDN/g" \
-e "s|@NETWORK@|$NETWORK|g" \
-e "s|@NETWORK_PREFIX@|$NETWORK_PREFIX|g" \
\
"$SHARE_DIR/templates/named.conf.local" > "$conf_file" \
&& echo "Generated config file $conf_file"

conf_file="/etc/bind/conf.d/local/$FULL_RDN"
sed \
-e "s|@ARPA_DOMAIN@|$ARPA_DOMAIN|g" \
-e "s|@NETWORK_PREFIX@|$NETWORK_PREFIX|g" \
-e "s|@FULL_DOMAIN@|$FULL_DOMAIN|g" \
-e "s|@LOCAL_ZONE_DIR@|$LOCAL_ZONE_DIR|g" \
\
"$SHARE_DIR/templates/local-conf" > "$conf_file" \
&& echo "Generating config file $conf_file"

zone_file="/var/lib/bind/arpa/in-addr/db.$NETWORK_PREFIX"
sed \
-e "s|@DATE@|$(date +%Y%m%d)|g" \
-e "s|@FULL_DOMAIN@|$FULL_DOMAIN|g" \
-e "s|@ARPA_DOMAIN@|$ARPA_DOMAIN|g" \
-e "s|@HOSTNAME@|$HOSTNAME|g" \
\
"$SHARE_DIR/templates/arpa-zone" > "$zone_file" \
&& echo "Generating zone file $zone_file"

RNDC_KEY=$(awk '{printf "%s\\\n", $0}' "/etc/bind/rndc.key"; echo " ")

conf_file="/etc/dhcp/dhcpd.conf"
sed \
-e "s|@RNDC_KEY@|$RNDC_KEY|g" \
-e "s|@FULL_DOMAIN@|$FULL_DOMAIN|g" \
-e "s|@NETWORK_PREFIX@|$NETWORK_PREFIX|g" \
-e "s|@ARPA_DOMAIN@|$ARPA_DOMAIN|g" \
-e "s|@HOST_IP_ADDRESS@|$HOST_IP_ADDRESS|g" \
-e "s|@MAIN_DOMAIN@|$MAIN_DOMAIN|g" \
\
"$SHARE_DIR/templates/dhcpd-conf" > "$conf_file" \
&& echo "Generating config file $conf_file"

. "$LIB_DIR/get_network_interface.sh"

echo "IFACE=$IFACE"
echo "MAC=$MAC"

lease_file="/etc/dhcp/static-leases.conf"
sed \
-e "s/@HOSTNAME@/${HOSTNAME,,}/g" \
-e "s|@MAC@|$MAC|g" \
-e "s|@HOST_IP_ADDRESS@|$HOST_IP_ADDRESS|g" \
\
"$SHARE_DIR/templates/dhcpd-static-leases" > "$lease_file" \
&& echo "Generating lease file $lease_file"

netplan_file="/etc/netplan/02-LAN.yaml"
sed \
-e "s|@IFACE@|$IFACE|g" \
-e "s|@HOST_IP@|$HOST_IP|g" \
-e "s|@HOST_IP_ADDRESS@|$HOST_IP_ADDRESS|g" \
-e "s|@MAIN_DOMAIN@|$MAIN_DOMAIN|g" \
-e "s|@FULL_DOMAIN@|$FULL_DOMAIN|g" \
-e "s|@MAC@|$MAC|g" \
\
"$SHARE_DIR/templates/netplan" > "$netplan_file" \
&& echo "Generated netplan $netplan_file"
chmod 600 "$netplan_file"

mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
conf_file="/etc/nginx/sites-available/$FULL_RDN.conf"
sed \
-e "s|@FULL_DOMAIN@|$FULL_DOMAIN|g" \
\
"$SHARE_DIR/templates/nginx-conf" > "$conf_file" \
&& echo "Generated nginx config $conf_file"

ln -rfs $conf_file /etc/nginx/sites-enabled/ \
&& echo "Site $FULL_DOMAIN enabled"


netplan apply
systemctl restart named isc-dhcp-server

systemctl restart nginx || true
