#!/bin/bash

# Copyright (C) 2014 Multi-Tech Systems

# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

dhcpd_file=/etc/udhcpd.conf
hostapd_file=/etc/hostapd.conf
interface=wlan0
bridge_mode=0

do_start() {
	if [ "$bridge_mode" = 1 ]; then
		interface=$b
		if ! grep -E -q "^bridge=$interface\s*$" $hostapd_file; then
			echo "Enabling bridge=br0 in $hostapd_file"
			sed -r -i "s/^#?bridge=.*$/bridge=$interface/" $hostapd_file 
		fi
	else
		if grep -E -q "^bridge=.*$" $hostapd_file; then
			echo "Disabling bridge in $hostapd_file"
			sed -r -i "s/^bridge=/#bridge=/" $hostapd_file 
		fi
	fi

	echo "Starting hostap daemon"
	/etc/init.d/hostapd start

	if [ "$bridge_mode" != 1 ]; then
		echo "Setting IP address to $ip"
		ifconfig $interface $ip
		# strip off end of IP address to get subnet
		# assumes subnet of /24
		subnet=${ip%.*}
		# escape periods for regex
		subnet_regex=${subnet//./\\.}
		ip_regex=${ip//./\\.}
		# set default address range for dhcpd
		addr_start=100
		addr_end=254
		if ! grep -E -q "^start\s+$subnet_regex\." $dhcpd_file; then
			echo "Changing dhcpd start to $subnet.$addr_start"
			sed -r -i "s/^start\s+.*$/start $subnet.$addr_start/" $dhcpd_file 
		fi
		if ! grep -E -q "^end\s+$subnet_regex\." $dhcpd_file; then
			echo "Changing dhcpd end to $subnet.$addr_end"
			sed -r -i "s/^end\s+.*$/end $subnet.$addr_end/" $dhcpd_file 
		fi
		# update dhcpd addresses if needed
		if ! grep -E -q "^option\s+router\s+$ip_regex" $dhcpd_file; then
			echo "Changing dhcpd router to $ip"
			sed -r -i "s/^option\s+router\s+.*$/option router $ip/" $dhcpd_file 
		fi
	else
		# unset ip address for bridge mode
		ifconfig wlan0 0.0.0.0
	fi

	if ! grep -E -q "^interface\s+$interface" $dhcpd_file; then
		echo "Changing dhcpd interface to $interface"
		sed -r -i "s/^interface\s+.*$/interface $interface/" $dhcpd_file 
	fi
	mlinux-dhcpd start
}

do_stop() {
	echo "Stopping hostap daemon"
	/etc/init.d/hostapd stop
	mlinux-dhcpd stop
}

usage() {
	echo "Usage: $(basename $0) start|stop|restart [options]"
	echo "  options:"
	echo "    -a <address>    Sets AP IP address (defaults to 192.168.3.1)"
	echo "    -b <interface>  Add AP to specified bridge interface (conflicts with -a)"
	exit 1
}

# main
if [[ $# < 1 ]]; then
	usage
fi

cmd=$1
shift

while getopts "a:b:h" opt; do
	case "$opt" in
		a)
			a=$OPTARG
			;;
		b)
			b=$OPTARG
			bridge_mode=1
			;;
		h)
			usage
			;;
		*)
			usage
			;;
	esac
done

# can't specify both address and bridge mode
if [ -n "$a" ] && [ -n "$b" ]; then
	usage
fi

if [ -n "$a" ]; then
	ret=1
	if [[ $a =~ ^([0-9]{1,3}\.){3,3}[0-9]{1,3}$ ]]
	then
		OIFS=$IFS
		IFS='.'
		ip=($a)
		IFS=$OFIS
		[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
		ret=$?
	fi
	if [[ ret -ne 0 ]]
	then
		echo "invalid IP address"
		exit 1
	fi
	ip=$a
else
	ip="192.168.3.1"
fi

case $cmd in
	start)
		do_start
		;;
	stop)
		do_stop
		;;
	restart)
		do_stop
		sleep 1
		do_start
		;;
	*)
		usage
		;;
esac

exit 0
