#!/bin/sh
set -e
name_of_kv() {
  echo "$1" | cut -d= -f1
}
uninstall_network_speedify() {
  if uci show network.speedify 1> /dev/null 2>& 1
  then uci delete network.speedify
  fi
  # Devices might not preserve order if remove in low->high index order, so sort -r
  uci show network | grep -E "@device\[[0-9]+\].name='connectify0'" | grep -oE '.*device\[[0-9]+\]' | uniq | sort -r | while read entry
  do uci delete "$entry" 2> /dev/null || echo "Failed: uci delete $entry"
  done
}
uninstall_firewall_speedify() {
  # In reverse (sort -r), otherwise deleting the last forwarding rule seems not to apply (without errors).
  uci show firewall | grep -E "@forwarding\[[0-9]+\].(src|dest)='speedify'" | grep -oE '.*forwarding\[[0-9]+\]' | uniq | sort -r | while read entry
  do uci delete "$entry" 2> /dev/null || echo "Failed: uci delete $entry"
  done
  uci show firewall | grep -E "@forwarding\[[0-9]+\].(src|dest)=.+'speedify'" | grep -oE '.*forwarding\[[0-9]+\]' | uniq | while read entry
  do uci del_list "$entry=speedify" 2> /dev/null || echo "Failed: uci del_list $entry=speedify"
  done
  uci show firewall | grep -E "@zone\[[0-9]+\].(name|network)='speedify'" | grep -oE '.*zone\[[0-9]+\]' | uniq | while read entry
  do uci delete "$entry" 2> /dev/null || echo "Failed: uci delete $entry"
  done
  uci show firewall | grep -E "@zone\[[0-9]+\].device='connectify0'" | while read kv
  do uci delete "$(name_of_kv "$kv")" 2> /dev/null || echo "Failed: uci delete $(name_of_kv "$kv")"
  done
  uci show firewall | grep -E "@zone\[[0-9]+\].network=.*?'speedify'.*?" | while read kv
  do uci del_list "$(name_of_kv "$kv")=speedify" 2> /dev/null || echo "Failed: uci del_list $(name_of_kv "$kv")=speedify"
  done
}
ec=0
echo "Stopping and disabling Speedify's system service..."
/etc/init.d/speedify disable || ec=$?
/etc/init.d/speedify stop || ec=$?
echo "Removing Speedify's network and firewall rules..."
uninstall_firewall_speedify || ec=$?
uninstall_network_speedify || ec=$?
uci commit || ec=$?
echo "Restarting the network and firewall after rule changes..."
/etc/init.d/firewall restart &> /tmp/speedify-prerm-err-log.txt || {
  ec=$?
  echo "Firewall restart failed (ec: $ec) with errors:"
  cat /tmp/speedify-prerm-err-log.txt
}
/etc/init.d/network restart &> /tmp/speedify-prerm-err-log.txt || {
  ec=$?
  echo "Network restart failed (ec: $ec) with errors:"
  cat /tmp/speedify-prerm-err-log.txt
}
rm -f /tmp/speedify-prerm-err-log.txt
if [ $ec -eq 0 ]
then echo "Successfully removed Speedify's network, firewall and system service"
else echo "Errors occurred while removing Speedify's network, firewall or system service"
fi
exit $ec
