#!/bin/sh

. /etc/profile

gen_hostapd_conf() {
	ssid="${1}"
	pass="${2}"
	echo "ctrl_interface=/var/run/hostapd"
	echo "ctrl_interface_group=0"
	echo "ssid=${ssid}"
	echo "hw_mode=g"
	echo "channel=1"
	echo "beacon_int=100"
	echo "dtim_period=2"
	echo "max_num_sta=255"
	echo "rts_threshold=-1"
	echo "fragm_threshold=-1"
	echo "macaddr_acl=0"
	echo "auth_algs=3"
	echo "wpa=2"
	echo "wpa_passphrase=${pass}"
	echo "ieee80211n=1"
}

gen_udhcpd_conf() {
    interface=${1}
    ipv4_prefix=${2}
    echo "start ${ipv4_prefix}.100"
    echo "end ${ipv4_prefix}.200"
    echo "interface ${interface}"
    echo "pidfile /var/run/udhcpd.${interface}.pid"
    echo "lease_file /var/lib/misc/udhcpd.${interface}.leases"
    echo "option subnet 255.255.255.0"
    echo "option lease 864000"
}

gen_dnsmasq_conf() {
    ipv4_prefix=${1}
    echo "bind-interfaces"
    echo "interface=wlan0"
    echo "address=/config.kvm/${ipv4_prefix}.1"
    echo "no-hosts"
    echo "dhcp-range=${ipv4_prefix}.2,${ipv4_prefix}.254"
    echo "dhcp-option=6,${ipv4_prefix}.1"
    echo "dhcp-option=3,${ipv4_prefix}.1"
    echo "dhcp-authoritative"
}

start() {
    echo "wifi mode: sta"
    ssid=""
    pass=""
    if [ -e /boot/wifi.ssid ] && [ -e /boot/wifi.pass ]; then
        echo "Updating WiFi credentials from /boot to /etc/kvm/"

        rm -f /etc/kvm/wifi.ssid /etc/kvm/wifi.pass

        mv /boot/wifi.ssid /etc/kvm/wifi.ssid
        mv /boot/wifi.pass /etc/kvm/wifi.pass

        chown root:root /etc/kvm/wifi.ssid /etc/kvm/wifi.pass
        chmod 644 /etc/kvm/wifi.ssid /etc/kvm/wifi.pass
    fi
    if [ -e /etc/kvm/wifi.ssid ]
    then
        ssid=`cat /etc/kvm/wifi.ssid`
    fi
    if [ -e /etc/kvm/wifi.pass ]
    then
        pass=`cat /etc/kvm/wifi.pass`
    fi
    echo "ctrl_interface=/var/run/wpa_supplicant" > /etc/wpa_supplicant.conf
    wpa_passphrase "$ssid" "$pass" >> /etc/wpa_supplicant.conf
    wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
    if [ ! -e /boot/wifi.nodhcp ]
    then
        (udhcpc -i wlan0 -t 10 -T 1 -A 5 -b -p /run/udhcpc.wlan0.pid) &
    fi
}

ap_start() {
    echo "wifi mode: ap"
    id2=$(printf "%d" 0x$(sha512sum /sys/class/cvi-base/base_uid | head -c 2))
    id3=$(printf "%d" 0x$(sha512sum /sys/class/cvi-base/base_uid | head -c 4 | tail -c 2))
    if [ "$id2" = "$id3" ]
    then
        id2=$((id2 + 1))
    fi
    if [ "$id2" -ge 255 ]
    then
        id2=253
    fi
    if [ "$id3" -ge 255 ]
    then
        id3=254
    fi
    ssid=""
    pass=""
    if [ -e /kvmapp/kvm/ap.ssid ]
    then
        ssid=`cat /kvmapp/kvm/ap.ssid`
    fi
    if [ -e /kvmapp/kvm/ap.pass ]
    then
        pass=`cat /kvmapp/kvm/ap.pass`
    fi
    gen_hostapd_conf "$ssid" "$pass" > /etc/hostapd.conf
    ipv4_prefix=10.$id3.$id2
    if [ ! -e /etc/udhcpd.wlan0.conf ]
    then
        gen_udhcpd_conf wlan0 "${ipv4_prefix}"  > /etc/udhcpd.wlan0.conf
    fi
    # gen_dnsmasq_conf "${ipv4_prefix}"  > /etc/dnsmasq.conf

    # iptables --policy INPUT ACCEPT
    # iptables --policy FORWARD ACCEPT
    # iptables --policy OUTPUT ACCEPT
    # iptables -F
    # iptables -t nat -F
    # iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j DNAT --to ${ipv4_prefix}.1

    ifconfig wlan0 up
    ip route del default || true
    ip add flush dev wlan0
    ip addr add $ipv4_prefix.1/24 dev wlan0
    # dnsmasq --pid-file=/tmp/dnsmasq.run -C /etc/dnsmasq.conf
    hostapd -B -i wlan0 /etc/hostapd.conf
    udhcpd -S /etc/udhcpd.wlan0.conf
}

stop() {
	ps -ef|grep hostapd|grep -v grep|awk '{print $1}'|xargs kill -2 || true
	ps -ef|grep "udhcpd -S /etc/udhcpd.wlan0.conf" |grep -v grep|awk '{print $1}'|xargs kill -2 || true
	killall wpa_supplicant || true
	if [ -e /run/udhcpc.wlan0.pid ]
	then
		kill `cat /run/udhcpc.wlan0.pid` || true
		rm -f /run/udhcpc.wlan0.pid
	fi
	if [ -e /var/run/udhcpd.wlan0.pid ]
	then
		kill `cat /var/run/udhcpd.wlan0.pid`  || true
		rm -f /var/run/udhcpd.wlan0.pid
	fi
	if [ -e /tmp/dnsmasq.run ]
	then
		kill `cat /tmp/dnsmasq.run`  || true
		rm -f /tmp/dnsmasq.run
	fi
	# if [ -e /etc/wpa_supplicant.conf]
	# then
	# 	echo > /etc/wpa_supplicant.conf
	# fi
	airmon-ng stop wlan0mon || true
}

restart() {
	stop
	start
}

if [ "${1}" = "start" ]
then
	start
elif [ "${1}" = "stop" ]
then
	stop
elif [ "${1}" = "ap" ]
then
    stop
	ap_start
elif [ "${1}" = "restart" ]
then
	restart
fi
