#!/opt/bin/sh

lineId=0

check_modem() {
if [ "$(ndmc -c "show usb" | grep "name" | grep -o "UsbQmi")" == "" ]; then exit; fi
}

install_driver() {
#opkg install /opt/asterisk-chan-quectel_3.5-1_mipsel-3.4.ipk
#rm /opt/asterisk-chan-quectel_3.5-1_mipsel-3.4.ipk
opkg install asterisk-chan-quectel
cp /opt/etc/asterisk/scripts/quectel.conf /opt/etc/asterisk/
rm /opt/etc/asterisk/scripts/quectel.conf
}

add_extensions_template() {
if [ "$(cat /opt/etc/asterisk/extensions.conf | grep -o "quectel")" != "" ]; then return; fi
cat /opt/etc/asterisk/scripts/mobile-extensions-template.conf >> /opt/etc/asterisk/extensions.conf
rm /opt/etc/asterisk/scripts/mobile-extensions-template.conf
}

add_pjsip_template() {
if [ "$(cat /opt/etc/asterisk/pjsip.conf | grep -o "mobile")" != "" ]; then return; fi
cat /opt/etc/asterisk/scripts/mobile-pjsip-template.conf >> /opt/etc/asterisk/pjsip.conf
rm /opt/etc/asterisk/scripts/mobile-pjsip-template.conf
}

check_nvox() {
if [ "$(ndmc -c "show version" | grep -o "nvox")" == "nvox" ]; then return; else exit; fi
}

check_line() {
if [ "$(ndmc -c "show nvox sip-lines" | grep -o "name: mobile")" != "" ]; then /opt/bin/logger "Line 'mobile' already exists"; exit; fi
}

check_telephony_type() {
ndmc -c 'show nvox info' | grep "tel_type:" | sed 's/tel_type: //g' | sed 's/[ \n\r]//g'
}

wait_nvox_start() {
local cnt=0
ndmc -c "service nvox" > /dev/null
while true
do
if [ $cnt -eq 20 ]; then return; fi
if [ "$(check_telephony_type)" != "" ]; then return; fi
let cnt+=1
/opt/bin/logger 'Waiting for NVOX started'
sleep 1
done
}

add_sip_line() {
ndmc -c "no service nvox" > /dev/null
ndmc -c "nvox sip $1" > /dev/null
ndmc -c "nvox sip $1 name $2" > /dev/null
ndmc -c "nvox sip $1 identity $2" > /dev/null
ndmc -c "nvox sip $1 priority $1" > /dev/null
ndmc -c "nvox sip $1 display-name $2" > /dev/null
ndmc -c "nvox sip $1 registration-uri localhost" > /dev/null
ndmc -c "nvox sip $1 login $3" > /dev/null
ndmc -c "nvox sip $1 password ast18-opkg-mipsel" > /dev/null
ndmc -c "nvox sip $1 domain localhost" > /dev/null
ndmc -c "nvox sip $1 proxy localhost:6060" > /dev/null
ndmc -c "nvox sip $1 keepalive 0" > /dev/null
ndmc -c "nvox sip $1 disable-stun" > /dev/null
}

get_line_id() {
local i=1
for i in 1 2 3 4 5 6 7 8 9 10
do
if [ "$(ndmc -c "show nvox sip-lines" | grep -o "id: $i")" == "" ]
then echo $i; return
fi
done
let i=1; echo $i; return
}

bind_dect_hs() {
local i=1
local cnt=0
local data=""
while true
do
if [ $cnt -eq 3 ]; then return; fi
if [ "$(ndmc -c 'show nvox handsets' | sed "$i!d" | grep ":")" == "" ]; then let cnt+=1; let i+=1; continue; else let cnt=0; fi
data=$(ndmc -c 'show nvox handsets' | sed -n "$i!d /ipui:/p" | sed 's/ipui: //g' | sed 's/[ \n\r]//g')
if [ "$data" != "" ]
	then 
		/opt/bin/logger "Binding IPUI $data to the phone line"
		ndmc -c "nvox sip $1 incoming-mask $data" > /dev/null
		ndmc -c "nvox sip $1 outgoing-mask $data" > /dev/null
		let cnt=0
	fi
let i+=1
done
}

bind_fxs_ports() {
/opt/bin/logger 'Binding FXS1 and FXS2 to the phone line'
ndmc -c "nvox sip $1 incoming-mask 1" > /dev/null
ndmc -c "nvox sip $1 outgoing-mask 1" > /dev/null
ndmc -c "nvox sip $1 incoming-mask 2" > /dev/null
ndmc -c "nvox sip $1 outgoing-mask 2" > /dev/null
}

load_driver() {
asterisk -x "module load chan_quectel"
sleep 2
}

restart_asterisk() {
asterisk -x "core restart now"
sleep 10
}



#============================ MAIN ============================
check_modem
/opt/bin/logger 'USB Modem found, installing driver asterisk-chan-quectel'
install_driver
/opt/bin/logger 'Configuring extension 'mobile' and dialplan for mobile calls.'
add_extensions_template
add_pjsip_template
restart_asterisk
load_driver
check_nvox
check_line
/opt/bin/logger "Configuring phone line 'mobile' for mobile calls."
lineId=$(get_line_id)
add_sip_line ${lineId} "mobile" "keenetic"
wait_nvox_start
bind_dect_hs $lineId
bind_fxs_ports $lineId
ndmc -c "copy running-config startup-config"

