#!/bin/sh 
##################################################################

. /usr/lib/webif/webif.sh
. /etc/functions.sh
uci_load "asterisk"
uci_load "webif"

##################################################################
#####                Removing old configuration              #####
##################################################################
rm -rf /etc/asterisk/sip.conf
rm -rf /etc/asterisk/mspd.conf
rm -rf /etc/asterisk/extensions.conf
rm -rf /etc/asterisk/voicemail.conf

##################################################################
#####              Reading allowed codec types               #####
##################################################################
config_get ulaw general codec_ulaw
config_get alaw general codec_alaw
config_get g729 general codec_g729
config_get g722 general codec_g722
config_get g723 general codec_g723
config_get iLBC general codec_iLBC
config_get iLBC_1 general codec_iLBC_1
config_get g726_32 general codec_g726_32
config_get g726_40 general codec_g726_40
config_get g726_16 general codec_g726_16
config_get g726_24 general codec_g726_24
config_get amr general codec_amr
config_get bitrate_amr general bitrate_codec_amr
config_get amr_wb general codec_amr_wb
config_get bitrate_amr_wb general bitrate_codec_amr_wb
config_get ip general ipaddr_other_ast
config_get dial_timeout general dial_timeout
config_get interdigit_timeout general interdigit_timeout
config_get ntt general ntt
config_get band general band
config_get board general device_name
config_get passthru_mode general passthru_mode

if [ "$ntt" = "yes" ]; then
    var_ntt=1
else
    var_ntt=0
fi

if [ "$passthru_mode" = "yes" ]; then
    passthru=1
else
    passthru=0
fi

codec=""
[ "$amr_wb" = "yes" ] && codec=amr_wb
[ "$amr" = "yes" ] && codec=amr,$codec
[ "$g726_24" = "yes" ] && codec=g726_24,$codec
[ "$g726_16" = "yes" ] && codec=g726_16,$codec
[ "$g726_40" = "yes" ] && codec=g726_40,$codec
[ "$g726_32" = "yes" ] && codec=g726_32,$codec
[ "$iLBC_1" = "yes" ] && codec=iLBC_1,$codec
[ "$iLBC" = "yes" ] && codec=iLBC,$codec
[ "$g729" = "yes" ] && codec=g729,$codec
[ "$g722" = "yes" ] && codec=g722,$codec
[ "$g723" = "yes" ] && codec=g723,$codec
[ "$alaw" = "yes" ] && codec=alaw,$codec
[ "$ulaw" = "yes" ] && codec=ulaw,$codec

##################################################################
#####           Setting MAC address in mspd.conf             #####
##################################################################
mac=`ifconfig eth0 | grep HWaddr | cut -d ' ' -f 11`

##################################################################
#####              Wideband codec settings                   #####
##################################################################
config_get no_of_pots general no_of_pots
if [ "$board" = "Mindspeed Comcerto 1000" ];then
    if [ "$band" = "narrow" ]; then
        band_cmd="wideband=0"
        echo "2" > /proc/proslic/tdm_coding
        echo "proslic tdm_coding=2 flash_time=500 spi_cs=0 no_of_pots=$no_of_pots" > /etc/modules.d/39-proslic
    elif [ "$band" = "wide" ]; then
        band_cmd="wideband=1"
        echo "4" > /proc/proslic/tdm_coding
        echo "proslic tdm_coding=4 flash_time=500 spi_cs=0 no_of_pots=$no_of_pots" > /etc/modules.d/39-proslic
    fi
fi

##################################################################
#####             Unified diagnostic settings                #####
##################################################################
config_get dst_ipaddr ud dst_ipaddr
config_get sport ud sport
config_get dport ud dport
config_get all ud all
    [ -n "$all" ] || all="0"
config_get tdm_tx ud tdm_tx
    [ -n "$tdm_tx" ] || tdm_tx="0"
config_get tdm_rx ud tdm_rx
    [ -n "$tdm_rx" ] || tdm_rx="0"
