gpt-2741gnac_root_files/_mtdblock3.img.extracted/squashfs-root/bin/shgw

567 lines
16 KiB
Bash
Executable File

#!/bin/sh
#############################################################################
#
# MCAFEE CONFIDENTIAL
# Copyright ©2018 McAfee, LLC
#
# The source code contained or described herein and all documents related
# to the source code ("Material") are owned by McAfee or its
# suppliers or licensors. Title to the Material remains with McAfee
# or its suppliers and licensors. The Material contains trade
# secrets and proprietary and confidential information of McAfee or its
# suppliers and licensors. The Material is protected by worldwide copyright
# and trade secret laws and treaty provisions. No part of the Material may
# be used, copied, reproduced, modified, published, uploaded, posted,
# transmitted, distributed, or disclosed in any way without McAfee's prior
# express written permission.
#
# No license under any patent, copyright, trade secret or other intellectual
# property right is granted to or conferred upon you by disclosure or
# delivery of the Materials, either expressly, by implication, inducement,
# estoppel or otherwise. Any license under such intellectual property rights
# must be express and approved by McAfee in writing.
#
##############################################################################
#
# Used for matching the version
. /etc/shgw/shgw.version
#
# Load all the variables
. /etc/shgw/shgw.constants
. /etc/shgw/shgw.common
. /etc/shgw/shgw.env
. /etc/shgw/shgw.errno
. /etc/shgw/shgw_migrate
fn_trim_startup_log
${SHGW_LOG_TRIMMER} &
#
# Enable deep inspection debugging of this shell script
exec 3>&1 4>&2 1>> ${SHGW_STARTUP_LOG} 2>&1
set -x
fn_retry_cmd_upto_five_times() {
local _cmd=$1
local _ecode=$2
COUNT=1
while [ $COUNT -lt $SQL_FAILURE_RETRY_COUNT ]; do
eval $_cmd > /dev/null 2>&1
if [ $? -eq 0 ]; then
break
fi
sleep 1
COUNT=$((${COUNT} + 1))
done
if [ $COUNT -eq $SQL_FAILURE_RETRY_COUNT ]; then
fn_err_exit $_ecode
fi
}
create_debug_files(){
if [ ! -f ${SHGW_STARTUP_STATUS} ]; then
> ${SHGW_STARTUP_STATUS}
fi
if [ ! -f ${SHGW_ERROR_FILE} ]; then
> ${SHGW_ERROR_FILE}
fi
}
get_lan_ifaces() {
local _IFACE=""
LAN_INTERFACE_JSON_LIST=""
for _IFACE in ${LAN_INTERFACES}; do
if [ ! -z ${LAN_INTERFACE_JSON_LIST} ]; then
LAN_INTERFACE_JSON_LIST=${LAN_INTERFACE_JSON_LIST}','
fi
LAN_INTERFACE_JSON_LIST=${LAN_INTERFACE_JSON_LIST}'"'${_IFACE}'"'
done
if [ -z ${LAN_INTERFACE_JSON_LIST} ]; then
fn_err_exit ${NO_LAN_IFACE}
fi
LAN_INTERFACE_JSON_LIST='['${LAN_INTERFACE_JSON_LIST}']'
${ECHO} "[$(fn_time_now)] LAN_INTERFACES = ${LAN_INTERFACE_JSON_LIST} " >> ${SHGW_STARTUP_STATUS}
}
create_persistant_sqlite_db(){
${SHGW_ENCRYPT_SQL} "START" "PERSIST"
}
update_persistant_sqlite_db() {
if [ X"$mode" == X"softstart" ]; then
reset=0
${SHGW_ENCRYPT_SQL} "UPDATE_START" "${LAN_INTERFACE_JSON_LIST}" "${SHGW_VERSION}" "${IP_SKIP_JSON_LIST}" "${base_mac}" "${serial}" "${model}" "${country_code}" "${timezone}" "${WAN_INTERFACE_JSON_LIST}" "${DEFAULT_WAN_INTERFACE}" "${DEFAULT_DNS_SERVER_LIST}" "${LAN_IP_LIST}" "${LAN_IFACE_IP_LIST}" "${reset}"
elif [ X"$mode" == X"db_start" ]; then
reset=2
${SHGW_ENCRYPT_SQL} "UPDATE_START" "${LAN_INTERFACE_JSON_LIST}" "${SHGW_VERSION}" "${IP_SKIP_JSON_LIST}" "${base_mac}" "${serial}" "${model}" "${country_code}" "${timezone}" "${WAN_INTERFACE_JSON_LIST}" "${DEFAULT_WAN_INTERFACE}" "${DEFAULT_DNS_SERVER_LIST}" "${LAN_IP_LIST}" "${LAN_IFACE_IP_LIST}" "${reset}"
else
${SHGW_ENCRYPT_SQL} "UPDATE_START" "${LAN_INTERFACE_JSON_LIST}" "${SHGW_VERSION}" "${IP_SKIP_JSON_LIST}" "${base_mac}" "${serial}" "${model}" "${country_code}" "${timezone}" "${WAN_INTERFACE_JSON_LIST}" "${DEFAULT_WAN_INTERFACE}" "${DEFAULT_DNS_SERVER_LIST}" "${LAN_IP_LIST}" "${LAN_IFACE_IP_LIST}"
fi
}
check_persistant_db(){
local _need_to_create_db=0
if [ -f ${SHGW_PERSISTANT_DB} ]; then
local _shgw_version_from_sql=$(${SHGW_ENCRYPT_SQL} "GET" "VERSION" "shgw_config_store")
if [ "${_shgw_version_from_sql}" != "${SHGW_VERSION}" ]; then
fn_migrate_persistant_db
fi
else
# persistant db not found
_need_to_create_db=1
fi
if [ ${_need_to_create_db} -eq 1 ]; then
create_persistant_sqlite_db
fi
}
fetch_skip_ips() {
if [ ! -f ${IP_SKIP_LIST_FILE} ]; then
${ECHO} "[$(fn_time_now)] No Skip IPs file" >> ${SHGW_STARTUP_STATUS}
IP_SKIP_JSON_LIST='[""]'
else
IP_SKIP_JSON_LIST=""
while read line
do
if [ ! -z ${IP_SKIP_JSON_LIST} ]; then
IP_SKIP_JSON_LIST=${IP_SKIP_JSON_LIST}','
fi
IP_SKIP_JSON_LIST=${IP_SKIP_JSON_LIST}'"'${line}'"'
done < ${IP_SKIP_LIST_FILE}
if [ -z ${IP_SKIP_JSON_LIST} ]; then
${ECHO} "[$(fn_time_now)] No Skip IPs" >> ${SHGW_STARTUP_STATUS}
fi
IP_SKIP_JSON_LIST='['${IP_SKIP_JSON_LIST}']'
${ECHO} "[$(fn_time_now)] Skipping IPs = ${IP_SKIP_JSON_LIST} " >> ${SHGW_STARTUP_STATUS}
fi
}
__fetch_wan_and_dns_data() {
local line=${1}
local wan=""
local dns=""
local res=""
wan=$(${ECHO} ${line} | ${CUT} -d';' -f1)
dns=$(${ECHO} ${line} | ${CUT} -d';' -f2 | ${SED} 's/,/ /g')
dns_list=""
if [ ! -z "${dns}" ]; then
for i in ${dns}; do
if [ ! -z ${dns_list} ]; then
dns_list=${dns_list}','
fi
dns_list=${dns_list}'"'${i}'"'
done
res='{"interface":"'${wan}'","dns":['${dns_list}']}'
fi
${ECHO} $res
}
fetch_wan_interfaces() {
DEFAULT_WAN_INTERFACE=""
WAN_INTERFACE_JSON_LIST=''
if [ ! -f ${WAN_INFO} ]; then
${ECHO} "[$(fn_time_now)] No WAN Info file" >> ${SHGW_STARTUP_STATUS}
fn_err_exit ${NO_DEFAULT_WAN_IFACE}
else
while read line
do
if [ ! -z "$(${ECHO} ${line} | ${GREP} default)" ]; then
DEFAULT_WAN_INTERFACE=$(${ECHO} ${line} | ${AWK} '{print $2}')
else
dns_list=""
dns_list=$(__fetch_wan_and_dns_data ${line})
#fetch default DNS server
CUR_WAN_INTERFACE=$(${ECHO} ${dns_list} | ${CUT} -d':' -f2 | ${CUT} -d',' -f1 | ${SED} -e 's/"//g')
if [ X"$CUR_WAN_INTERFACE" = X"$DEFAULT_WAN_INTERFACE" ]; then
DEFAULT_DNS_SERVER_LIST=$(${ECHO} ${dns_list} | ${CUT} -d'[' -f2 | ${SED} -e 's/"//g' -e 's/]//g' -e 's/}//g')
fi
if [ ! -z ${dns_list} ]; then
if [ ! -z ${WAN_INTERFACE_JSON_LIST} ]; then
WAN_INTERFACE_JSON_LIST=${WAN_INTERFACE_JSON_LIST}','
fi
WAN_INTERFACE_JSON_LIST=${WAN_INTERFACE_JSON_LIST}${dns_list}
fi
fi
done < ${WAN_INFO}
fi
if [ -z ${DEFAULT_WAN_INTERFACE} ]; then
${ECHO} "[$(fn_time_now)] No Default WAN Interface" >> ${SHGW_STARTUP_STATUS}
fn_err_exit ${NO_DEFAULT_WAN_IFACE}
fi
# exit if there is no default DNS server
if [ -z ${DEFAULT_DNS_SERVER_LIST} ]; then
${ECHO} "[$(fn_time_now)] No Default DNS Server" >> ${SHGW_STARTUP_STATUS}
fn_err_exit ${NO_DEFAULT_DNS_SERVER_LIST}
fi
if [ -z ${WAN_INTERFACE_JSON_LIST} ]; then
${ECHO} "[$(fn_time_now)] No WAN Interfaces" >> ${SHGW_STARTUP_STATUS}
fn_err_exit ${NO_DEFAULT_WAN_IFACE}
fi
WAN_INTERFACE_JSON_LIST="["${WAN_INTERFACE_JSON_LIST}"]"
${ECHO} "[$(fn_time_now)] Default WAN Interfaces: ${DEFAULT_WAN_INTERFACE}" >> ${SHGW_STARTUP_STATUS}
${ECHO} "[$(fn_time_now)] Default DNS server list: ${DEFAULT_DNS_SERVER_LIST}" >> ${SHGW_STARTUP_STATUS}
${ECHO} "[$(fn_time_now)] WAN Interfaces: ${WAN_INTERFACE_JSON_LIST}" >> ${SHGW_STARTUP_STATUS}
}
__fetch_lan_and_ip_data() {
local line=${1}
local lan=""
local ip=""
local res=""
lan=$(${ECHO} ${line} | ${CUT} -d';' -f1)
ip=$(${ECHO} ${line} | ${CUT} -d';' -f2 | ${SED} 's/,/ /g')
ip_list=""
if [ ! -z "${ip}" ]; then
for i in ${ip}; do
if [ ! -z ${ip_list} ]; then
ip_list=${ip_list}','
fi
ip_list=${ip_list}'"'${i}'"'
done
res='{"interface":"'${lan}'","lan_ip":['${ip_list}']}'
fi
${ECHO} $res
}
fetch_lan_ip() {
local line=${1}
local ip=""
ip=$(${ECHO} ${line} | ${CUT} -d';' -f2 | ${SED} 's/,/ /g')
if [ ! -z "${ip}" ]; then
for i in ${ip}; do
if [ ! -z "$LAN_IP_LIST" ]; then
LAN_IP_LIST=${LAN_IP_LIST}','
fi
LAN_IP_LIST=${LAN_IP_LIST}'"'${i}'"'
done
else
LAN_IP_LIST='"192.168.1.1"'
fi
${ECHO} ${LAN_IP_LIST}
}
fetch_lan_interfaces() {
LAN_INTERFACES=""
LAN_IP_LIST=""
LAN_IFACE_IP_LIST=""
local lan=""
if [ ! -f ${LAN_INFO} ]; then
${ECHO} "[$(fn_time_now)] No LAN Info file" >> ${SHGW_STARTUP_STATUS}
LAN_INTERFACES="br0"
LAN_IP_LIST='"192.168.1.1"'
else
while read line
do
if [ ! -z "$LAN_INTERFACES" ]; then
LAN_INTERFACES=${LAN_INTERFACES}' '
fi
lan=$(${ECHO} ${line} | ${CUT} -d';' -f1)
LAN_INTERFACES=${LAN_INTERFACES}${lan}
if [ ! -z "$(${ECHO} ${line} | ${GREP} br0)" ]; then
LAN_IP_LIST=$(fetch_lan_ip ${line})
fi
ip_list=""
ip_list=$(__fetch_lan_and_ip_data ${line})
if [ ! -z ${ip_list} ]; then
if [ ! -z ${LAN_IFACE_IP_LIST} ]; then
LAN_IFACE_IP_LIST=${LAN_IFACE_IP_LIST}','
fi
LAN_IFACE_IP_LIST=${LAN_IFACE_IP_LIST}${ip_list}
fi
done < ${LAN_INFO}
fi
LAN_IP_LIST='['${LAN_IP_LIST}']'
LAN_IFACE_IP_LIST='['${LAN_IFACE_IP_LIST}']'
${ECHO} "[$(fn_time_now)] LAN Interfaces: ${LAN_INTERFACES}" >> ${SHGW_STARTUP_STATUS}
${ECHO} "[$(fn_time_now)] LAN IP for br0: ${LAN_IP_LIST}" >> ${SHGW_STARTUP_STATUS}
${ECHO} "[$(fn_time_now)] LAN IP for all interfcaes: ${LAN_IFACE_IP_LIST}" >> ${SHGW_STARTUP_STATUS}
}
fetch_and_update_gwinfo() {
if [ ! -f ${HGUINFO} ]; then
${ECHO} "[$(fn_time_now)] No HGU Info file" >> ${SHGW_STARTUP_STATUS}
fn_err_exit ${FETCH_BASE_MAC_FAILED}
else
serial=$(${ECHO} $(${CUT} -d ';' -f1 ${HGUINFO}))
model=$(${ECHO} $(${CUT} -d ';' -f2 ${HGUINFO}))
timezone=$(${ECHO} $(${CUT} -d ';' -f3 ${HGUINFO}))
country_code=$(${ECHO} $(${CUT} -d ';' -f4 ${HGUINFO}))
base_mac=$(${ECHO} $(${CUT} -d ';' -f5 ${HGUINFO}))
fi
if [ -z "${base_mac}" ]; then
fn_err_exit ${FETCH_BASE_MAC_FAILED}
fi
if [ -z ${serial} ]; then
${ECHO} "[$(fn_time_now)] Serial number is empty!"
serial="serial"
fi
if [ -z ${model} ]; then
${ECHO} "[$(fn_time_now)] Model number is empty!"
model="model"
fi
if [ -z ${country_code} ]; then
${ECHO} "[$(fn_time_now)] Country code is empty!"
country_code="ES" #Should we quit instead of this?
fi
# Timezone in Econet is a huge string need to understand
timezone=""
if [ -z ${timezone} ]; then
${ECHO} "[$(fn_time_now)] Timezone is empty!"
timezone="GMT"
fi
if [ -z ${tproxy_mark} ]; then
${ECHO} "[$(fn_time_now)] tproxy_mark is empty!"
tproxy_mark="0x4000"
fi
if [ -z ${tproxy_mask} ]; then
${ECHO} "[$(fn_time_now)] tproxy_mask is empty!"
tproxy_mask="0x4000"
fi
}
create_non_persistant_sqlite_db(){
fn_retry_query_upto_five_times "CREATE TABLE IF NOT EXISTS device_discovery_table(dev_id TEXT PRIMARY KEY, mac TEXT,ip_address TEXT,ip6_address TEXT,host_name TEXT,headless INTEGER,status INTEGER,last_seen INTEGER,trusted INTEGER);" "${SHGW_NON_PERSISTANT_DB}" "${NON_PERSISTANT_DB_UPDATE_FAILED}" "${ONE_SEC}"
fn_retry_query_upto_five_times "CREATE TABLE IF NOT EXISTS stats(key TEXT PRIMARY KEY, value TEXT);" "${SHGW_NON_PERSISTANT_DB}" "${NON_PERSISTANT_DB_UPDATE_FAILED}" "${ONE_SEC}"
fn_retry_query_upto_five_times "DELETE FROM stats;" "${SHGW_NON_PERSISTANT_DB}" "${NON_PERSISTANT_DB_UPDATE_FAILED}" "${ONE_SEC}"
fn_retry_query_upto_five_times "INSERT INTO stats VALUES('dns_stats', '{}');" "${SHGW_NON_PERSISTANT_DB}" "${NON_PERSISTANT_DB_UPDATE_FAILED}" "${ONE_SEC}"
fn_retry_query_upto_five_times "INSERT INTO stats VALUES('sys_stats', '{}');" "${SHGW_NON_PERSISTANT_DB}" "${NON_PERSISTANT_DB_UPDATE_FAILED}" "${ONE_SEC}"
fn_retry_query_upto_five_times "CREATE TABLE IF NOT EXISTS shgw_access_restrictions(status INTEGER, protocol TEXT, port INTEGER, source TEXT, devices TEXT);" "${SHGW_NON_PERSISTANT_DB}" "${NON_PERSISTANT_DB_UPDATE_FAILED}" "${ONE_SEC}"
}
delete_old_persistent_db() {
if [ -f ${SHGW_OLD_PERSISTANT_DB} ]; then
${RM} -f ${SHGW_OLD_PERSISTANT_DB}
fi
}
#------------------------------------start_server------------------------------
start_watchdogd() {
#Remove the o/p redirection done by exec
exec 1>&3 2>&4
${SHGW_WD_MONIT} &
#Add the o/p redirection
exec 3>&1 4>&2 1>> ${SHGW_STARTUP_LOG} 2>&1
wd_pid=$(${PS} | ${GREP} -i "shgw_watchdogd" | ${GREP} -v "grep" | ${AWK} -v OFS=' ' '{print $1}')
if [ ! -z $wd_pid ]; then
# request start
${KILL} -SIGUSR2 $wd_pid
fi
}
create_shgw_directories() {
${MKDIR} -p ${SHGW_NVRAM}
${MKDIR} -p ${SHGW_TMPFS_PATH}
}
check_tld_json_existence() {
if [ ! -f ${TLD_JSON_FILE} ];then
${CP} ${SHGW_PRIVATE}/shgw_tld_file.json ${SHGW_NVRAM}
${CHMOD} 666 ${TLD_JSON_FILE}
fi
}
set_time() {
rtm_util cfg igd time_ntp set 1 adm_state enable ip_intf 2 ntp_svr_1 211.22.103.157
}
#------------------------------------>MAIN<----------------------------------------
start_shg(){
delete_old_persistent_db
create_shgw_directories
fetch_wan_interfaces
fetch_lan_interfaces
get_lan_ifaces
check_persistant_db
fetch_and_update_gwinfo
#calc_gwinfo
fetch_skip_ips
update_persistant_sqlite_db
#set_time
${SHGW_ACCESS_RESTRICTION} "inbound_sec_start"
create_non_persistant_sqlite_db
${ECHO} "[$(fn_time_now)] Database created successfully" >> ${SHGW_STARTUP_STATUS}
check_tld_json_existence
start_watchdogd
}
force_start_shg() {
${SHGW_ENCRYPT_SQL} "UPDATE" "STOP_STATUS" "0"
start_shg
}
stop_shg(){
${SHGW_ACCESS_RESTRICTION} "inbound_sec_stop"
# request stop
wd_pid=$(ps | ${GREP} -i "shgw_watchdogd" | ${GREP} -v "grep" | ${AWK} -v OFS=' ' '{print $1}')
if [ ! -z $wd_pid ]; then
# request stop
${KILL} -SIGUSR1 $wd_pid
fi
}
force_stop_shg(){
${SHGW_ENCRYPT_SQL} "UPDATE" "STOP_STATUS" "1"
stop_shg
}
kill_shg() {
${ECHO} "Killing SHGW"
stop_shg
wd_monit_pid=$(${PS} | ${GREP} -i "shgw_wd_monit" | ${GREP} -v "grep" | ${AWK} -v OFS=' ' '{print $1}')
if [ ! -z $wd_monit_pid ]; then
${ECHO} "Stopping monit!"
${KILL} -9 $wd_monit_pid
fi
wd_pid=$(${PS} | ${GREP} -i "shgw_watchdogd" | ${GREP} -v "grep" | ${AWK} -v OFS=' ' '{print $1}')
if [ ! -z $wd_pid ]; then
${ECHO} "Stopping watchdog!"
${KILL} -9 $wd_pid
fi
${RM} -rf ${SHGW_TMPFS_PATH}
${RM} -rf ${SHGW_STARTUP_STATUS}
${RM} -rf ${SHGW_STARTUP_LOG}
${RM} -rf ${SHGW_ERROR_FILE}
}
reset_shg() {
${ECHO} "Resetting SHGW!"
${SHGW_ROUTER_RESET} hard
wd_monit_pid=$(${PS} | ${GREP} -i "shgw_wd_monit" | ${GREP} -v "grep" | ${AWK} -v OFS=' ' '{print $1}')
if [ ! -z $wd_monit_pid ]; then
${ECHO} "Stopping monit!"
${KILL} -9 $wd_monit_pid
fi
wd_pid=$(${PS} | ${GREP} -i "shgw_watchdogd" | ${GREP} -v "grep" | ${AWK} -v OFS=' ' '{print $1}')
if [ ! -z $wd_pid ]; then
${ECHO} "Stopping watchdog!"
${KILL} -9 $wd_pid
fi
# backup
${RM} -f ${SHGW_PERSISTANT_DB}
${ECHO} "Reset done!"
}
shgw_mode() {
if [ X"$mode" == X"start" ]; then
${ECHO} "SHGW start called!"
start_shg
elif [ X"$mode" == X"stop" ]; then
${ECHO} "SHGW stop called!"
stop_shg
elif [ X"$mode" == X"kill" ]; then
${ECHO} "SHGW kill called!"
kill_shg
elif [ X"$mode" == X"restart" ]; then
${ECHO} "SHGW restart called!"
stop_shg
sleep 3
start_shg
elif [ X"$mode" == X"force_start" ]; then
${ECHO} "SHGW force_start called!"
force_start_shg
elif [ X"$mode" == X"force_stop" ]; then
${ECHO} "SHGW force_stop called!"
force_stop_shg
elif [ X"$mode" == X"reset" ]; then
${ECHO} "SHGW reset called!"
reset_shg
elif [ X"$mode" == X"softstart" ]; then
${ECHO} "SHGW softstart called!"
start_shg
elif [ X"$mode" == X"db_start" ]; then
${ECHO} "SHGW DB start called!"
start_shg
else
${ECHO} "Usage: $0 [start|stop|kill|restart|force_start|force_stop|reset|softstart|db_start]"
fn_err_exit ${INVALID_MODE}
fi
${RM} -rf $STARTUP_LOCK
}
exit_if_running() {
# TODO : Add a fdlock implementaion
local mypid=$$
if ! [ -f "$STARTUP_LOCK" ]; then
${ECHO} $$ > $STARTUP_LOCK
return
fi
local pid_on_file=$(${CAT} "$STARTUP_LOCK")
[ X"$pid_on_file" == X"$mypid" ] && return
old_cmd_line=$(${CAT} /proc/$pid_on_file/cmdline 2>/dev/null)
[ "$?" != "0" ] && ${ECHO} $$ > $STARTUP_LOCK && return
${ECHO} "$old_cmd_line" | ${GREP} "shgw"
[ "$?" == "0" ] && ${ECHO} "Already running" && exit 127
${ECHO} $$ > $STARTUP_LOCK
}
#--------------------------------------------------------------------------------
${ECHO} "Called for: $1"
exit_if_running
create_debug_files
${ECHO} "[$(fn_time_now)] starting" >> ${SHGW_STARTUP_STATUS}
mode=$1
shgw_mode
${ECHO} "[$(fn_time_now)] done" >> ${SHGW_STARTUP_STATUS}