#!/bin/bash

if [ -z "$1" ]; then
  echo "Usage: $0 eth0|eth1|...|all [hostname]"
  exit
fi

. `dirname $0`/salpack-functions

show() {
  echo "=== File: $1"
  #cat $1
  diff -u /tmp/`basename $1` $1
}

get_ip_addr() {
  #ifconfig $device | grep "^ *inet " | sed 's/.*inet \(addr:\|\)\([0-9.]*\).*/\2/'
  ip -4 -o addr show dev $device | awk '{ print $4 }' | cut -d/ -f1
}

get_netmask() {
  #ifconfig $device | grep "^ *inet " | sed 's/.*\(Mask:\|netmask \)\([0-9.]*\).*/\2/'
  ipmask=`ip -4 -o addr show dev $device | awk '{ print $4 }'`
  if [ "$ipmask" ]; then
    ipcalc --netmask $ipmask | cut -d= -f2
  fi
}

update_localhost() {
  if get_yes_no DEL_LOCALHOST "Remove IPv6 localhost from /etc/hosts?"; then
    sed -i~ 's/^\(::1 *\)localhost \+localhost.localdomain /\1/' /etc/hosts
  fi
}

if [ "$2" ]; then
  # update hostname
  hostname "$2"
  if [ -f /etc/hostname ]; then
    cp -a /etc/hostname /tmp
    echo $2 > /etc/hostname
    show /etc/hostname
  else
    cp -a /etc/sysconfig/network /tmp/
    sed -i 's/^HOSTNAME=.*$/HOSTNAME='$2'/' /etc/sysconfig/network
    show /etc/sysconfig/network
  fi
fi

if [ "$1" = "all" ]; then
  devs=`cd /sys/class/net; echo eth* em* p*p* eno* ens* enp*`
else
  devs="$1"
fi

for device in $devs; do
  nscfg="/etc/sysconfig/network-scripts/ifcfg-$device"
  nmcfg="/etc/NetworkManager/system-connections/$device.nmconnection"
  if [ -f "$nmcfg" ]; then
    # use NetworkManager configuration
    nmget() {
      nmcli -g "$1" con show "$device" | tr '|' ','
    }
    ip_mask=`nmget IP4.ADDRESS`
    gw=`nmget IP4.GATEWAY`
    dns=`nmget IP4.DNS`
    nmcli con mod "$device" ifname "$device" \
      ip4 "$ip_mask" gw4 "$gw" \
      ipv4.method manual \
      ipv4.dns "$dns"
    nmcli con up "$device"
  elif [ -f "$nscfg" ]; then
    . $nscfg
    if [ "$BOOTPROTO" = "dhcp" ]; then
      cp -a $nscfg /tmp/
      sed -i 's/BOOTPROTO=dhcp/BOOTPROTO=static/' $nscfg
      sed -i 's/BOOTPROTO="dhcp"/BOOTPROTO="static"/' $nscfg
      gw=`ip route show | grep '^default via' | cut -d" " -f3`
      gwdev=`ip route show | grep '^default via' | cut -d" " -f5`
      ip=`get_ip_addr $device`
      mask=`get_netmask $device`
      echo "IPADDR=$ip" >> $nscfg
      echo "NETMASK=$mask" >> $nscfg
      if [ "$device" = "$gwdev" ]; then
        echo "GATEWAY=$gw" >> $nscfg
        cp -a /etc/hosts /tmp/
        grep -q "^$ip" /etc/hosts \
          || (echo -e "$ip\t$2" >> /etc/hosts)
        show /etc/hosts
      fi
      show $nscfg
    else
      echo "$device already static"
    fi
  fi
done

update_localhost