config_get spu_iopram ud spu_iopram
    [ -n "$spu_iopram" ] || spu_iopram="0"
config_get spu_in ud spu_in
    [ -n "$spu_in" ] || spu_in="0"
config_get spu_out ud spu_out
    [ -n "$spu_out" ] || spu_out="0"
config_get packet_tx ud packet_tx
    [ -n "$packet_tx" ] || packet_tx="0"
config_get packet_rx ud packet_rx
    [ -n "$packet_rx" ] || packet_rx="0"
config_get ud_report ud ud_report
    [ -n "$ud_report" ] || ud_report="0"

##################################################################
#####          External SIP Proxy server settings            #####
##################################################################
#qualify_cmd="qualify=15"
config_get enable_proxy extproxy enable_proxy
if [ "$enable_proxy" ]; then
    #qualify_cmd=";qualify=15"
    config_get login_name extproxy login_name
    config_get ext_pxy_pwd extproxy ext_pxy_pwd
    config_get addr_type extproxy addr_type
    config_get patternphno extproxy patternphno
    if [ "$addr_type" = "ipaddress" ] ; then
        config_get address extproxy ipaddress
    else 
        config_get address extproxy domainname
    fi
    
    if  [ -z "$login_name" ] || [ -z "$ext_pxy_pwd" ] || [ -z "$address" ] ; then
        register_cmd=
        auth_cmd=
    else
        register_cmd="register => $login_name:$ext_pxy_pwd@$address"
        config_get auth extproxy sip_auth
        if [ "$auth" = "enable" ] ; then
            auth_cmd="[authentication]
            auth => $login_name:$ext_pxy_pwd@$address"
        elif [ "$auth" = "disable" ] ; then
            auth_cmd="insecure=invite"
        fi
    fi

    if  [ -z "$patternphno" ] || [ -z "$address" ] ; then
        extpxyinc_cmd=
        extpxycntx_cmd=
    else
        extpxyinc_cmd="include => external-proxy"
        extpxycntx_cmd="[external-proxy]
        exten => $patternphno,1,Macro(stdinterasterisk,SIP/\${EXTEN}@$address,,)"
    fi
fi

##################################################################
#####                    Creating sip.conf                   #####
##################################################################
#$qualify_cmd
echo ";
;DO NOT MODIFY, FILE AUTOMATICALLY GENERATED BY SCRIPT "configure_asterisk"
;

[general]
context=default                 ; Default context for incoming calls
bindport=5060                   ; UDP Port to bind to (SIP standard port is 5060)
bindaddr=0.0.0.0                ; IP address to bind to (0.0.0.0 binds to all)
srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
disallow=all
allow=$codec                	;also defines preference
dtmfmode=rfc2833
$register_cmd
$auth_cmd

;A.B.C.D is IP-Address of other board
;replace A.B.C.D and reload configuration files

" >> /etc/asterisk/sip.conf

##################################################################
#####                 Creating mspd.conf                     #####
##################################################################
echo \
";
;! DO NOT MODIFY! THE FILE IS AUTOMATICALLY GENERATED BY \"/lib/asterisk/configure_asterisk\" SCRIPT
;

[global]
context=default                     ;context for calls originating from this channel module
callgroups=1                        ;put calls to MSPD-channels into these groups
pickupgroups=1                      ;MSPD-channels can pickup calls in these groups
ipaddr=169.254.0.1                  ;CSP eth1 IP-address
allow=$codec                        ;also defines preference"  >> /etc/asterisk/mspd.conf
[ "$amr" = "yes" ] &&    echo "bitrate_amr=$bitrate_amr"       >> /etc/asterisk/mspd.conf
[ "$amr_wb" = "yes" ] && echo "bitrate_amr_wb=$bitrate_amr_wb" >> /etc/asterisk/mspd.conf
echo \
"dtmfmode=inband
dial_timeout=$dial_timeout                 ; msec minimum and default value 8000 msec
interdigit_timeout=$interdigit_timeout     ; msec minimum and default value 1300 msec
ntt_callerid=$var_ntt
passthru_mode=$passthru
$band_cmd

