#!/bin/sh

config=/bin/config
upnp_enable=$($config get upnp_enable)

MINIUPNPD_CONF=/tmp/etc/miniupnpd.conf

upnp_start() {
	[ ! -d /tmp/cache/upnp ] && mkdir -p /tmp/cache/upnp
	touch /tmp/cache/upnp/update_upnp.leases
	
	local proto=$($config get wan_proto)
	local appsystem_os_version="$(cat /proc/version |awk -F ' ' '{print $3}' |awk -F '.' '{print $1"."$2}')"
	local product_name=`cat /module_name |tr '[A-Z]' '[a-z]'`
	local appsystem_product=`echo $product_name |sed 's/v/\//'`

	if [ "$proto" = "pppoe" -o "$proto" = "pptp" -o "$proto" = "mulpppoe1" ]; then
		wan_ifname="ppp0"
	else
		wan_ifname=$($config get wan_ifname)
	fi

	local name=$($config get netbiosname)
	if [ "x$name" = "x" ]; then
		name=$($config get Device_name)
		[ "x$name" = "x" ] && [ -e /hardware_version ] && name="$(cat /hardware_version)"
	fi
	local module_name="$(cat /module_name)"

	local opmode=$($config get i_opmode)

	#local listenip=$(ip addr show dev $($config get lan_ifname) |sed -n 's#.*inet \([0-9.]*\)/.*#\1#p')

	[ -f $MINIUPNPD_CONF ] && rm -f $MINIUPNPD_CONF
	[ ! -d /tmp/etc ] && mkdir /tmp/etc


	echo "ext_ifname=$wan_ifname" >$MINIUPNPD_CONF
	echo "listening_ip=$($config get lan_ifname)" >>$MINIUPNPD_CONF
	echo "port=56688" >>$MINIUPNPD_CONF
	echo "enable_natpmp=yes" >>$MINIUPNPD_CONF
	echo "enable_upnp=yes" >>$MINIUPNPD_CONF
	echo "secure_mode=yes" >>$MINIUPNPD_CONF
	echo "pcp_allow_thirdparty=no" >>$MINIUPNPD_CONF
	echo "system_uptime=yes" >>$MINIUPNPD_CONF
	echo "lease_file=/tmp/upnp.leases" >>$MINIUPNPD_CONF
	echo "notify_interval=$($config get upnp_AdverTime)" >>$MINIUPNPD_CONF
	echo "uuid=$(cat /proc/sys/kernel/random/uuid)" >>$MINIUPNPD_CONF
	echo "time_to_live=$($config get upnp_TimeToLive)" >>$MINIUPNPD_CONF
	if [ "$opmode" = "apmode" -o "$opmode" = "brmode" ]; then
		echo "device_type=apmode"  >>$MINIUPNPD_CONF
		echo "friendly_name=$name (AP)" >>$MINIUPNPD_CONF
	else
		echo "device_type=normal"  >>$MINIUPNPD_CONF
		echo "friendly_name=$name (Gateway)" >>$MINIUPNPD_CONF
	fi
	echo "manufacturer_name=NETGEAR,Inc." >>$MINIUPNPD_CONF
	echo "manufacturer_url=http://www.netgear.com" >>$MINIUPNPD_CONF
	local ax_name="AX8"
	if [ "$module_name" = "RAX10" -o "$module_name" = "RAX10v2" -o "$module_name" = "R6700AXv2" ]; then
		ax_name="AX1800"
	elif [ "$module_name" = "RAX36S" -o "$module_name" = "RAX36" ]; then
		ax_name="AX3000"
	else
		ax_name="AX8"
	fi
	if [ "$module_name" = "RAX10" -o "$module_name" = "RAX10v2" -o "$module_name" = "RAX36S" -o "$module_name" = "RAX36" -o "$module_name" = "R6700AXv2" ]; then
		echo "model_description=NETGEAR $module_name NETGEAR $ax_name $module_name Smart WiFi Router" >>$MINIUPNPD_CONF
		echo "model_name=NETGEAR $ax_name $module_name Smart WiFi Router" >>$MINIUPNPD_CONF
	else
		echo "model_description=NETGEAR $module_name NETGEAR Nighthawk $ax_name $module_name Smart WiFi Router" >>$MINIUPNPD_CONF
		echo "model_name=NETGEAR Nighthawk $ax_name $module_name Smart WiFi Router" >>$MINIUPNPD_CONF
	fi
	echo "model_number=$module_name" >>$MINIUPNPD_CONF
	echo "model_url=http://www.netgear.com/home/products/networking/wifi-routers/$module_name.aspx" >>$MINIUPNPD_CONF
	echo "serial=$(artmtd -r sn | head -1 | awk -F":" '{print $2}')" >>$MINIUPNPD_CONF
	echo "onmodel_desc=NETGEAR $module_name Wireless Router" >>$MINIUPNPD_CONF

	local dev_upc="606449084528"
	echo "dev_upc=${dev_upc}" >>$MINIUPNPD_CONF

	echo "appsystem_os=Linux/$appsystem_os_version" >>$MINIUPNPD_CONF
	echo "appsystem_location=http://updates1.netgear.com/$appsystem_product/ww/$appsystem_product.ddf" >>$MINIUPNPD_CONF
	echo "service_name=Netgear_Router" >>$MINIUPNPD_CONF



	echo "firmware_version=$(cat /firmware_version)" >>$MINIUPNPD_CONF
	local lan_mac=$(/sbin/artmtd -r mac | grep 'lan mac' | awk '{print $3}')
	local lan_mac_convert=$(echo $lan_mac | sed 's/://g' | tr '[A-Z]' '[a-z]')
	echo "uuid_base_mac=$lan_mac_convert" >>$MINIUPNPD_CONF

	# wait a moment ...
	sleep 2

	if [ ! -f /sbin/kwilt ] && [ "$upnp_enable" = "0" ]; then
		echo "No kwilt and upnp disable, so not start miniupnpd." > /dev/console
	else
		iptables -L MINIUPNPD >/dev/null 2>/dev/null || /usr/sbin/net-wall restart

		local args="-f $MINIUPNPD_CONF -w http://www.routerlogin.net"
		/usr/sbin/miniupnpd $args &
	fi
}

upnp_stop() {
	[ "$upnp_enable" = "0" ] && rm -rf /tmp/upnp.leases /tmp/upnp_pmlist
	killall miniupnpd
	iptables -t nat -F MINIUPNPD 2>/dev/null
	iptables -t nat -F MINIUPNPD-LAN 2>/dev/null
	iptables -t filter -F MINIUPNPD 2>/dev/null
}

case "$1" in
	stop)
		upnp_stop
	;;
	start)
		upnp_stop
		upnp_start
	;;
	restart)
		# To fix bug 22659, do nothing for "cmdupnp restart" command if /tmp/upnpIgnoreRestart exits
		[ -f /tmp/upnpIgnoreRestart ] && exit
		upnp_stop
		upnp_start
	;;
esac
