#!/bin/bash

ACTION=$1
INPUT=$2

offload="system offload"

cmd=/opt/vyatta/sbin/vyatta-cfg-cmd-wrapper
run=/opt/vyatta/bin/vyatta-op-cmd-wrapper
cli=cli-shell-api

parse () {
  local var=$1
  local exp=$2
  local val=$(cat $INPUT | jq "$exp" 2>/dev/null)
  if [ $(expr index "$exp" []) -eq 0 ]; then
    eval "$var=$val"
  else
    eval "$var=($val)"
  fi
}

load () {
  temp=$(mktemp)
  $run show ubnt offload | awk -F: 'NF>0 {gsub(/( )+/,"",$1);gsub("offloadmodule","",$1);print $1 $2}' >$temp
  ipv4=''
  ipv6=''
  ipsec=''
  select=''
  while read -ra data; do
    case "${data[0]}" in
    IPv4 | IPv6)
      select=${data[0]} ;;
    forwarding | vlan | pppoe)
      if [ "${data[1]}" == "enabled" ]; then
        case "$select" in
        IPv4)
          [ -n "$ipv4" ] && ipv4+=','
          ipv4+=${data[0]} ;;
        IPv6)
          [ -n "$ipv6" ] && ipv6+=','
          ipv6+=${data[0]} ;;
        esac
      fi ;;
    IPSec)
      if [ "${data[1]}" == "loaded" ]; then
        ipsec=forwarding
      fi ;;
    esac
  done <$temp
  rm -f $temp

  echo "{\"success\":\"1\",\"data\":{\"four\":\"$ipv4\",\"six\":\"$ipv6\",\"ipsec\":\"$ipsec\"}}"
}

apply () {
  local ret=0
  local output=''

  parse ipv4 '."four"[]'
  parse ipv6 '."six"[]'
  parse ipsec '."ipsec"'

  temp=$(mktemp)
  (
  $cmd begin
  for t in forwarding vlan pppoe; do
    mode=disable
    if [[ "${ipv4[*]}" =~ "$t" ]]; then
      mode=enable
    fi
    if ! $cmd set $offload ipv4 $t $mode ; then
      ret=1
      break
    fi
    mode=disable
    if [[ "${ipv6[*]}" =~ "$t" ]]; then
      mode=enable
    fi
    if ! $cmd set $offload ipv6 $t $mode ; then
      ret=1
      break
    fi
  done
  if [ $ret == 0 ]; then
    mode=disable
    if [ "$ipsec" == "forwarding" ]; then
      mode=enable
    fi
    $cmd set $offload ipsec $mode || ret=1
  fi
  if [ $ret == 0 ]; then
    $cmd commit || ret=1
  fi
  if [ $ret == 0 ]; then
    $cmd save || ret=1
  fi
  $cmd end
  exit $ret
  ) >$temp 2>&1
  ret=$?

  output=$(cat $temp)
  rm -f $temp

  if [ $ret == 0 ]; then
    echo "{\"success\":\"1\"}"
  else
    echo "{\"success\":\"0\",\"error\": \"${output//\"/\'}\"}"
  fi
}

case "$ACTION" in
load)
  load ;;
apply)
  apply ;;
esac