[device]
name=msp
csmfile=/dev/m821xx0                ; device-file for csm access (Do not modify)
dcifile=/dev/dci0                   ; device-file for dci access (Do not modify)
firmware=/lib/firmware/msp.axf      ; Firmware to load into device (Do not modify)
reset=0                             ; Reset device (Do not modify)
srcmac=$mac            ; MSP(ETH0) Mac Address (Do not modify)
dstmac=00:AA:BB:CC:DD:EE            ; ETH1 Mac Address (Do not modify)
ipaddr=169.254.0.2                  ; MSP IP-address that will be used (Must be in the same network as ipaddr paarmeter)

[tdmbus]
name=slic                           ;name of this TDM-bus
device=msp                          ;device of this TDM-bus
bus-id=0x0200                       ;STI type/index of this bus (0x0200 == slic0)
lines=5                             ;number of lines (timeslots 0..n-1)
istrunk=0                           ;not trunk -> can only be called via phone
param1=0x8320
param2=0x0400
param3=0x0000
param4=0x0000

" >> /etc/asterisk/mspd.conf

##################################################################

[ -n "$dst_ipaddr" ] && {
echo "
[ud_info]
ud_enable=$all
ud_dest_ip_addr=$dst_ipaddr
ud_src_port=$sport
ud_dest_port=$dport
ud_tdm_tx=$tdm_tx
ud_tdm_rx=$tdm_rx
ud_spu_io_params=$spu_iopram
ud_spu_instream=$spu_in
ud_spu_outstream=$spu_out
ud_pkt_tx=$packet_tx
ud_pkt_rx=$packet_rx
ud_report_cmd=$ud_report
" >> /etc/asterisk/mspd.conf
}

##################################################################
#####               Creating extensions.conf                 #####
##################################################################
echo ";
;DO NOT MODIFY, FILE AUTOMATICALLY GENERATED BY SCRIPT "configure_asterisk"
;

[general]
static=yes
writeprotect=no

[default]
include => phones
include => parkedcalls
include => conference
$extpxyinc_cmd

[phones] 
" >> /etc/asterisk/extensions.conf
echo "exten => _9XXX,1,Macro(stdexten,MSPD_FXO/\${EXTEN:1},,104)

;connecting to other network which has 1XX numbers thru SIP protocol
;A.B.C.D is IP-Address of other board
;replace A.B.C.D and reload configuration files
;exten => _4xx,1,Macro(stdexten,SIP/\${EXTEN}@$ip,,401)
;connecting to other network which has 2XX numbers thru SIP protocol
;exten => _5xx,1,Macro(stdexten,SIP/\${EXTEN}@$ip,,401) 
" >> /etc/asterisk/extensions.conf

##################################################################
######                 Creating voicemail.conf               #####
##################################################################
echo "
;
;DO NOT MODIFY, FILE AUTOMATICALLY GENERATED BY SCRIPT "configure_asterisk"
;

[general]
review=yes
format=gsm
serveremail=asterisk
attach=yes
skipms=3000
maxsilence=10
maxlogins=3
silencethreshold=128
emaildateformat=%A, %B %d, %Y at %r
sendvoicemail=yes  

[default]
" >> /etc/asterisk/voicemail.conf 

##################################################################
#####              Analog Phones Configuration               #####
##################################################################
config_get analogphones general analogphones
phone=1
while [ "$phone" -le "$analogphones" ]
do
    config_get name analog$phone name
    config_get number analog$phone number
    config_get voicemail analog$phone voicemail
    config_get field_dsp_acp analog$phone field_dsp_acp
    config_get field_vad analog$phone field_vad
        
    case $field_dsp_acp in
    enable) dsp_acp="1";;
    *) dsp_acp="0";;
    esac
        
    case $field_vad in
    enable) vad="1";;
    *) vad="0";;
    esac
        
    config_get ud_enable ud phone$phone
    [ -n "$ud_enable" ] || ud_enable="0"

