#!/bin/sh

yggConfig="/etc/config/yggdrasil"

first_boot_genConfig()
{
  . /usr/share/libubox/jshn.sh
  boardcfg=$(ubus call system board)
  touch ${yggConfig}
  yggdrasil -genconf -json | ygguci set

  json_load "$boardcfg"
  json_get_var kernel     kernel
  json_get_var system     system
  json_get_var model      model
  json_get_var board_name board_name
  nodeinfo='{"kernel": "'$kernel'", "hostname":"'OpenWrt'", "system": "'$system'", "model": "'$model'", "board_name": "'$board_name'"}'

  uci set yggdrasil.yggdrasil.IfName="ygg0"
  uci set yggdrasil.yggdrasil.NodeInfo="$nodeinfo"
  uci commit yggdrasil
}

if [ -e /etc/yggdrasil.conf ]; then
  echo "config: import config from /etc/yggdrasil.conf to /etc/config/yggdrasil" | logger -t yggdrasil 
  touch ${yggConfig}
  cat /etc/yggdrasil.conf | ygguci set
  mv /etc/yggdrasil.conf /etc/yggdrasil.conf.bak 
elif [ ! -e ${yggConfig} ]; then
  echo "first_boot: adding system board details to NodeInfo[] in NEW config: ${yggConfig}" | logger -t yggdrasil

  first_boot_genConfig

  # create the network interface
  uci -q batch <<-EOF >/dev/null
    set network.yggdrasil=interface
    set network.yggdrasil.device=ygg0
    set network.yggdrasil.proto=none
EOF

  # create the firewall zone
  uci -q batch <<-EOF >/dev/null
    set firewall.yggdrasil=zone
    set firewall.yggdrasil.name=yggdrasil
    add_list firewall.yggdrasil.network=yggdrasil
    set firewall.yggdrasil.input=REJECT
    set firewall.yggdrasil.output=ACCEPT
    set firewall.yggdrasil.forward=REJECT
    set firewall.yggdrasil.conntrack=1
EOF

  # allow ICMP from yggdrasil zone, e.g. ping6
  uci -q batch <<-EOF >/dev/null
    add firewall rule
    set firewall.@rule[-1].name='Allow-ICMPv6-yggdrasil'
    set firewall.@rule[-1].src=yggdrasil
    set firewall.@rule[-1].proto=icmp
    add_list firewall.@rule[-1].icmp_type=echo-request
    add_list firewall.@rule[-1].icmp_type=echo-reply
    add_list firewall.@rule[-1].icmp_type=destination-unreachable
    add_list firewall.@rule[-1].icmp_type=packet-too-big
    add_list firewall.@rule[-1].icmp_type=time-exceeded
    add_list firewall.@rule[-1].icmp_type=bad-header
    add_list firewall.@rule[-1].icmp_type=unknown-header-type
    set firewall.@rule[-1].limit='1000/sec'
    set firewall.@rule[-1].family=ipv6
    set firewall.@rule[-1].target=ACCEPT
EOF

  # allow SSH from yggdrasil zone, needs to be explicitly enabled
  uci -q batch <<-EOF >/dev/null
    add firewall rule
    set firewall.@rule[-1].enabled=0
    set firewall.@rule[-1].name='Allow-SSH-yggdrasil'
    set firewall.@rule[-1].src=yggdrasil
    set firewall.@rule[-1].proto=tcp
    set firewall.@rule[-1].dest_port=22
    set firewall.@rule[-1].target=ACCEPT
EOF

  # allow LuCI access from yggdrasil zone, needs to be explicitly enabled
  uci -q batch <<-EOF >/dev/null
    add firewall rule
    set firewall.@rule[-1].enabled=0
    set firewall.@rule[-1].name='Allow-HTTP-yggdrasil'
    set firewall.@rule[-1].src=yggdrasil
    set firewall.@rule[-1].proto=tcp
    set firewall.@rule[-1].dest_port=80
    set firewall.@rule[-1].target=ACCEPT
EOF

  # allow LuCI access with SSL from yggdrasil zone, needs to be explicitly enabled
  uci -q batch <<-EOF >/dev/null
    add firewall rule
    set firewall.@rule[-1].enabled=0
    set firewall.@rule[-1].name='Allow-HTTPS-yggdrasil'
    set firewall.@rule[-1].src=yggdrasil
    set firewall.@rule[-1].proto=tcp
    set firewall.@rule[-1].dest_port=443
    set firewall.@rule[-1].target=ACCEPT
EOF

  uci commit firewall
  uci commit network

else
  :
fi

exit 0
