#!/bin/bash
finish() {
  sync
  umount -q /mnt
  [ -n "$REQUESTID" ] && [ -n "$TOKEN" ] && [ -n "$APIURL" ] && \
  nohup curl -q -X POST -H "Content-Type: application/json" -H "x-request-id: $REQUESTID" -H "x-trace-id: rescue-reboot" -d "{\"token\":\"$TOKEN\"}" "$APIURL" &
  shutdown -r 1
  exit
}

do_redhat() {
  # Update repo mirror URL
  [ -f "$TARGET"/etc/yum.repos.d/CentOS-Base.repo ] && sed 's/asi-fs-.\.contabo\.net/asi-fs.contabo.net/' -i "$TARGET"/etc/yum.repos.d/CentOS-Base.repo
  [ -f "$TARGET"/etc/yum.repos.d/almalinux.repo ] && sed 's/asi-fs-.\.contabo\.net/asi-fs.contabo.net/' -i "$TARGET"/etc/yum.repos.d/almalinux.repo

  # Update nameservers
  echo "search invalid" > "$TARGET"/etc/resolv.conf
  echo "nameserver ${DNS[0]}" >> "$TARGET"/etc/resolv.conf
  echo "nameserver ${DNS[1]}" >> "$TARGET"/etc/resolv.conf

  # Update static route
  [ -f "$TARGET"/etc/rc.local ] && sed "s|ip route add.*|ip route add $IPV4_NETWORK/$IPV4_PREFIX via $IPV4_GATEWAY dev eth0|" -i "$TARGET"/etc/rc.local
  [ -f "$TARGET"/etc/rc.d/rc.local ] && sed "s|ip route add.*|ip route add $IPV4_NETWORK/$IPV4_PREFIX via $IPV4_GATEWAY dev eth0|" -i "$TARGET"/etc/rc.d/rc.local

  # Update interface config
  sed "s|IPADDR=.*|IPADDR=$IPV4_ADDRESS|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
  sed "s|NETMASK=.*|NETMASK=$IPV4_NETMASK|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
  sed "s|GATEWAY=.*|GATEWAY=$IPV4_GATEWAY|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
  sed "s|PREFIX=.*|PREFIX=$IPV4_PREFIX|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
  sed "s|DNS1=.*|DNS1=${DNS[0]}|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
  sed "s|DNS2=.*|DNS2=${DNS[1]}|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
  sed "s|IPV6ADDR=.*|IPV6ADDR=$IPV6_ADDRESS/$IPV6_PREFIX|" -i "$TARGET"/etc/sysconfig/network-scripts/ifcfg-eth0
}

do_debian() {
  # Update repo mirror URL
  [ -f "$TARGET"/etc/apt/sources.list ] && sed 's/asi-fs-.\.contabo\.net/asi-fs.contabo.net/' -i "$TARGET"/etc/apt/sources.list

  # Update interface config
  cat > "$TARGET"/etc/network/interfaces << EOF
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address $IPV4_ADDRESS
    netmask $IPV4_NETMASK
    gateway $IPV4_GATEWAY
    dns-search invalid
    dns-nameservers ${DNS[0]} ${DNS[1]}
    up ip route replace $IPV4_NETWORK/$IPV4_PREFIX via $IPV4_GATEWAY dev eth0

iface eth0 inet6 static
    address $IPV6_ADDRESS
    netmask $IPV6_PREFIX
    gateway fe80::1
    accept_ra 0
    autoconf 0
    privext 0
EOF
}

do_ubuntu() {
  # Update repo mirror URL
  [ -f "$TARGET"/etc/apt/sources.list ] && sed 's/asi-fs-.\.contabo\.net/asi-fs.contabo.net/' -i "$TARGET"/etc/apt/sources.list
  
  # Update interface config
  cat > "$TARGET"/etc/netplan/01-netcfg.yaml << EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      match:
        macaddress: $MAC_ADDRESS
      addresses: 
        - $IPV4_ADDRESS/32 
        #-  $IPV6_ADDRESS/$IPV6_PREFIX
      #gateway6: fe80::1 
      routes:
        - to: 0.0.0.0/0
          via: $IPV4_GATEWAY
          on-link: true
      nameservers:
        search: [ invalid ]
        addresses:
          - ${DNS[0]}
          - ${DNS[1]}
EOF
}

while getopts "r:t:u:y" option; do
  case $option in
    r) REQUESTID="$OPTARG"  ;;
    t) TOKEN="$OPTARG"      ;;
    u) APIURL="$OPTARG"     ;;
    y) CONTINUE=1           ;;
    *) ;;
  esac
done

if [ -z "$CONTINUE" ]; then
  echo "WARNING! This script looks for a Linux installation on a local disk, resets"
  echo "the network configuration and automatically reboots the instance."
  echo
  read -rsp $'Press any key to continue or CTRL+C to abort... ' -n1 key
  echo
fi

PARTARR=($(blkid -o device -t TYPE="ext4"))
PARTARR+=($(blkid -o device -t TYPE="ext3"))
PARTARR+=($(blkid -o device -t TYPE="xfs"))
PARTARR+=($(blkid -o device -t TYPE="btrfs"))

trap finish ERR

read -r IPV4_ADDRESS IPV6_ADDRESS <<< "$(hostname -I)"
IPV4_PREFIX=$(ip route show scope link | awk '{ print $1 }' | cut -d/ -f2)
IPV6_PREFIX=64
IPV4_NETWORK=$(ifdata -pN eth0)
IPV4_NETMASK=$(ifdata -pn eth0)
IPV4_GATEWAY=$(ip route show default | awk '{ print $3 }')
MAC_ADDRESS=$(ifdata -ph eth0)

DNS=()
while read -r line; do
  DNS+=("$line")
done <<< "$(awk '/^nameserver/{ print $2 }' /etc/resolv.conf)"
[ -z "${DNS[0]}" ] && DNS[0]=8.8.8.8
[ -z "${DNS[1]}" ] && DNS[1]=1.1.1.1

for PART in "${PARTARR[@]}"; do
  mount "$PART" /mnt || continue
  TARGET=""
  [ -f /mnt/etc/os-release ] && TARGET="/mnt"
  [ -f /mnt/root/etc/os-release ] && TARGET="/mnt/root"
  if [ -n "$TARGET" ]; then
    source "$TARGET"/etc/os-release
    case $ID in
      almalinux|centos|fedora|rocky)  do_redhat ;;
      debian)                         do_debian ;;
      ubuntu)                         do_ubuntu ;;
      *) ;;
    esac
    finish
  fi
  umount /mnt
done

finish
