#!/bin/sh

[ "$1" != "restart" ] && /usr/bin/shlock /var/lock/cp.sh

MOD_CP_LIB=/opt/captive_portal/usr/libexec/functions
[ -f "$MOD_CP_LIB" ] || exit 2
. $MOD_CP_LIB

# Prepare environment
get_public_iface_info

MODEXEC=hiawatha

ping_host()
{
  for i in 1 2 3; do
    ping -q -c 1 -W 5 $1 2>/dev/null
    if [ "$?" = "0" ]; then RETVAL=0; break; fi
    if [ "$i" = "3" ]; then
      /usr/bin/logger -t "captive portal" -p daemon.warning "Can't ping $1, please check it"
      return 1
    fi
    sleep 1
  done >/dev/null
  return $RETVAL
}

case "$1" in
  start)
    echo -n "Starting module $MOD_CP_NAME: "
    if [ "$MOD_CP_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi
    /usr/bin/logger -t "captive portal" -p daemon.notice "Starting module"
    if  [ -z "$WAN_IF" ]; then
      echo "skipped";
      /usr/bin/logger -t "captive portal" -p daemon.warning "There is no connetion to WAN"
      exit 0
    fi

    echo $MOD_CP_PUBLIC_IF | grep -w -q "wlan0"
    if [ "$?" = "0" ] && [ ! -n "$PUBLIC_IF1_NAME" ]; then
      /usr/bin/logger -t "captive portal" -p daemon.warning "wlan0 is not properly configured"
      exit 1
    fi
    echo $MOD_CP_PUBLIC_IF | grep -q "wlan02"
    if [ "$?" = "0" ] && [ ! -n "$PUBLIC_IF2_NAME" ]; then
      /usr/bin/logger -t "captive portal" -p daemon.warning "wlan02 is not properly configured"
      exit 1
    fi
    echo $MOD_CP_PUBLIC_IF | grep -q "eth0"
    if [ "$?" = "0" ] && [ ! -n "$PUBLIC_IF3_NAME" ]; then
      /usr/bin/logger -t "captive portal" -p daemon.warning "eth0 is not properly configured"
      exit 1
    fi

    mkdir -p $MOD_CP_TMP_DIR
    mkdir -p $MOD_CP_BAN_DIR
    mkdir -p $MOD_CP_DB_DIR
    mkdir -p $MOD_CP_IP_DIR
    mkdir -p $MOD_CP_LOG_DIR
    mkdir -p $MOD_CP_RESTRICTED_DIR
    mkdir -p $MOD_CP_SALT_DIR
    mkdir -p $MOD_CP_STATS_DIR
    mkdir -p $MOD_CP_DB_DIR/hiawatha/wp
    mkdir -p $MOD_CP_DB_DIR/hiawatha/bp
    touch $MOD_CP_USERS_LOG_FILE
    if [ "$MOD_CP_STATS_ENABLED" = "1" ]; then
      rm -f $MOD_CP_STATS_DIR/*_list
      touch $MOD_CP_STATS_DIR/cust_list
      touch $MOD_CP_STATS_DIR/domain_list
      touch $MOD_CP_STATS_DIR/utilization_list
      echo "LAST_POST=0" > $MOD_CP_STATS_DIR/last_post
      echo "CUST_IDX=0" > $MOD_CP_STATS_DIR/cust_idx
      echo "DOMAIN_IDX=0" > $MOD_CP_STATS_DIR/domain_idx
      echo "UTIL_IDX=0" > $MOD_CP_STATS_DIR/util_idx
      # enable dns logging
      cat /etc/init.d/dns | /bin/grep -q "\-q"; DNS_LOGGING=$?
      if [ "$DNS_LOGGING" != "0" ]; then
        cp /etc/init.d/dns /etc/init.d/dns_default
        cat /etc/init.d/dns_default | /bin/grep -q totd; TOTD=$?
        if [ "$TOTD" != "1" ]; then
          sed -e "s/ -h -z -i lo -p 5354/ -h -q -8 \/var\/tmp\/dns.log/" \
              -e "/totd/d" -e "/RETVAL2/d" /etc/init.d/dns_default > $MOD_CP_DB_DIR/dns_tmp
        else
          sed -e "s/ -h/ -h -q -8 \/var\/tmp\/dns.log/" /etc/init.d/dns_default > $MOD_CP_DB_DIR/dns_tmp
        fi
        /etc/init.d/dns stop
        cp $MOD_CP_DB_DIR/dns_tmp /etc/init.d/dns
        rm $MOD_CP_DB_DIR/dns_tmp
        /etc/init.d/dns start
      fi
    fi
    # search for stored web page at SD card
    for DEV_SD in `ls /dev/sd* 2>/dev/null`; do
       mount -r $DEV_SD /mnt 2>/dev/null
       [ $? -eq 0 ] || continue
       if [ -d /mnt/$MOD_CP_NAME ]; then
         ln -s /mnt/$MOD_CP_NAME $MOD_CP_WWW_DIR/sd
         break
       fi
       umount /mnt 2>/dev/null
    done
    # start cron
    killall -0 crond 2>/dev/null || /etc/init.d/cron start
    grep -q $MOD_CP_NAME $MOD_CP_CRONTAB 2>/dev/null || echo "* * * * * root $MOD_CP_LIB_DIR/cron" >> $MOD_CP_CRONTAB
    # hiawatha configuration - welcome page
    ln -sf /opt/$MOD_CP_NAME/etc/hiawatha/mimetype.conf $MOD_CP_DB_DIR/hiawatha/wp/mimetype.conf
    cp /opt/$MOD_CP_NAME/etc/hiawatha/hiawatha.conf $MOD_CP_DB_DIR/hiawatha/wp
    sed -i -e 's/PID_FILE/hiawatha_wp.pid/' -e 's/WEB_PORT/'"$WEB_PORT_WP"'/' -e 's/HANDLER/index1.sh/' $MOD_CP_DB_DIR/hiawatha/wp/hiawatha.conf
    if [ "$MOD_CP_WP_ENABLED" = "1" ] && [ -n "$MOD_CP_WP_URL" ] && [ "$MOD_CP_WP_MODE" = "rproxy" ]; then
      cat /opt/$MOD_CP_NAME/etc/hiawatha/virtualhost.conf >> $MOD_CP_DB_DIR/hiawatha/wp/hiawatha.conf
      sed -i -e 's@WWW_DIR@'"$MOD_CP_WWW_DIR"'@' $MOD_CP_DB_DIR/hiawatha/wp/hiawatha.conf
      HOSTNAME=`echo "$MOD_CP_WP_URL" | awk 'BEGIN { FS = "/" } { print $3 }'`
      sed -i -e 's/HOSTNAME/'"$HOSTNAME"'/g' $MOD_CP_DB_DIR/hiawatha/wp/hiawatha.conf
      ping_host $HOSTNAME
      if [ "$?" != "0" ]; then echo "failed"; exit 1; fi
    fi
    /opt/$MOD_CP_NAME/usr/sbin/$MODEXEC -c $MOD_CP_DB_DIR/hiawatha/wp
    if [ "$?" != "0" ]; then echo "failed"; exit 1; fi
    # hiawatha configuration - ban page
    ln -sf /opt/$MOD_CP_NAME/etc/hiawatha/mimetype.conf /var/$MOD_CP_NAME/hiawatha/bp/mimetype.conf
    cp /opt/$MOD_CP_NAME/etc/hiawatha/hiawatha.conf $MOD_CP_DB_DIR/hiawatha/bp/
    sed -i -e 's/PID_FILE/hiawatha_bp.pid/' -e 's/WEB_PORT/'"$WEB_PORT_BP"'/' -e 's/HANDLER/index1_bp.sh/' $MOD_CP_DB_DIR/hiawatha/bp/hiawatha.conf
    if [ "$MOD_CP_WP_ENABLED" = "1" ] && [ -n "$MOD_CP_BP_URL" ] && [ "$MOD_CP_WP_MODE" = "rproxy" ]; then
      cat /opt/$MOD_CP_NAME/etc/hiawatha/virtualhost.conf >> $MOD_CP_DB_DIR/hiawatha/bp/hiawatha.conf
      sed -i -e 's@WWW_DIR@'"$MOD_CP_WWW_DIR"'@' $MOD_CP_DB_DIR/hiawatha/bp/hiawatha.conf
      HOSTNAME=`echo "$MOD_CP_BP_URL" | awk 'BEGIN { FS = "/" } { print $3 }'`
      sed -i -e 's/HOSTNAME/'"$HOSTNAME"'/g' $MOD_CP_DB_DIR/hiawatha/bp/hiawatha.conf
      ping_host $HOSTNAME
      if [ "$?" != "0" ]; then echo "failed"; exit 1; fi
    fi
    /opt/$MOD_CP_NAME/usr/sbin/$MODEXEC -c $MOD_CP_DB_DIR/hiawatha/bp
    RETVAL=$?
    if [ "$RETVAL" != "0" ]; then echo "failed"; exit $RETVAL; fi
    export MODEXEC MOD_CP_NAME MOD_CP_LIB_DIR
    # start firewall
    $MOD_CP_LIB_DIR/firewall start $WEB_PORT_WP $WEB_PORT_BP
    RETVAL=$?
    if [ "$RETVAL" != "0" ]; then echo "failed"; exit $RETVAL; fi
    # start qos
    $MOD_CP_LIB_DIR/qos cronstart
    RETVAL=$?
    if [ "$RETVAL" != "0" ]; then echo "failed"; exit $RETVAL; fi
    for IP in `ls $MOD_CP_IP_DIR 2>/dev/null`; do
      $MOD_CP_LIB_DIR/qos insert $IP
    done
    for IP in `ls $MOD_CP_RESTRICTED_DIR 2>/dev/null`; do
      QUERY=`cat $MOD_CP_RESTRICTED_DIR/$IP`
      VOLUME_DL=`query_value_get "$QUERY" download`
      VOLUME_UL=`query_value_get "$QUERY" upload`
      if [ $VOLUME_DL -gt $MOD_CP_QOS_VOLUME_CUST_DLV -o $VOLUME_UL -gt $MOD_CP_QOS_VOLUME_CUST_ULV ]; then
        $MOD_CP_LIB_DIR/qos insert $IP restricted
      fi
    done
    echo "done"
    exit 0;
    ;;
  stop)
    /usr/bin/logger -t "captive portal" -p daemon.notice "Stopping module"
    if [ -f /etc/dnsmasq.conf ]; then
      /etc/init.d/dns stop
      rm -f /etc/dnsmasq.conf
      rm -f $MOD_CP_DB_DIR/url_blocker.dnsmasq.conf
      if [ ! -f /etc/init.d/dns_default ] || [ "$2" = "exclude_dns" ]; then
        /etc/init.d/dns start
      fi
    fi
    if [ -f /etc/init.d/dns_default ] && [ "$2" != "exclude_dns" ]; then
      killall -0 dnsmasq 2>/dev/null
      [ "$?" = "0" ] && /etc/init.d/dns stop
      cp /etc/init.d/dns_default /etc/init.d/dns
      rm /etc/init.d/dns_default
      /etc/init.d/dns start
    fi
    echo -n "Stopping module $MOD_CP_NAME: "
    grep -q $MOD_CP_NAME $MOD_CP_CRONTAB 2>/dev/null && sed -i "/.*$MOD_CP_NAME.*/d" $MOD_CP_CRONTAB
    $MOD_CP_LIB_DIR/qos stop 2>/dev/null
    $MOD_CP_LIB_DIR/firewall stop 2>/dev/null
    killall -0 $MODEXEC 2>/dev/null
    if [ $? -ne 0 ]; then
       echo "skipped";
       exit 0;
    fi
    killall $MODEXEC 2>/dev/null
    RETVAL=$?
    for i in 1 2 3 4 5; do
       killall -0 $MODEXEC 2>/dev/null
       if [ "$?" != "0" ]; then
         break;
      fi
      sleep 1;
    done;
    if [ -d $MOD_CP_WWW_DIR/sd ]; then
      umount /mnt 2>/dev/null
      rm $MOD_CP_WWW_DIR/sd
    fi
    rm -rf $MOD_CP_DB_DIR/hiawatha
    if [ $RETVAL -ne 0 ]; then echo "failed"; exit $RETVAL; fi
    echo "done"
    exit 0
    ;;
  restart)
    $0 stop exclude_dns
    $0 start
    ;;
  ip-up)
    exit 0
    ;;
  ip-down)
    exit 0
    ;;
  status)
    echo -n "Cron service : "
    killall -0 crond 2>/dev/null
    RETVAL1=$?
    grep -q $MOD_CP_NAME $MOD_CP_CRONTAB 2>/dev/null
    RETVAL2=$?
    if [ $RETVAL1 = 0 -a $RETVAL2 = 0 ]; then echo "running"; else echo "stopped"; fi
      echo -n "Web server   : "
    killall -0 $MODEXEC 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
    echo -n "Firewall     : "
    $MOD_CP_LIB_DIR/firewall status cp
    $MOD_CP_LIB_DIR/qos status
    echo -n "URL Blocker  : "
    $MOD_CP_LIB_DIR/firewall status url_blocker
    if [ "$MOD_CP_EXCEPTION_ENABLED" == "1" ]; then
      echo -n "Exception    : "
      echo  "$MOD_CP_EXCEPTION_MAC ($MOD_CP_EXCEPTION_IPADDR)"
    fi
    exit 0
    ;;
  blocked_urls)
    if [ "$MOD_CP_URL_BLOCKER_ENABLED" = "1" ]; then
     URL_LIST=$(grep "URL[0-9]" $MOD_CP_CONF_FILE)
     for LINE in $URL_LIST; do
       URL=${LINE#*=}
       [ -n "$URL" ] && echo $URL
     done
    fi
    exit 0
    ;;
  users_state)
    STA_MACS=`/usr/sbin/hostapd_cli all_sta | sed  -r -n 's/^([^:]{2}):([^:]{2}):([^:]{2}):([^:]{2}):([^:]{2}):([^:]{2})/&/p'`
    for MAC in $STA_MACS; do
      FOUND=false
      for IP in `ls $MOD_CP_IP_DIR; ls $MOD_CP_BAN_DIR; ls $MOD_CP_RESTRICTED_DIR`; do
        MAC_CP=`ip2mac $IP`
        if [ "$MAC" = "$MAC_CP" ]; then
          FOUND=true
          PUBLIC_IF=`get_public_iface $IP`
          echo "$IP ($MAC) on $PUBLIC_IF is logged in"
          break
        fi
      done
      if [ "$FOUND" = false ]; then
        IP=`arp -n | grep $MAC | awk '{print $2}'`
        echo "$IP ($MAC) is NOT logged in"
      fi
    done
    exit 0
    ;;
  defaults)
    cp /opt/$MOD_CP_NAME/etc/defaults $MOD_CP_CONF_FILE 2>/dev/null
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
esac