##################################################################
#####              Echo Cancellation settings                #####
##################################################################
    config_get field_ec_enable analog$phone field_ec_enable
    config_get field_dc_filter_enable analog$phone field_dc_filter_enable
    config_get field_hec_filter_enable analog$phone field_hec_filter_enable
    config_get field_npl_control_enable analog$phone field_npl_control_enable
    config_get npl_tune analog$phone npl_tune
    config_get field_comfort_noise analog$phone field_comfort_noise
    config_get field_ec_tail analog$phone field_ec_tail

    bit13=0
    bit12=1
    bit09=0
    bit08=0
    bit05=0

    if [ $field_ec_enable ] ; then
        bit15=1
    else
        bit15=0
    fi

    if [ $field_dc_filter_enable ] ; then
        bit14=0
    else
        bit14=1
    fi

    if [ $field_hec_filter_enable ] ; then
        bit11=1
    else
        bit11=0
    fi

    if [ $field_npl_control_enable ] ; then
        bit10=0
    else
        bit10=1
    fi

    if [ $field_comfort_noise ] ; then
        bit06=0
    else
        bit06=1
    fi

    case "$npl_tune" in
    00) bit07=0
        bit04=0;;
    01) bit07=0
        bit04=1;;
    10) bit07=1
        bit04=0;;
    esac
            
    a=$bit15$bit14$bit13$bit12
    b=$bit11$bit10$bit09$bit08
    c=$bit07$bit06$bit05$bit04
    d=$field_ec_tail

    output="0x"
    
    for i in $a $b $c $d
    do
        case "$i" in
        0000) out=0;;
        0001) out=1;;
        0010) out=2;;
        0011) out=3;;
        0100) out=4;;
        0101) out=5;;
        0110) out=6;;
        0111) out=7;;
        1000) out=8;;
        1001) out=9;;
        1010) out=A;;
        1011) out=B;;
        1100) out=C;;
        1101) out=D;;
        1110) out=E;;
        1111) out=F;;
        esac

        output=$output$out
    done ### for i in $a $b $c $d

##################################################################
#####          Enhanced Echo Cancellation settings           #####
##################################################################
    config_get field_full_filter analog$phone field_full_filter
    config_get field_fast_convergence_control analog$phone field_fast_convergence_control

    if [ $field_full_filter ] ; then
        bit15=1
    else
        bit15=0
    fi

    if [ $field_fast_convergence_control ] ; then
        bit12=1
    else
        bit12=0
    fi

    temp=$bit15\00$bit12
        
    case "$temp" in
    0000) out=0;;
    0001) out=1;;
    1000) out=8;;
    1001) out=9;;
    esac

    en_echocan=0x$out\000

##################################################################
#####               Completing configurations                #####
##################################################################
echo "
[phone]
name=phone`expr $phone - 1`
tdmbus=slic
timeslot=`expr $phone - 1`
callerid=$name <$number>
echocan=$output
enh_echocan=$en_echocan
dsp_acp=$dsp_acp
vad=$vad
ud_enable=$ud_enable"  >> /etc/asterisk/mspd.conf

##################################################################
#####Dial Plan Configuration
#####Adding POTS Phone Dial Plan in extensions.conf
    echo "exten => $number,1,Macro(stdexten,MSPD/phone`expr $phone - 1`,,$number)" >> /etc/asterisk/extensions.conf

##################################################################
#####Voicemail Configuration
#####Creating voicemail.conf
    [ "$voicemail" == "enable" ] && echo "$number => $number,$number,root@localhost" >> /etc/asterisk/voicemail.conf

    phone=`expr $phone + 1`

done ### while [ "$phone" -le "$analogphones" ]


