blob: 0a0b4074659f2bfb270757d2313f1b2493ed7be8 [file] [log] [blame]
#/bin/sh
################################################################################
# This daemon monitors the satellite signal info on the given frequency,
# formats the expected output, and sends the status report via UDP to the
# cloud management system.
#
# - Usage:
# signal_monitor --server_ip=<ip_address> --udp_port=<port>
# --dvb_type=<dvbs2|dvbs>
# [--freq=<freq>] [--rate=<rate>] [monitor_sec=<sec>]
#
################################################################################
# TODO(hunguyen): remove this customized script when new toybox tool supports
# UDP send for netcat command.
UDP_SEND="/usr/bin/udp_send"
usage() {
cat <<EOF
usage: signal_monitor [options] ...
options:
--server_ip Required server ip address to send report.
--udp_port Required UDP port to send report.
--freq=1400000 Intermediate tuning frequency in kHz
(default = 1400 MHz)
--rate=30000 Symbol rate in 1000s (default = 30000)
--monitor_sec=60 Monitor interval in seconds.
--dvb_type=dvbs2 DVB type (default = dvbs2)
--help Print this usage menu.
EOF
return 0
}
failmsg() {
local rval=$?
echo "FAIL: $0: $* Abort signal monitoring!" 1>&2
[ ${rval} -ne 0 ] && return ${rval}
return 1
}
# Parses arguments and ensures required parameters are present.
parse_args() {
local arg
opt_freq=1400000
opt_rate=30000
opt_interval=60
opt_server_ip=
opt_udp_port=
opt_dvb_type=dvbs2
# Then parse options.
while [ $# -ge 1 ]; do
# Arg starting with dash is formally an option.
case "$1" in (-*);; (*) break;; esac
arg=$1
shift
case "${arg}" in
--) break;;
*help) usage && exit 0;;
--freq=*) opt_freq=${arg#*=};;
--rate=*) opt_rate=${arg#*=};;
--monitor_sec=*) opt_interval=${arg#*=};;
--server_ip=*) opt_server_ip=${arg#*=};;
--udp_port=*) opt_udp_port=${arg#*=};;
--dvb_type=*) opt_dvb_type=${arg#*=};;
*) failmsg "Unknown option ${arg}; try --help." || return;;
esac
done
# Return failure if required parameters are empty.
[ -n "${opt_server_ip}" ] ||
failmsg "Missing required parameter --server_ip; try --help." || return
[ -n "${opt_udp_port}" ] ||
failmsg "Missing required parameter --udp_port; try --help." || return
}
main() {
parse_args "$@" || return
# Daemon job to monitor satellite signal and send the data to Google prod.
while [ 1 ]
do
# If dvbtune is not already running, start dvbtune for this frequency.
ps -ef | grep "dvbtune" | grep "${opt_freq}" >/dev/null
if [ $? -ne 0 ]
then
echo "No dvbtune found for this frequency. Starting new dvbtune..."
# Kill any other dvbtune.
pkill -9 dvbtune
# Start new dvbtune with this frequency and rate.
dvbtune -i ${opt_freq} -r ${opt_rate} -s ${opt_dvb_type} &
ps -ef | grep " $! " | grep -v grep >/dev/null ||
failmsg "Failed to start tuner with frequency ${opt_freq}..." ||
continue
fi
# Reaching here means dvbtune is already in place. Start dvbsnoop to gather
# satellite signal info.
# Actual dvbsnoop signal output format is:
# Sig: 100 SNR: 65517 BER: 0 UBLK: 0 Stat: 0x01
# Expected format to parse and monitor is:
# Ts:123456789 Freq:1400 Sig:100 SNR:65517 BER:0 UBLK:0 Stat:0x01
# Manipulate the output signal here to the expected format.
# TODO(hunguyen): Any need to gather frontend info?
data="Ts:$(date +%s) Freq:$((${opt_freq}/1000)) $(dvbsnoop -s signal -pd 4 \
-n 1 -hideproginfo | sed '1,5d' | sed 's/: /:/g' | sed 's/ \+/ /g')"
# Now send the info to event_proxy
echo "Sending '${data}' to event_proxy..."
${UDP_SEND} --hostname "${opt_server_ip}" --port ${opt_udp_port} \
--data "${data}"
sleep ${opt_interval}
done
}
main "$@"