#!/bin/bash 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 ocg-dhcpd start } do_stop() { echo "Stopping hostap daemon" /etc/init.d/hostapd stop ocg-dhcpd stop } usage() { echo "Usage: $(basename $0) start|stop|restart [options]" echo " options:" echo " -a
Sets AP IP address (defaults to 192.168.3.1)" echo " -b 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