##################################################################
#####                    FXO Configuration                   #####
##################################################################
config_get analogphones general analogphones
config_get name fxo name
config_get number fxo number
config_get field_ec_enable fxo field_ec_enable
config_get field_dc_filter_enable fxo field_dc_filter_enable
config_get field_hec_filter_enable fxo field_hec_filter_enable
config_get field_npl_control_enable fxo field_npl_control_enable
config_get npl_tune fxo npl_tune
config_get field_comfort_noise fxo field_comfort_noise
config_get field_ec_tail fxo field_ec_tail

bit13=0
bit12=1
bit09=0
bit08=0
bit05=0

if [ $field_ec_enable ] ; then
    bit15=1
else
    bit15=0
fi

if [ $field_dc_filter_enable ] ; then
    bit14=0
else
    bit14=1
fi

if [ $field_hec_filter_enable ] ; then
    bit11=1
else
    bit11=0
fi

if [ $field_npl_control_enable ] ; then
    bit10=0
else
    bit10=1
fi

if [ $field_comfort_noise ] ; then
    bit06=0
else
    bit06=1
fi

case "$npl_tune" in
00) bit07=0
    bit04=0;;
01) bit07=0
    bit04=1;;
10) bit07=1
    bit04=0;;
esac
        
a=$bit15$bit14$bit13$bit12
b=$bit11$bit10$bit09$bit08
c=$bit07$bit06$bit05$bit04
d=$field_ec_tail

fxo_output="0x"

for i in $a $b $c $d
do
    case "$i" in
    0000) out=0;;
    0001) out=1;;
    0010) out=2;;
    0011) out=3;;
    0100) out=4;;
    0101) out=5;;
    0110) out=6;;
    0111) out=7;;
    1000) out=8;;
    1001) out=9;;
    1010) out=A;;
    1011) out=B;;
    1100) out=C;;
    1101) out=D;;
    1110) out=E;;
    1111) out=F;;
    esac
        
    fxo_output=$fxo_output$out
done

##################################################################
config_get field_full_filter fxo field_full_filter
config_get field_fast_convergence_control fxo field_fast_convergence_control

if [ $field_full_filter ] ; then
    bit15=1
else
    bit15=0
fi

if [ $field_fast_convergence_control ] ; then
    bit12=1
else
    bit12=0
fi

temp=$bit15\00$bit12

case "$temp" in
0000) out=0;;
0001) out=1;;
1000) out=8;;
1001) out=9;;
esac

fxo_en_echocan=0x$out\000

##################################################################
#####               Completing configurations                #####
##################################################################
echo "
[phone]
name=$name
tdmbus=slic
timeslot=$analogphones
allow=
callerid=$name <$number> 
is_mapped_trunk=1
echocan=$fxo_output
enh_echocan=$fxo_en_echocan"  >> /etc/asterisk/mspd.conf

echo "" >> /etc/asterisk/extensions.conf
echo "" >> /etc/asterisk/voicemail.conf

##################################################################
#####                VoIP Phones Configuration               #####
##################################################################
config_get voipphones general voipphones
phone=1
while [ "$phone" -le "$voipphones" ]
do
    config_get name voip$phone name
    config_get number voip$phone number
    config_get authpwd voip$phone authpwd
    config_get protocol voip$phone protocol
    config_get type voip$phone type
    config_get voicemail voip$phone voicemail
    config_get canreinvite voip$phone canreinvite

##################################################################
#####                  Completing sip.conf                   #####
##################################################################
echo "
[$number]
type=$type
context=default
username=$number
secret=$authpwd
callerid=$name
host=dynamic" >> /etc/asterisk/sip.conf
    if [ "$canreinvite" == "yes" ]; then
        echo "canreinvite=yes" >> /etc/asterisk/sip.conf
    else
        echo "canreinvite=no" >> /etc/asterisk/sip.conf
    fi

