#!/bin/bash

if [ $# -lt 3 ]
then
  echo "USAGE $0 <radio_id> <channel> <IP1> [ <IP2> ...]"
  exit 255
fi

if [ $1 != DEBUG ]
then
  bash -x $0 DEBUG "$@" >/tmp/manage_ap_change_channel.log 2>&1
  exit
fi
shift

MINI_NX_FIRMWARE=igominiN
UNIFI_BANNER=UniFi
OPENWRT_EURO3G="Euro3G meshing AP"

UBUNTU_VER=`lsb_release -a 2>/dev/null | grep "Description" | awk '/Ubuntu/ { print $3; }' | cut -f1 -d'.'`
if [ $UBUNTU_VER -eq 14 ]
then
  SSH_PARMS="-o BatchMode=yes -o StrictHostKeyChecking=no"
else
  SSH_PARMS="-o BatchMode=yes -o StrictHostKeyChecking=no -oHostKeyAlgorithms=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group1-sha1 -oPubkeyAcceptedKeyTypes=+ssh-rsa -i /opt/euro-beta/systools/id_e3g_rsa "                                                                                                       
fi


WIFI_RADIO=$1
shift
WIFI_CHANNEL=$1
shift
IP_LIST="$*"

RESULT=/tmp/ap_change_channel_result
rm -f $RESULT

function get_openwrt_descr()
{
  IP_ADDRESS=$1
  ssh $SSH_PARMS root@$IP_ADDRESS 'cat /etc/config/system' > /tmp/openwrt_system
  cat /tmp/openwrt_system | grep 'option description' | cut -d"'" -f2
}


function get_banner()
{
  IP_ADDRESS=$1
  ssh $SSH_PARMS euro3g@$IP_ADDRESS 'cat /etc/banner'
}


function get_firmware()
{
  IP_ADDRESS=$1
  if curl -s -m 5 http://$IP_ADDRESS/cgi-bin/simple/login.lua | grep -q NAAW
  then
    NAAW_AUTH=`curl -s -m 5 -c /tmp/winext.cookie.$IP_ADDRESS --data-binary 'user=root&password=spintec' http://$IP_ADDRESS/cgi-bin/simple/login.lua |  
               tr ';' '\n' | 
               grep document.cookie | 
               tr '"' '\n' | 
               grep naaw_auth`";naaw_user=root;"

    echo Cookie [ $NAAW_AUTH ] >&2

    rm -f /tmp/simple_lua.$IP_ADDRESS.html
    VERIFY_URL="http://"$IP_ADDRESS"/cgi-bin/simple/simple.lua"
    echo Verify URL [ $VERIFY_URL ]
    curl -s -m 5 -b $NAAW_AUTH $VERIFY_URL > /tmp/simple_lua.$IP_ADDRESS.html
    NAAW_FIRMWARE=`cat /tmp/simple_lua.$IP_ADDRESS.html | sed 's/tr/\n/g' | grep "Fw Version:" | sed 's/th//g; s/td//g;' | tr -d '<>/' | cut -d : -f2`
    NAAW_IF_NAME="wifi0"

    if [ -z "$NAAW_FIRMWARE" ] # Maybe NaawigoN with provisioning system
    then
      NAAW_IF_NAME="radio0"
      rm -f /tmp/hedera_info.$IP_ADDRESS.txt
      ssh-keygen -f "/root/.ssh/known_hosts" -R $IP_ADDRESS
      
      scp $SSH_PARMS provision@$IP_ADDRESS:/var/hedera/$IP_ADDRESS /tmp/hedera_info.$IP_ADDRESS.txt > /dev/null 2>&1  
      if [ ! -f /tmp/hedera_info.$IP_ADDRESS.txt ]
      then
        echo "NOT_READY"
      fi
      NAAW_FIRMWARE=`cat /tmp/hedera_info.$IP_ADDRESS.txt | grep host | head -1 | cut -d'=' -f2`
#      NAAW_FIRMWARE=`ssh -o StrictHostKeyChecking=no -i /opt/euro-beta/systools/id_e3g_rsa provision@$IP_ADDRESS "cat /var/hedera/$IP_ADDRESS" | grep host | head -1 | cut -d'=' -f2`
      echo "HederaInfo : $NAAW_FIRMWARE  WiFi Device: $NAAW_IF_NAME" >&2
#      rm -f /tmp/hedera_info.$IP_ADDRESS.txt
    fi
#    rm -f /tmp/simple_lua.$IP_ADDRESS.html
    echo $NAAW_FIRMWARE
  fi  
}

function prepare_mini_nx_script()
{
  CHAN=$1
  IP_ADDRESS=$2
  FNAME=/tmp/change_channel.$IP_ADDRESS
  
  cat <<EOF >$FNAME
#!/bin/ash
sleep 5
/lib/provisioning-system/change_channel radio0 $CHAN
/lib/provisioning-system/reboot 3
EOF
  scp $SSH_PARMS $FNAME provision@$IP_ADDRESS:/tmp/change_channel
  RES=$?
  rm -f $FNAME
  return $RES
}

function prepare_unifi_script()
{
  RADIO=$1
  CHAN=$2
  IP_ADDRESS=$3
  IFNAME="ath0"
  if [ $RADIO -eq 2 ]
  then
    IFNAME="ath2"
  fi
  FNAME=/tmp/change_channel.$IP_ADDRESS
  
  cat <<EOF >$FNAME
#!/bin/ash
PATH='/usr/sbin:/usr/bin:/sbin:/bin'
sleep 5
/usr/sbin/iwconfig $IFNAME channel $CHAN
grep -v "radio.$RADIO.channel" /tmp/system.cfg > /tmp/tempconfig
echo "radio.$RADIO.channel=$CHAN" >> /tmp/tempconfig
mv /tmp/tempconfig /tmp/system.cfg
/bin/sh /usr/bin/syswrapper.sh save-config
reboot
EOF
  scp $SSH_PARMS $FNAME euro3g@$IP_ADDRESS:/tmp/change_channel
  RES=$?
  rm -f $FNAME
  return $RES
}


function prepare_openwrt_script()
{
  RADIO=$1
  CHAN=$2
  IP_ADDRESS=$3
  IFNAME="wlan1-1"
  PHYNAME="phy1"
  RADIONAME="radio1"
  if [ $RADIO -eq 2 ]
  then
    IFNAME="wlan0"
    PHYNAME="phy0"
    RADIONAME="radio0"
  fi
  FNAME=/tmp/change_channel.$IP_ADDRESS

  cat <<EOF >$FNAME
#!/bin/ash
PATH='/usr/sbin:/usr/bin:/sbin:/bin'
sleep 5
CHAN_LIST=\$(iw list | grep -A120 $PHYNAME | grep 'MHz \[' | cut -d '[' -f2 | cut -d ']' -f1) 
if echo \$CHAN_LIST | grep -q $CHAN
then
  if [ -n "$CHAN" ]
  then
    uci set wireless.$RADIONAME.channel='$CHAN'
    uci commit wireless
    wifi reload $RADIONAME
  fi
#  ACT_CHAN=\$(/usr/bin/iwinfo | grep -A5 $IFNAME | grep 'Channel:' |  cut -d':' -f3 | cut -d ' ' -f2)
#  if [ -n "$CHAN" -a -n "\$ACT_CHAN" ]
#  then
#    cp /etc/config/wireless /tmp/wireless.tmp
#    cat /tmp/wireless.tmp | sed "s/option channel '\$ACT_CHAN'/option channel '$CHAN'/g" > /etc/config/wireless
#    /etc/init.d/network restart
#  fi
fi
EOF
  scp $SSH_PARMS $FNAME root@$IP_ADDRESS:/tmp/change_channel
  RES=$?
  rm -f $FNAME
  return $RES
}


function run_script()
{
  IP_ADDRESS=$1
  SSH_LOGIN=$2
  SCRIPT_NOHUP=$3
  SCRIPT_EXEC=$4
  
  ssh-keygen -f "/root/.ssh/known_hosts" -R $IP_ADDRESS >/dev/null 2>&1
  ssh $SSH_PARMS ${SSH_LOGIN}@$IP_ADDRESS $SCRIPT_NOHUP $SCRIPT_EXEC' /tmp/change_channel >/dev/null 2>&1' &
  PIDSSH=$$
  for((i=0;i<5;i++))
  do
    sleep 1
    if ! ps -p $PIDSSH | grep -q ssh 
    then
      return
    fi
  done
  kill $PIDSSH
}


MINI_NX_ERROR=0
UNIFI_ERROR=0
OPENWRT_ERROR=0


#get_firmware 192.168.160.119
#get_firmware 192.168.160.117
#exit

rm -f /tmp/fw
MINI_NX_FW_STATUS=`
for i in $IP_LIST
do
  { 
    STATUS=$(get_firmware $i)
    if [ -n "$STATUS" ]
    then
      if echo "$STATUS" | grep -q NOT_READY 
      then
        echo "ERROR: Access point $i non e' ancora pronto, riprovare piu' tardi %" | tee $RESULT
      elif ! echo "$STATUS" | grep -q $MINI_NX_FIRMWARE 
      then
        echo "ERROR: Firmware incompatibile $i %" | tee $RESULT
      else
        echo $STATUS
      fi
    else
      echo "ERROR: Nessuna risposta dal $i %" | tee $RESULT
    fi
  } &
done
wait
`

UNIFI_BANNER_STATUS=`
for i in $IP_LIST
do
  { 
    STATUS=$(get_banner $i)
    if [ -n "$STATUS" ]
    then
      if ! echo "$STATUS" | grep -q $UNIFI_BANNER 
      then
        echo "ERROR: Firmware incompatibile $i %" | tee $RESULT
      else
        echo $STATUS
      fi
    else
      echo "ERROR: Nessuna risposta dal $i %" | tee $RESULT
    fi
  }
done
wait
`


OPENWRT_AP_STATUS=`
for i in $IP_LIST
do
  { 
    STATUS=$(get_openwrt_descr $i)
    if [ -n "$STATUS" ]
    then
      if ! echo "$STATUS" | grep -q "$OPENWRT_EURO3G" 
      then
        echo "ERROR: Firmware incompatibile $i %" | tee $RESULT
      else
        echo $STATUS
      fi
    else
      echo "ERROR: Nessuna risposta dal $i %" | tee $RESULT
    fi
  }
done
wait
`

if echo "$MINI_NX_FW_STATUS" | tee /tmp/mini_nx_fw_status | grep -q ERROR 
then
  echo "Uno degli access point ha la versione del firmware incompatibile" | tee $RESULT
  echo $MINI_NX_FW_STATUS | sed 's/% /\n/g' | tr -d % | tee -a $RESULT
  MINI_NX_ERROR=1
fi

if echo "$UNIFI_BANNER_STATUS" | tee /tmp/unifi_banner_status | grep -q ERROR
then
  echo "Uno degli access point ha la versione del firmware incompatibile" | tee $RESULT
  echo $UNIFI_BANNER_STATUS | sed 's/% /\n/g' | tr -d % | tee -a $RESULT
  UNIFI_ERROR=1
fi

if echo "$OPENWRT_AP_STATUS" | tee /tmp/openwrt_ap_status | grep -q ERROR
then
  echo "Uno degli access point ha la versione del firmware incompatibile" | tee $RESULT
  echo $OPENWRT_AP_STATUS | sed 's/% /\n/g' | tr -d % | tee -a $RESULT
  OPENWRT_ERROR=1
fi



if [ $MINI_NX_ERROR -eq 1 -a $UNIFI_ERROR -eq 1 -a $OPENWRT_ERROR -eq 1 ]
then
  exit 255
fi

cat /dev/null > $RESULT

if [ $MINI_NX_ERROR -eq 0 ]
then
SCRIPT_NOHUP="nohup"
SCRIPT_EXEC='/bin/ash'
AP_SSH_USER=provision
COPY_STATUS=${COPY_STATUS}`
for i in $IP_LIST
do
  { 
    prepare_mini_nx_script $WIFI_CHANNEL $i ||
    echo "ERROR: errore durante la preparazione dello script al $i %" | tee $RESULT
  } &  
done
wait
`
fi

if [ $UNIFI_ERROR -eq 0 ]
then
SCRIPT_NOHUP=""
SCRIPT_EXEC='/bin/ash'
AP_SSH_USER=euro3g
COPY_STATUS=${COPY_STATUS}`
for i in $IP_LIST
do
  { 
    prepare_unifi_script $WIFI_RADIO $WIFI_CHANNEL $i ||
    echo "ERROR: errore durante la preparazione dello script al $i %" | tee $RESULT
  } &  
done
wait
`
fi


if [ $OPENWRT_ERROR -eq 0 ]
then
SCRIPT_NOHUP=""
SCRIPT_EXEC='/bin/ash'
AP_SSH_USER=root
COPY_STATUS=${COPY_STATUS}`
for i in $IP_LIST
do
  { 
    prepare_openwrt_script $WIFI_RADIO $WIFI_CHANNEL $i ||
    echo "ERROR: errore durante la preparazione dello script al $i %" | tee $RESULT
  } &  
done
wait
`
fi


if echo $COPY_STATUS | grep -q ERROR
then
  echo $COPY_STATUS | sed 's/% /\n/g' | tr -d %
  exit 255
fi

for i in $IP_LIST
do
  echo xxx >/dev/null
  run_script $i $AP_SSH_USER $SCRIPT_NOHUP $SCRIPT_EXEC &
done
wait
echo "Gli access point si stanno riavviando, tra 2 minuti circa dovrebbero essere pronti." | tee $RESULT
exit 0