##################################################################
#####Dial Plan Configuration
#####Adding VoIP Phone Dial Plan in extensions.conf
    echo "exten => $number,1,Macro(stdexten,SIP/$number,,$number)" >> /etc/asterisk/extensions.conf

##################################################################
#####Voicemail Configuration
#####Creating voicemail.conf
    [ "$voicemail" == "enable" ] && echo "$number => $number,$number,root@localhost" >> /etc/asterisk/voicemail.conf

    phone=`expr $phone + 1`

done ### while [ "$phone" -le "$voipphones" ]


##################################################################
#####             Completing extensions.conf                 #####
##################################################################
echo "
exten => s,1,GotoIf(\$[\${LEN(\${ARG3})} > 0]?4)
exten => s,2,SetVar(VMBOX=\${MACRO_EXTEN})
exten => s,3,Goto(5)
exten => s,4,SetVar(VMBOX=\${ARG3})
exten => s,5,Dial(\${ARG1},20,t\${ARG2})
exten => s,6,Goto(s-\${DIALSTATUS},1)
exten => s-ANSWER,1,Hangup
exten => s-BUSY,1,Voicemail(b\${VMBOX})
exten => s-BUSY,2,Hangup
exten => _s-.,1,Voicemail(u\${VMBOX})
exten => _s-.,2,Hangup
" >> /etc/asterisk/extensions.conf

config_get vm_enable general vm
config_get vm_ext general vm_main
if [ "$vm_enable" == "yes" ];then
echo "
exten => $vm_ext,1,VoiceMailMain()
exten => $vm_ext,2,NoOp(\${EXTEN})
exten => $vm_ext,3,NoOp(\${MACRO_EXTEN})
exten => $vm_ext,4,Hangup()
" >> /etc/asterisk/extensions.conf
fi

config_get call_record_ext general call_record_ext
if [ "$call_record_ext" ];then
echo "
exten => $call_record_ext,1,Answer()
exten => $call_record_ext,2,Record(/tmp/testrecordingGSM%d.gsm|2)
exten => $call_record_ext,3,NoOp()
exten => $call_record_ext,4,Wait(1)
exten => $call_record_ext,5,Playback(\${RECORDED_FILE})
exten => $call_record_ext,6,Hangup()
" >> /etc/asterisk/extensions.conf
fi

echo "
[macro-stdexten]
exten => s, 1, Dial(\${ARG1}, 25, tT)
exten => s, 2, SetVar(VMBOX=\${MACRO_EXTEN})
exten => s, 3, NoOp(\${MACRO_EXTEN})
exten => s, 4, NoOp(\${VMBOX})
exten => s, 5, Goto(s-\${DIALSTATUS},1)
exten => s-ANSWER,1,Hangup
exten => s-BUSY,1,Voicemail(b\${VMBOX})
exten => s-BUSY,2,Hangup
exten => _s-.,1,Voicemail(u\${VMBOX})
exten => _s-.,2,Hangup
;exten => s, 2, Goto(s, 102)
;exten => s, 102, Playback(vm-nobodyavail)
;exten => s, 103, Hangup()

[macro-stdinterasterisk]
exten => s, 1, Dial(\${ARG1}, 30, tT)
exten => s, 2, NoOp(\${ARG1})
exten => s, 3, Hangup()

" >> /etc/asterisk/extensions.conf

##################################################################
#####                 Conference settings                   ######
##################################################################
echo "[conference]" >> /etc/asterisk/extensions.conf
config_get confcount general confcount
conf=1
while [ "$conf" -le "$confcount" ]
do
    config_get name conf$conf name
    config_get number conf$conf number
    echo "exten => $number,1,Conference($name,\"S|L\")" >> /etc/asterisk/extensions.conf
    conf=`expr $conf + 1`
done

##################################################################
#####            Completing SIP Proxy settings               #####
##################################################################
echo "
$extpxycntx_cmd
" >> /etc/asterisk/extensions.conf

##################################################################
