2016-04-01 16:55:46 +00:00
#!/bin/bash
#####################################################################################
# ADS-B RECEIVER #
#####################################################################################
# #
# This script is not meant to be executed directly. #
# Instead execute install.sh to begin the installation process. #
# #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# #
2017-01-02 22:40:20 +00:00
# Copyright (c) 2016-2017, Joseph A. Prochazka & Romeo Golf #
2016-04-01 16:55:46 +00:00
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy #
# of this software and associated documentation files (the "Software"), to deal #
# in the Software without restriction, including without limitation the rights #
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #
# copies of the Software, and to permit persons to whom the Software is #
# furnished to do so, subject to the following conditions: #
# #
# The above copyright notice and this permission notice shall be included in all #
# copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE #
# SOFTWARE. #
# #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
2017-02-07 20:19:52 +00:00
### VARIABLES
2016-04-01 16:55:46 +00:00
2017-01-09 14:51:50 +00:00
RECEIVER_ROOT_DIRECTORY = " ${ PWD } "
RECEIVER_BASH_DIRECTORY = " ${ RECEIVER_ROOT_DIRECTORY } /bash "
RECEIVER_BUILD_DIRECTORY = " ${ RECEIVER_ROOT_DIRECTORY } /build "
2016-12-19 17:50:20 +00:00
2017-02-05 22:20:01 +00:00
# Component specific variables.
2017-02-07 20:19:52 +00:00
COMPONENT_BUILD_DIRECTORY = " ${ RECEIVER_BUILD_DIRECTORY } /ogn "
COMPONENT_GITHUB = "https://github.com/glidernet/ogn-rf"
COMPONENT_WEBSITE = "http://wiki.glidernet.org"
COMPONENT_NAME = "RTLSDR-OGN"
COMPONENT_DESC = "is a combined decoder and feeder for the Open Glider Network which focuses on tracking gilders and other GA aircraft equipped with FLARM, FLARM-compatible devices or OGN tracker."
COMPONENT_RADIO = "Please note that a dedicated RTL-SDR dongle is required to use this decoder"
2016-12-19 17:50:20 +00:00
2017-02-05 22:20:01 +00:00
# Component service script variables.
2017-02-07 20:19:52 +00:00
COMPONENT_SERVICE_NAME = "rtlsdr-ogn"
COMPONENT_SERVICE_SCRIPT_URL = "http://download.glidernet.org/common/service/rtlsdr-ogn"
COMPONENT_SERVICE_SCRIPT_NAME = " ${ COMPONENT_SERVICE_NAME } "
COMPONENT_SERVICE_SCRIPT_PATH = " /etc/init.d/ ${ COMPONENT_SERVICE_NAME } "
COMPONENT_SERVICE_CONFIG_PATH = " /etc/ ${ COMPONENT_SERVICE_SCRIPT_NAME } .conf "
2016-12-28 21:39:55 +00:00
2017-02-05 22:20:01 +00:00
### INCLUDE EXTERNAL SCRIPTS
source ${ RECEIVER_BASH_DIRECTORY } /variables.sh
source ${ RECEIVER_BASH_DIRECTORY } /functions.sh
2017-02-12 02:26:54 +00:00
# To be moved to functions.sh...
#################################################################################
# Calculate RTL-SDR device error rate.
function CalibrateTuner ( ) {
# Attempt to calibrate the specified tuner using GSM frequencies.
if [ [ -n " $1 " ] ] ; then
2017-02-12 02:32:08 +00:00
CALIBRATION_DEVICE_ID = " $1 "
2017-02-12 02:26:54 +00:00
# GSM Band is GSM850 in US and GSM900 elsewhere, should probably try to figure this out...
2017-02-12 02:32:08 +00:00
CALIBRATION_GSM_BAND = "GSM900"
2017-02-12 04:08:19 +00:00
# Check if gain has been specified, otherwise set to 40.
2017-02-12 02:26:54 +00:00
if [ [ -n " ${ OGN_GSM_GAIN } " ] ] ; then
2017-02-12 02:32:08 +00:00
CALIBRATION_GAIN = " ${ OGN_GSM_GAIN } "
2017-02-12 02:26:54 +00:00
else
2017-02-12 04:08:19 +00:00
CALIBRATION_GAIN = "40"
2017-02-12 02:26:54 +00:00
fi
# Use the Kalibrate 'kal' binary if available.
if [ [ -x "`which kal`" ] ] ; then
2017-02-12 03:11:50 +00:00
echo -en "\e[33m Calibrating RTL-SDR device using Kalibrate, this may take up to 10 minutes...\e[97m"
2017-02-12 02:32:08 +00:00
CALIBRATION_GSM_SCAN = ` kal -d " ${ CALIBRATION_DEVICE_ID } " -g " ${ CALIBRATION_GAIN } " -s ${ CALIBRATION_GSM_BAND } 2>& 1 | grep "power:" | sort -n -r -k 7 | grep -m1 "power:" `
CALIBRATION_GSM_FREQ = ` echo ${ CALIBRATION_GSM_SCAN } | awk '{print $3}' | sed -e 's/(//g' -e 's/MHz//g' `
CALIBRATION_GSM_CHAN = ` echo ${ CALIBRATION_GSM_SCAN } | awk '{print $2}' `
2017-02-12 04:08:19 +00:00
if [ [ -n " ${ CALIBRATION_GSM_CHAN } " ] ] ; then
CALIBRATION_ERROR = ` kal -d " ${ CALIBRATION_DEVICE_ID } " -g " ${ CALIBRATION_GAIN } " -c " ${ CALIBRATION_GSM_CHAN } " 2>& 1 | grep "^average absolute error:" | awk '{print int($4)}' | sed -e 's/\-//g' `
else
echo -en " \e[33m Unable to calibrate RTL-SDR device \" ${ CALIBRATION_DEVICE_ID } \" on channel \" ${ CALIBRATION_GSM_CHAN } \"...\e[97m "
false
fi
2017-02-12 03:11:50 +00:00
# Otherwise use the gsm_scan binary provided with the OGN package.
2017-02-12 02:26:54 +00:00
elif [ [ -x " ${ COMPONENT_PROJECT_DIRECTORY } /gsm_scan " ] ] ; then
2017-02-12 03:11:50 +00:00
echo -en "\e[33m Calibrating RTL-SDR device using gsm_scan, this may take up to 20 minutes...\e[97m"
2017-02-12 02:32:08 +00:00
if [ [ " ${ CALIBRATION_GSM_BAND } " = "GSM850" ] ] ; then
CALIBRATION_GSM_OPTS = "--gsm850"
2017-02-12 02:26:54 +00:00
else
2017-02-12 02:32:08 +00:00
CALIBRATION_GSM_OPTS = ""
2017-02-12 02:26:54 +00:00
fi
2017-02-12 03:31:01 +00:00
CALIBRATION_GSM_SCAN = ` gsm_scan --device " ${ CALIBRATION_DEVICE_ID } " --gain " ${ CALIBRATION_GAIN } " ${ CALIBRATION_GSM_OPTS } 2>& 1 | grep "^[0-9]*\.[0-9]*MHz:" | sed -e 's/dB://g' -e 's/\+//g' | sort -n -r -k 2 | grep -m1 "ppm" `
2017-02-12 02:32:08 +00:00
CALIBRATION_GSM_FREQ = ` echo ${ CALIBRATION_GSM_SCAN } | awk '{print $1}' | sed -e 's/00MHz://g' `
CALIBRATION_ERROR = ` echo ${ CALIBRATION_GSM_SCAN } | awk '{print int(($3 + $4)/2)}' `
2017-02-12 02:26:54 +00:00
else
# No suitable tool found to perform cailbrations.
2017-02-12 02:32:08 +00:00
echo -en " \e[33m Unable to calibrate RTL-SDR device \" ${ CALIBRATION_DEVICE_ID } \"...\e[97m "
2017-02-12 02:26:54 +00:00
false
fi
else
# No tuner specified.
2017-02-12 03:31:01 +00:00
echo -en "\e[33m Unable calibrate due to invalid or no RTL-SDR device specified...\e[97m"
2017-02-12 02:26:54 +00:00
false
fi
}
2017-02-07 20:19:52 +00:00
## SET INSTALLATION VARIABLES
2016-12-30 21:27:32 +00:00
# Source the automated install configuration file if this is an automated installation.
2017-02-05 21:38:26 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "true" ] ] && [ [ -s " ${ RECEIVER_CONFIGURATION_FILE } " ] ] ; then
2016-12-30 21:27:32 +00:00
source ${ RECEIVER_CONFIGURATION_FILE }
fi
2017-02-05 21:38:26 +00:00
### BEGIN SETUP
2016-04-01 16:55:46 +00:00
2017-01-09 14:51:50 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2016-12-30 21:27:32 +00:00
clear
2017-01-01 18:48:22 +00:00
echo -e " \n\e[91m ${ RECEIVER_PROJECT_TITLE } "
2016-12-30 21:27:32 +00:00
fi
2016-12-19 17:50:20 +00:00
echo -e ""
2017-02-07 20:19:52 +00:00
echo -e " \e[92m Setting up ${ COMPONENT_NAME } ... "
2017-01-02 20:22:35 +00:00
echo -e ""
2017-01-02 20:19:23 +00:00
echo -e "\e[93m ------------------------------------------------------------------------------\e[96m"
2016-12-19 17:50:20 +00:00
echo -e ""
2017-02-05 21:38:26 +00:00
2017-01-09 14:51:50 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-02-07 20:19:52 +00:00
whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title " ${ COMPONENT_NAME } Setup " --yesno " ${ COMPONENT_NAME } ${ COMPONENT_DESC } .\n\n ${ COMPONENT_RADIO } .\n\n ${ COMPONENT_WEBSITE } \n\nContinue setup by installing ${ COMPONENT_NAME } ? " 14 78
2016-12-31 00:51:12 +00:00
if [ [ $? -eq 1 ] ] ; then
2016-12-30 22:49:42 +00:00
# Setup has been halted by the user.
echo -e "\e[91m \e[5mINSTALLATION HALTED!\e[25m"
echo -e " Setup has been halted at the request of the user."
echo -e ""
2017-01-02 20:19:23 +00:00
echo -e "\e[93m ------------------------------------------------------------------------------"
2017-02-07 20:19:52 +00:00
echo -e " \e[92m ${ COMPONENT_NAME } setup halted.\e[39m "
2016-12-30 22:49:42 +00:00
echo -e ""
2016-12-19 17:50:20 +00:00
read -p "Press enter to continue..." CONTINUE
2016-12-30 22:49:42 +00:00
exit 1
2016-12-19 17:50:20 +00:00
fi
2016-12-14 01:42:31 +00:00
fi
2016-04-01 16:55:46 +00:00
2017-02-05 21:38:26 +00:00
### CHECK FOR PREREQUISITE PACKAGES
2016-04-01 16:55:46 +00:00
2017-02-07 20:19:52 +00:00
echo -e " \e[95m Installing packages needed to fulfill dependencies for ${ COMPONENT_NAME } ...\e[97m "
2016-12-19 17:50:20 +00:00
echo -e ""
2017-01-02 17:19:06 +00:00
# Required by install script.
2016-04-01 16:55:46 +00:00
CheckPackage git
2017-02-12 03:12:16 +00:00
CheckPackage python-dev
CheckPackage python3-dev
2017-01-02 03:36:33 +00:00
# Required for USB SDR devices.
2016-04-01 16:55:46 +00:00
CheckPackage librtlsdr-dev
CheckPackage libusb-1.0-0-dev
2017-01-02 03:36:33 +00:00
CheckPackage rtl-sdr
2017-02-12 04:00:22 +00:00
# Required by component.
2017-01-02 03:36:33 +00:00
CheckPackage curl
CheckPackage libconfig9
2016-04-01 16:55:46 +00:00
CheckPackage libconfig-dev
2017-01-02 05:56:21 +00:00
CheckPackage libcurl3
2017-01-02 04:08:34 +00:00
CheckPackage libfftw3-3
2016-12-19 17:50:20 +00:00
CheckPackage libfftw3-dev
CheckPackage libjpeg8
2016-04-01 16:55:46 +00:00
CheckPackage libjpeg-dev
2017-01-02 03:36:33 +00:00
CheckPackage lynx
2016-12-19 17:50:20 +00:00
CheckPackage procserv
CheckPackage telnet
2017-01-01 18:48:22 +00:00
2017-01-02 17:54:12 +00:00
echo -e ""
2017-02-07 20:19:52 +00:00
echo -e " \e[95m Configuring this device to run the ${ COMPONENT_NAME } binaries...\e[97m "
2016-12-28 21:39:55 +00:00
echo -e ""
2016-04-01 16:55:46 +00:00
2017-02-05 21:38:26 +00:00
### BLACKLIST UNWANTED RTL-SDR MODULES FROM BEING LOADED
2016-04-01 16:55:46 +00:00
2017-02-05 21:38:26 +00:00
if [ [ ! -f "/etc/modprobe.d/rtlsdr-blacklist.conf" ] ] ; then
2017-01-02 21:47:26 +00:00
echo -en "\e[33m Stopping unwanted kernel modules from being loaded...\e[97m"
2016-12-28 21:39:55 +00:00
sudo tee /etc/modprobe.d/rtlsdr-blacklist.conf > /dev/null <<EOF
2016-04-01 16:55:46 +00:00
blacklist dvb_usb_rtl28xxu
blacklist dvb_usb_v2
blacklist rtl_2830
blacklist rtl_2832
blacklist r820t
blacklist rtl2830
blacklist rtl2832
EOF
2017-01-02 05:18:44 +00:00
CheckReturnCode
2016-12-28 21:39:55 +00:00
fi
2016-04-01 16:55:46 +00:00
2017-02-12 04:00:22 +00:00
### CHECK FOR EXISTING INSTALL AND IF SO STOP IT
2016-12-19 20:27:34 +00:00
2017-02-07 20:19:52 +00:00
if [ [ -f " ${ COMPONENT_SERVICE_SCRIPT_PATH } " ] ] ; then
echo -en " \e[33m Stopping the ${ COMPONENT_NAME } service...\e[97m "
ACTION = $( sudo ${ COMPONENT_SERVICE_SCRIPT_PATH } stop 2>& 1)
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-12-19 20:27:34 +00:00
fi
2017-01-11 20:19:18 +00:00
## FAILSAFE KILL
2017-01-11 22:03:29 +00:00
PIDS = ` ps -efww | egrep "(\./ogn-rf\ |\./ogn-decode\ )" | awk -vpid= $$ '$2 != pid { print $2 }' | tr '\n\r' ' ' `
2017-01-11 20:19:18 +00:00
if [ ! -z " ${ PIDS } " ] ; then
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Killing any running ${ COMPONENT_NAME } processes...\e[97m "
2017-01-11 21:49:16 +00:00
ACTION = $( sudo kill -9 ${ PIDS } )
2017-01-11 20:19:18 +00:00
CheckReturnCode
fi
2017-01-11 21:32:19 +00:00
unset PIDS
2017-01-11 20:19:18 +00:00
2017-01-03 00:20:02 +00:00
### ASSIGN RTL-SDR DONGLES
2017-01-03 00:31:13 +00:00
2017-02-11 02:25:07 +00:00
# Count the number of tuners available.
RECEIVER_TUNERS_AVAILABLE = ` rtl_eeprom 2>& 1 | grep -c "^\s*[0-9]*:\s" `
2017-02-12 04:00:22 +00:00
# Start counting the number of tuners required with one for this component.
2017-02-11 02:25:07 +00:00
RECEIVER_TUNERS_REQUIRED = "1"
2017-02-12 04:00:22 +00:00
# Check which components are installed.
2017-01-03 00:31:13 +00:00
echo -e "\e[95m Checking for existing decoders...\e[97m"
echo -e ""
2017-02-11 02:25:07 +00:00
# Check if any of the dump1090 forks are installed.
2017-02-12 04:00:22 +00:00
echo -en "\e[94m Checking if any of the dump1090 packages are installed...\e[97m"
2017-01-03 00:31:13 +00:00
# Check if the dump1090-mutability package is installed.
if [ [ $( dpkg-query -W -f= '${STATUS}' dump1090-mutability 2>/dev/null | grep -c "ok installed" ) -eq 1 ] ] ; then
2017-02-11 02:25:07 +00:00
RECEIVER_TUNERS_REQUIRED = $(( RECEIVER_TUNERS_REQUIRED+1))
DUMP1090_IS_INSTALLED = "true"
# Check if the dump1090-fa package is installed.
elif [ [ $( dpkg-query -W -f= '${STATUS}' dump1090-fa 2>/dev/null | grep -c "ok installed" ) -eq 1 ] ] ; then
RECEIVER_TUNERS_REQUIRED = $(( RECEIVER_TUNERS_REQUIRED+1))
2017-01-03 00:31:13 +00:00
DUMP1090_IS_INSTALLED = "true"
else
DUMP1090_IS_INSTALLED = "false"
fi
2017-02-11 02:25:07 +00:00
CheckReturnCode
2017-01-03 00:31:13 +00:00
# Check if the dump978 binaries exist.
2017-02-11 02:25:07 +00:00
echo -en "\e[94m Checking if the dump978 binaries exist on this device...\e[97m"
2017-02-05 21:38:26 +00:00
if [ [ -f " ${ RECEIVER_BUILD_DIRECTORY } /dump978/dump978 " ] ] && [ [ -f " ${ RECEIVER_BUILD_DIRECTORY } /dump978/uat2text " ] ] && [ [ -f " ${ RECEIVER_BUILD_DIRECTORY } /dump978/uat2esnt " ] ] && [ [ -f " ${ RECEIVER_BUILD_DIRECTORY } /dump978/uat2json " ] ] ; then
2017-02-11 02:25:07 +00:00
RECEIVER_TUNERS_REQUIRED = $(( RECEIVER_TUNERS_REQUIRED+1))
2017-01-03 00:31:13 +00:00
DUMP978_IS_INSTALLED = "true"
else
DUMP978_IS_INSTALLED = "false"
fi
2017-02-11 02:25:07 +00:00
CheckReturnCode
2017-01-03 00:20:02 +00:00
2017-01-03 00:24:50 +00:00
# Multiple RTL_SDR tuners found, check if device specified for this decoder is present.
2017-02-11 02:25:07 +00:00
if [ [ " ${ RECEIVER_TUNERS_AVAILABLE } " -gt 1 ] ] ; then
2017-01-03 00:24:50 +00:00
# If a device has been specified by serial number then try to match that with the currently detected tuners.
2017-01-09 15:01:16 +00:00
if [ [ -n " ${ OGN_DEVICE_SERIAL } " ] ] ; then
2017-02-11 02:25:07 +00:00
for DEVICE_ID in ` seq 0 ${ RECEIVER_TUNERS_AVAILABLE } ` ; do
2017-01-03 00:24:50 +00:00
if [ [ ` rtl_eeprom -d ${ DEVICE_ID } 2>& 1 | grep -c " Serial number:\s* ${ OGN_DEVICE_SERIAL } $" ` -eq 1 ] ] ; then
2017-02-07 20:19:52 +00:00
echo -en " \e[33m RTL-SDR with Serial \" ${ OGN_DEVICE_SERIAL } \" found at device \" ${ OGN_DEVICE_ID } \" and will be assigned to ${ COMPONENT_NAME } ...\e[97m "
2017-01-03 00:24:50 +00:00
OGN_DEVICE_ID = ${ DEVICE_ID }
fi
done
# If no match for this serial then assume the highest numbered tuner will be used.
2017-01-09 15:01:16 +00:00
if [ [ -z " ${ OGN_DEVICE_ID } " ] ] ; then
2017-02-11 02:25:07 +00:00
echo -en " \e[33m RTL-SDR with Serial \" ${ OGN_DEVICE_SERIAL } \" not found, assigning device \" ${ RECEIVER_TUNERS_AVAILABLE } \" to ${ COMPONENT_NAME } ...\e[97m "
OGN_DEVICE_ID = ${ RECEIVER_TUNERS_AVAILABLE }
2017-01-03 00:24:50 +00:00
fi
# Or if a device has been specified by device ID then confirm this is currently detected.
2017-01-09 15:01:16 +00:00
elif [ [ -n " ${ OGN_DEVICE_ID } " ] ] ; then
2017-01-03 00:24:50 +00:00
if [ [ ` rtl_eeprom -d ${ OGN_DEVICE_ID } 2>& 1 | grep -c " ^\s* ${ OGN_DEVICE_ID } :\s " ` -eq 1 ] ] ; then
2017-02-07 20:19:52 +00:00
echo -en " \e[33m RTL-SDR device \" ${ OGN_DEVICE_ID } \" found and will be assigned to ${ COMPONENT_NAME } ...\e[97m "
2017-01-03 00:24:50 +00:00
# If no match for this serial then assume the highest numbered tuner will be used.
else
2017-02-11 02:25:07 +00:00
echo -en " \e[33m RTL-SDR device \" ${ OGN_DEVICE_ID } \" not found, assigning device \" ${ RECEIVER_TUNERS_AVAILABLE } \" to ${ COMPONENT_NAME } ...\e[97m "
OGN_DEVICE_ID = ${ RECEIVER_TUNERS_AVAILABLE }
2017-01-03 00:24:50 +00:00
fi
# Failing that configure it with device ID 0.
else
2017-02-07 20:19:52 +00:00
echo -en " \e[33m No RTL-SDR device specified, assigning device \"0\" to ${ COMPONENT_NAME } ...\e[97m "
2017-02-11 02:25:07 +00:00
OGN_DEVICE_ID = ${ RECEIVER_TUNERS_AVAILABLE }
2017-01-03 00:24:50 +00:00
fi
# Single tuner present so assign device 0 and stop any other running decoders, or at least dump1090-mutablity for a default install.
2017-02-11 02:25:07 +00:00
elif [ [ " ${ RECEIVER_TUNERS_AVAILABLE } " -eq 1 ] ] ; then
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Single RTL-SDR device \"0\" detected and assigned to ${ COMPONENT_NAME } ...\e[97m "
2017-01-03 00:24:50 +00:00
OGN_DEVICE_ID = "0"
2017-01-03 03:02:16 +00:00
ACTION = $( sudo /etc/init.d/dump1090-mutability stop 2>& 1)
2017-01-03 00:24:50 +00:00
# No tuners present so assign device 0 and stop any other running decoders, or at least dump1090-mutablity for a default install.
2017-02-11 02:25:07 +00:00
elif [ [ " ${ RECEIVER_TUNERS_AVAILABLE } " -lt 1 ] ] ; then
2017-02-07 20:19:52 +00:00
echo -en " \e[33m No RTL-SDR device detected so ${ COMPONENT_NAME } will be assigned device \"0\"...\e[97m "
2017-01-03 00:24:50 +00:00
OGN_DEVICE_ID = "0"
2017-01-03 03:02:16 +00:00
ACTION = $( sudo /etc/init.d/dump1090-mutability stop 2>& 1)
2017-01-03 00:24:50 +00:00
fi
CheckReturnCode
2017-01-03 00:31:13 +00:00
# If either dump1090 or dump978 is installed we must assign RTL-SDR dongles for each of these decoders.
2017-01-09 14:51:50 +00:00
if [ [ " ${ DUMP1090_IS_INSTALLED } " = "true" ] ] || [ [ " ${ DUMP978_IS_INSTALLED } " = "true" ] ] ; then
2017-01-03 00:31:13 +00:00
# Check if Dump1090 is installed.
2017-01-09 14:51:50 +00:00
if [ [ " ${ DUMP1090_IS_INSTALLED } " = "true" ] ] ; then
2017-01-03 00:31:13 +00:00
# The dump1090-mutability package appear to be installed.
2017-01-09 14:51:50 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-01-03 00:31:13 +00:00
# Ask the user which USB device is to be used for dump1090.
2017-01-03 03:42:50 +00:00
DUMP1090_DEVICE_ID = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "Dump1090 RTL-SDR Dongle" --nocancel --inputbox "\nEnter the ID for your dump1090 RTL-SDR dongle." 8 78 3>& 1 1>& 2 2>& 3)
2017-01-09 15:01:16 +00:00
while [ [ -z " ${ DUMP1090_DEVICE_ID } " ] ] ; do
2017-01-03 03:42:50 +00:00
DUMP1090_DEVICE_ID = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "Dump1090 RTL-SDR Dongle (REQUIRED)" --nocancel --inputbox "\nEnter the ID for your dump1090 RTL-SDR dongle." 8 78 3>& 1 1>& 2 2>& 3)
2017-01-03 00:31:13 +00:00
done
else
### GET DONGLE ID FROM THE INSTALLATION CONFIGURATION FILE...
true
fi
fi
# Check if Dump978 is installed.
2017-01-09 14:51:50 +00:00
if [ [ " ${ DUMP978_IS_INSTALLED } " = "true" ] ] ; then
2017-01-03 00:31:13 +00:00
# The dump978 binaries appear to exist on this device.
2017-01-09 14:51:50 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-01-03 00:31:13 +00:00
# Ask the user which USB device is to be use for dump978.
2017-01-03 03:42:50 +00:00
DUMP978_DEVICE_ID = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "Dump978 RTL-SDR Dongle" --nocancel --inputbox "\nEnter the ID for your dump978 RTL-SDR dongle." 8 78 3>& 1 1>& 2 2>& 3)
2017-01-09 15:01:16 +00:00
while [ [ -z " ${ DUMP978_DEVICE_ID } " ] ] ; do
2017-01-03 03:42:50 +00:00
DUMP978_DEVICE_ID = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "Dump978 RTL-SDR Dongle (REQUIRED)" --nocancel --inputbox "\nEnter the ID for your dump978 RTL-SDR dongle." 8 78 3>& 1 1>& 2 2>& 3)
2017-01-03 00:31:13 +00:00
done
else
### GET DONGLE ID FROM THE INSTALLATION CONFIGURATION FILE...
true
fi
fi
#
2017-01-09 14:51:50 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-01-03 00:31:13 +00:00
# Ask the user which USB device is to be use for RTL-SDR OGN.
2017-01-03 03:42:50 +00:00
RTLSDROGN_DEVICE_ID = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "RTL-SDR OGN RTL-SDR Dongle" --nocancel --inputbox "\nEnter the ID for your RTL-SDR OGN RTL-SDR dongle." 8 78 3>& 1 1>& 2 2>& 3)
2017-02-12 04:14:20 +00:00
while [ [ -z " ${ RTLSDROGN_DEVICE_ID } " ] ] ; do
2017-01-03 03:42:50 +00:00
RTLSDROGN_DEVICE_ID = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "RTL-SDR OGN RTL-SDR Dongle (REQUIRED)" --nocancel --inputbox "\nEnter the ID for your RTL-SDR OGN RTL-SDR dongle." 8 78 3>& 1 1>& 2 2>& 3)
2017-01-03 00:31:13 +00:00
done
else
### GET DONGLE ID FROM THE INSTALLATION CONFIGURATION FILE...
true
fi
# Assign the specified RTL-SDR dongle to dump1090.
2017-01-09 15:01:16 +00:00
if [ [ " ${ DUMP1090_IS_INSTALLED } " = "true" ] ] && [ [ -n " ${ DUMP1090_DEVICE_ID } " ] ] ; then
2017-02-08 16:20:35 +00:00
echo -e " \e[94m Assigning RTL-SDR dongle \" ${ DUMP1090_DEVICE_ID } \" to dump1090-mutability...\e[97m "
2017-01-03 03:42:50 +00:00
ChangeConfig "DEVICE" ${ DUMP1090_DEVICE_ID } "/etc/default/dump1090-mutability"
2017-01-03 00:31:13 +00:00
echo -e "\e[94m Reloading dump1090-mutability...\e[97m"
echo -e ""
2017-01-03 03:02:16 +00:00
ACTION = $( sudo /etc/init.d/dump1090-mutability force-reload 2>& 1)
2017-01-03 00:31:13 +00:00
echo -e ""
fi
# Assign the specified RTL-SDR dongle to dump978
2017-01-09 15:01:16 +00:00
if [ [ " ${ DUMP978_IS_INSTALLED } " = "true" ] ] && [ [ -n " ${ DUMP978_DEVICE_ID } " ] ] ; then
2017-01-03 03:42:50 +00:00
echo -e " \e[94m Assigning RTL-SDR dongle \" ${ DUMP978_DEVICE_ID } \" to dump978...\e[97m "
2017-01-03 00:31:13 +00:00
### ADD DEVICE TO MAINTENANCE SCRIPT...
echo -e "\e[94m Reloading dump978...\e[97m"
### KILL EXISTING DUMP978 PROCESSES...
echo -e ""
### RESTART DUMP978...
echo -e ""
fi
fi
2016-12-19 17:50:20 +00:00
### DOWNLOAD AND SET UP THE BINARIES
2016-04-01 16:55:46 +00:00
2016-12-19 20:27:34 +00:00
# Create build directory if not already present.
2017-02-07 20:19:52 +00:00
if [ [ ! -d " ${ COMPONENT_BUILD_DIRECTORY } " ] ] ; then
echo -en " \e[33m Creating build directory \"\e[37m ${ COMPONENT_BUILD_DIRECTORY } \e[33m\"...\e[97m "
ACTION = $( mkdir -vp ${ COMPONENT_BUILD_DIRECTORY } 2>& 1)
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-12-19 20:27:34 +00:00
fi
2016-12-28 21:39:55 +00:00
# Enter the build directory.
2017-02-07 20:19:52 +00:00
if [ [ ! " ${ PWD } " = " ${ COMPONENT_BUILD_DIRECTORY } " ] ] ; then
echo -en " \e[33m Entering build directory \"\e[37m ${ COMPONENT_BUILD_DIRECTORY } \e[33m\"...\e[97m "
2017-02-12 01:44:40 +00:00
cd ${ COMPONENT_BUILD_DIRECTORY } 2>& 1
2017-01-03 04:13:26 +00:00
ACTION = ${ PWD }
2016-12-30 17:05:52 +00:00
CheckReturnCode
fi
2016-12-19 20:27:34 +00:00
2016-12-30 17:05:52 +00:00
# Detect CPU Architecture.
2017-01-09 15:58:24 +00:00
Check_CPU
CheckReturnCode
2016-12-29 17:36:39 +00:00
2016-12-30 17:05:52 +00:00
# Identify the correct binaries to download.
2016-12-29 17:36:39 +00:00
case ${ CPU_ARCHITECTURE } in
2016-04-01 16:55:46 +00:00
"armv6l" )
2017-02-05 21:38:26 +00:00
# Raspberry Pi 1.
2017-02-07 20:19:52 +00:00
COMPONENT_BINARY_URL = "http://download.glidernet.org/rpi-gpu/rtlsdr-ogn-bin-RPI-GPU-latest.tgz"
2016-04-01 16:55:46 +00:00
; ;
"armv7l" )
2017-02-05 21:38:26 +00:00
# Raspberry Pi 2 onwards.
2017-02-07 20:19:52 +00:00
COMPONENT_BINARY_URL = "http://download.glidernet.org/arm/rtlsdr-ogn-bin-ARM-latest.tgz"
2016-04-01 16:55:46 +00:00
; ;
"x86_64" )
2017-02-05 21:38:26 +00:00
# 64 Bit.
2017-02-07 20:19:52 +00:00
COMPONENT_BINARY_URL = "http://download.glidernet.org/x64/rtlsdr-ogn-bin-x64-latest.tgz"
2016-04-01 16:55:46 +00:00
; ;
*)
2017-02-05 21:38:26 +00:00
# 32 Bit (default install if no others matched).
2017-02-07 20:19:52 +00:00
COMPONENT_BINARY_URL = "http://download.glidernet.org/x86/rtlsdr-ogn-bin-x86-latest.tgz"
2016-04-01 16:55:46 +00:00
; ;
esac
2016-12-30 17:26:05 +00:00
# Attempt to download and extract binaries.
2017-02-07 20:19:52 +00:00
if [ [ ` echo " ${ COMPONENT_BINARY_URL } " | grep -c "^http" ` -gt 0 ] ] ; then
2016-12-30 17:05:52 +00:00
# Download binaries.
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Downloading ${ COMPONENT_NAME } binaries for \"\e[37m ${ CPU_ARCHITECTURE } \e[33m\" architecture...\e[97m "
COMPONENT_BINARY_FILE = ` echo ${ COMPONENT_BINARY_URL } | awk -F "/" '{print $NF}' `
ACTION = $( curl -L ${ COMPONENT_BINARY_URL } -o ${ COMPONENT_BUILD_DIRECTORY } /${ COMPONENT_BINARY_FILE } 2>& 1)
2016-12-30 17:05:52 +00:00
CheckReturnCode
# Extract binaries.
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Extracting ${ COMPONENT_NAME } package \"\e[37m ${ COMPONENT_BINARY_FILE } \e[33m\"...\e[97m "
ACTION = $( tar -vxzf " ${ COMPONENT_BUILD_DIRECTORY } / ${ COMPONENT_BINARY_FILE } " -C " ${ COMPONENT_BUILD_DIRECTORY } " 2>& 1)
2016-12-30 17:05:52 +00:00
CheckReturnCode
else
2016-12-30 17:26:05 +00:00
# Unable to download bimary due to invalid URL.
2017-02-11 02:25:07 +00:00
echo -e " \e[33m Error invalid COMPONENT_BINARY_URL \"\e[37m ${ COMPONENT_BINARY_URL } \e[33m\"...\e[97m "
2016-12-30 17:05:52 +00:00
exit 1
fi
2016-04-01 16:55:46 +00:00
2017-02-07 20:19:52 +00:00
# Change to component work directory for post-build actions.
COMPONENT_PROJECT_DIRECTORY = " ${ COMPONENT_BUILD_DIRECTORY } /rtlsdr-ogn "
if [ [ -d " ${ COMPONENT_PROJECT_DIRECTORY } " ] ] ; then
2017-02-12 01:44:40 +00:00
cd ${ COMPONENT_PROJECT_DIRECTORY } 2>& 1
2017-01-02 04:34:37 +00:00
else
2017-02-11 02:25:07 +00:00
echo -e " \e[33m Error unable to access \"\e[37m ${ COMPONENT_PROJECT_DIRECTORY } \e[33m\"...\e[97m "
2017-01-02 04:34:37 +00:00
exit 1
fi
2016-12-21 14:28:25 +00:00
2016-12-30 17:05:52 +00:00
# Create named pipe if required.
2017-02-07 20:19:52 +00:00
if [ [ ! -p " ${ COMPONENT_PROJECT_DIRECTORY } /ogn-rf.fifo " ] ] ; then
2017-01-02 21:47:26 +00:00
echo -en "\e[33m Creating named pipe...\e[97m"
2017-02-07 20:19:52 +00:00
ACTION = $( sudo mkfifo ${ COMPONENT_PROJECT_DIRECTORY } /ogn-rf.fifo 2>& 1)
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-12-21 14:28:25 +00:00
fi
2016-04-01 16:55:46 +00:00
# Set file permissions.
2017-01-02 21:47:26 +00:00
echo -en "\e[33m Setting proper file permissions...\e[97m"
2017-02-07 20:19:52 +00:00
COMPONENT_SETUID_BINARIES = "gsm_scan ogn-rf rtlsdr-ogn"
COMPONENT_SETUID_COUNT = "0"
for COMPONENT_SETUID_BINARY in ${ COMPONENT_SETUID_BINARIES } ; do
COMPONENT_SETUID_COUNT = $(( COMPONENT_SETUID_COUNT+1))
ACTION = $( sudo chown -v root ${ COMPONENT_SETUID_BINARY } 2>& 1)
ACTION = $( sudo chmod -v a+s ${ COMPONENT_SETUID_BINARY } 2>& 1)
2016-12-28 21:39:55 +00:00
done
2016-12-30 17:05:52 +00:00
# And check that the file permissions have been applied.
2017-02-07 20:19:52 +00:00
if [ [ ` ls -l ${ COMPONENT_SETUID_BINARIES } | grep -c "\-rwsr-sr-x" ` -eq " ${ COMPONENT_SETUID_COUNT } " ] ] ; then
2016-12-30 17:05:52 +00:00
true
else
2016-12-30 17:26:05 +00:00
false
2016-12-30 17:05:52 +00:00
fi
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-04-01 16:55:46 +00:00
2016-12-30 17:05:52 +00:00
# Creat GPU device if required.
2017-02-07 20:19:52 +00:00
if [ [ ! -c " ${ COMPONENT_PROJECT_DIRECTORY } /gpu_dev " ] ] ; then
2017-02-11 02:25:07 +00:00
# The mknod major_version number varies with kernel version.
2017-01-02 21:47:26 +00:00
echo -en "\e[33m Getting the version of the kernel currently running...\e[97m"
2016-12-21 14:28:25 +00:00
KERNEL = ` uname -r`
2017-01-09 15:14:44 +00:00
KERNEL_VERSION = ` echo ${ KERNEL } | cut -d \. -f 1` .` echo ${ KERNEL } | cut -d \. -f 2`
2016-12-28 21:39:55 +00:00
CheckReturnCode
2017-02-12 04:00:22 +00:00
# Check if the currently running kernel is version 4.1 or higher.
2017-01-09 15:14:44 +00:00
if [ [ " ${ KERNEL_VERSION } " < 4.1 ] ] ; then
2016-12-21 14:28:25 +00:00
# Kernel is older than version 4.1.
2017-01-02 20:05:51 +00:00
echo -en "\e[33m Executing mknod for older kernels...\e[97m"
2017-02-07 20:19:52 +00:00
ACTION = $( sudo mknod ${ COMPONENT_PROJECT_DIRECTORY } /gpu_dev c 100 0 2>& 1)
2016-12-21 14:28:25 +00:00
else
# Kernel is version 4.1 or newer.
2017-01-02 20:05:51 +00:00
echo -en "\e[33m Executing mknod for newer kernels...\e[97m"
2017-02-07 20:19:52 +00:00
ACTION = $( sudo mknod ${ COMPONENT_PROJECT_DIRECTORY } /gpu_dev c 249 0 2>& 1)
2016-12-21 14:28:25 +00:00
fi
2016-12-30 17:05:52 +00:00
CheckReturnCode
2016-04-01 16:55:46 +00:00
fi
2017-02-12 03:11:50 +00:00
## GATHER INFORMATION FROM USER
2016-12-19 17:50:20 +00:00
2017-02-12 01:44:40 +00:00
# Skip over this dialog if this installation is set to be automated.
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
# Explain to the user that the receiver's latitude and longitude is required.
whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "Receiver Latitude and Longitude" --msgbox "Your receivers latitude and longitude are required for distance calculations to work properly. You will now be asked to supply the latitude and longitude for your receiver. If you do not have this information you get it by using the web based \"Geocode by Address\" utility hosted on another of my websites.\n\n https://www.swiftbyte.com/toolbox/geocode" 13 78
fi
2016-12-19 17:50:20 +00:00
2016-12-29 17:36:39 +00:00
# Latitude.
2017-02-12 01:44:40 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-02-12 03:11:50 +00:00
# Ask the user to confirm the receivers latitude, this will be populated with the latitude configured in dump1090-mutability.
2017-02-12 01:44:40 +00:00
COMPONENT_LATITUDE_TITLE = "Receiver Latitude"
while [ [ -z " ${ COMPONENT_LATITUDE } " ] ] ; do
if [ [ -n " ${ RECEIVER_LATITUDE } " ] ] ; then
COMPONENT_LATITUDE = " ${ RECEIVER_LATITUDE } "
COMPONENT_LATITUDE_SOURCE = " the ${ RECEIVER_PROJECT_TITLE } configuration file "
elif [ [ -s /etc/default/dump1090-mutability ] ] && [ [ ` grep -c "^LAT" "/etc/default/dump1090-mutability" ` -gt 0 ] ] ; then
COMPONENT_LATITUDE = $( GetConfig "LAT" "/etc/default/dump1090-mutability" )
COMPONENT_LATITUDE_SOURCE = "the Dump1090 configuration file"
fi
if [ [ -n " ${ COMPONENT_LATITUDE_SOURCE } " ] ] ; then
COMPONENT_LATITUDE_SOURCE_MESSAGE = " , the value below is sourced from ${ COMPONENT_LATITUDE_SOURCE } "
fi
COMPONENT_LATITUDE = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --backtitle " ${ BACKTITLETEXT } " --title " ${ COMPONENT_LATITUDE_TITLE } " --nocancel --inputbox " \nPlease confirm your receiver's latitude ${ COMPONENT_LATITUDE_SOURCE_MESSAGE } :\n " 10 78 -- " ${ COMPONENT_LATITUDE } " 3>& 1 1>& 2 2>& 3)
COMPONENT_LATITUDE_TITLE = "Receiver Latitude (REQUIRED)"
done
else
# Use receiver coordinates if already know, otherwise populate with dummy values to ensure valid config generation.
2017-01-09 15:01:16 +00:00
if [ [ -n " ${ RECEIVER_LATITUDE } " ] ] ; then
2017-02-12 01:44:40 +00:00
COMPONENT_LATITUDE = " ${ RECEIVER_LATITUDE } "
elif [ [ -s /etc/default/dump1090-mutability ] ] && [ [ ` grep -c "^LAT" "/etc/default/dump1090-mutability" ` -gt 0 ] ] ; then
COMPONENT_LATITUDE = $( GetConfig "LAT" "/etc/default/dump1090-mutability" )
2016-12-22 10:51:55 +00:00
else
2017-02-12 01:44:40 +00:00
COMPONENT_LATITUDE = "0.000"
2016-12-22 10:51:55 +00:00
fi
2016-12-19 17:50:20 +00:00
fi
2016-04-01 16:55:46 +00:00
2016-12-29 17:36:39 +00:00
# Longitude.
2017-02-12 01:44:40 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-02-12 03:11:50 +00:00
# Ask the user to confirm the receivers longitude, this will be populated with the longitude configured in dump1090-mutability.
2017-02-12 01:44:40 +00:00
COMPONENT_LONGITUDE_TITLE = "Receiver Longitude"
while [ [ -z " ${ COMPONENT_LONGITUDE } " ] ] ; do
if [ [ -n " ${ RECEIVER_LONGITUDE } " ] ] ; then
COMPONENT_LONGITUDE = " ${ RECEIVER_LONGITUDE } "
COMPONENT_LONGITUDE_SOURCE = " the ${ RECEIVER_PROJECT_TITLE } configuration file "
elif [ [ -s /etc/default/dump1090-mutability ] ] && [ [ ` grep -c "^LON" "/etc/default/dump1090-mutability" ` -gt 0 ] ] ; then
COMPONENT_LONGITUDE = $( GetConfig "LON" "/etc/default/dump1090-mutability" )
COMPONENT_LONGITUDE_SOURCE = "the Dump1090 configuration file"
fi
if [ [ -n " ${ COMPONENT_LONGITUDE_SOURCE } " ] ] ; then
COMPONENT_LONGITUDE_SOURCE_MESSAGE = " , the value below is sourced from ${ COMPONENT_LONGITUDE_SOURCE } "
fi
COMPONENT_LONGITUDE = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --backtitle " ${ BACKTITLETEXT } " --title " ${ COMPONENT_LONGITUDE_TITLE } " --nocancel --inputbox " \nPlease confirm your receiver's longitude ${ COMPONENT_LONGITUDE_SOURCE_MESSAGE } :\n " 10 78 -- " ${ COMPONENT_LONGITUDE } " 3>& 1 1>& 2 2>& 3)
COMPONENT_LONGITUDE_TITLE = "Receiver Longitude (REQUIRED)"
done
else
# Use receiver coordinates if already know, otherwise populate with dummy values to ensure valid config generation.
2017-01-09 15:01:16 +00:00
if [ [ -n " ${ RECEIVER_LONGITUDE } " ] ] ; then
2017-02-12 01:44:40 +00:00
COMPONENT_LONGITUDE = " ${ RECEIVER_LONGITUDE } "
elif [ [ -s /etc/default/dump1090-mutability ] ] && [ [ ` grep -c "^LON" "/etc/default/dump1090-mutability" ` -gt 0 ] ] ; then
COMPONENT_LONGITUDE = $( GetConfig "LON" "/etc/default/dump1090-mutability" )
2016-12-22 10:51:55 +00:00
else
2017-02-12 01:44:40 +00:00
COMPONENT_LONGITUDE = "0.000"
2016-12-22 10:51:55 +00:00
fi
2016-12-29 17:49:18 +00:00
fi
2016-12-22 10:51:55 +00:00
2016-12-29 17:36:39 +00:00
# Altitude.
2017-02-12 01:44:40 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-02-12 03:11:50 +00:00
# Ask the user to confirm the receivers altitude, this will be populated with an altutude value derived from the configured LAT/LON.
2017-02-12 01:44:40 +00:00
COMPONENT_ALTITUDE_TITLE = "Receiver Altitude"
while [ [ -z " ${ COMPONENT_ALTITUDE } " ] ] ; do
2017-02-12 04:30:06 +00:00
if [ [ -n " ${ COMPONENT_LATITUDE } " ] ] && [ [ -n " ${ COMPONENT_LONGITUDE } " ] ] ; then
COMPONENT_ALTITUDE = $( curl -s https://maps.googleapis.com/maps/api/elevation/json?locations= ${ COMPONENT_LATITUDE } ,${ COMPONENT_LONGITUDE } | python -c "import json,sys;obj=json.load(sys.stdin);print obj['results'][0]['elevation'];" | awk '{printf("%.2f\n", $1)}' )
2017-02-12 01:44:40 +00:00
COMPONENT_ALTITUDE_SOURCE = ", the below value is obtained from google but should be increased to reflect your antennas height above ground level"
fi
if [ [ -n " ${ COMPONENT_ALTITUDE_SOURCE } " ] ] ; then
COMPONENT_ALTITUDE_SOURCE_MESSAGE = " , the value below is sourced from ${ COMPONENT_ALTITUDE_SOURCE } "
fi
COMPONENT_ALTITUDE = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --backtitle " ${ BACKTITLETEXT } " --title " ${ COMPONENT_ALTITUDE_TITLE } " --nocancel --inputbox " \nPlease confirm your receiver's altitude in meters ${ COMPONENT_ALTITUDE_SOURCE_MESSAGE } :\n " 10 78 -- " ${ COMPONENT_ALTITUDE } " 3>& 1 1>& 2 2>& 3)
COMPONENT_ALTITUDE_TITLE = "Receiver Altitude (REQUIRED)"
done
else
# Use receiver coordinates if already know, otherwise populate with dummy values to ensure valid config generation.
2017-01-09 15:01:16 +00:00
if [ [ -n " ${ RECEIVER_ALTITUDE } " ] ] ; then
2017-02-12 01:44:40 +00:00
COMPONENT_ALTITUDE = " ${ RECEIVER_ALTITUDE } "
elif [ [ -n " ${ COMPONENT_LATITUDE } " ] ] && [ [ -n " ${ COMPONENT_LONGITUDE } " ] ] ; then
COMPONENT_ALTITUDE = $( curl -s https://maps.googleapis.com/maps/api/elevation/json?locations= ${ RECEIVER_LATITUDE } ,${ RECEIVER_LONGITUDE } | python -c "import json,sys;obj=json.load(sys.stdin);print obj['results'][0]['elevation'];" | awk '{printf("%.2f\n", $1)}' )
2016-12-22 10:51:55 +00:00
else
2017-02-12 01:44:40 +00:00
COMPONENT_ALTITUDE = "0.000"
2016-12-22 10:51:55 +00:00
fi
2016-12-19 17:50:20 +00:00
fi
2016-04-01 16:55:46 +00:00
2017-02-11 02:25:07 +00:00
# Check for component specific variables, otherwise populate with dummy values to ensure valid config generation.
2017-02-12 02:01:07 +00:00
# Set receiver callsign for this decoder.
# This should be between 3 and 9 alphanumeric charactors, with no punctuation.
# Please see: http://wiki.glidernet.org/receiver-naming-convention
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
COMPONENT_RECEIVER_NAME_TITLE = "Receiver Name"
while [ [ -z " ${ COMPONENT_RECEIVER_NAME } " ] ] || [ [ ` echo -n ${ COMPONENT_RECEIVER_NAME } | wc -c` -gt 9 ] ] ; do
COMPONENT_RECEIVER_NAME = $( whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --backtitle " ${ BACKTITLETEXT } " --title " ${ COMPONENT_RECEIVER_NAME_TITLE } " --nocancel --inputbox "\nPlease confirm your receiver name, tThis should be between 3 and 9 alphanumeric charactors and contain no punctuation or special charactors:\n" 10 78 -- " ${ COMPONENT_RECEIVER_NAME } " 3>& 1 1>& 2 2>& 3)
COMPONENT_RECEIVER_NAME_TITLE = "Receiver Name (REQUIRED)"
done
else
if [ [ -n " ${ OGN_RECEIVER_NAME } " ] ] ; then
COMPONENT_RECEIVER_NAME = ` echo ${ OGN_RECEIVER_NAME } | tr -cd '[:alnum:]' | cut -c -9`
else
COMPONENT_RECEIVER_NAME = ` hostname -s | tr -cd '[:alnum:]' | cut -c -9`
fi
fi
2016-12-29 17:36:39 +00:00
# Geoid separation: FLARM transmits GPS altitude, APRS uses means Sea level altitude.
2016-12-19 17:50:20 +00:00
# To find value you can check: http://geographiclib.sourceforge.net/cgi-bin/GeoidEval
2016-12-29 17:36:39 +00:00
# Need to derive from co-ords but will set to altitude as a placeholders.
2017-01-09 15:01:16 +00:00
if [ [ -z " ${ OGN_GEOID } " ] ] ; then
2017-02-12 02:01:07 +00:00
if [ [ -n " ${ COMPONENT_ALTITUDE } " ] ] ; then
OGN_GEOID = " ${ COMPONENT_ALTITUDE } "
2016-12-22 13:31:42 +00:00
else
OGN_GEOID = "0"
fi
2016-12-19 17:50:20 +00:00
fi
2016-04-01 16:55:46 +00:00
2017-02-12 03:19:59 +00:00
# Future option to enable OGN whitelist.
2017-02-12 02:01:07 +00:00
if [ [ -z " ${ OGN_WHITELIST } " ] ] ; then
OGN_WHITELIST = "0"
fi
# Gain value for RTL-SDR device.
if [ [ -z " ${ OGN_GSM_GAIN } " ] ] ; then
2017-02-12 02:32:08 +00:00
if [ [ -n " ${ CALIBRATION_GAIN } " ] ] ; then
OGN_GSM_GAIN = " ${ CALIBRATION_GAIN } "
2016-12-22 13:31:42 +00:00
else
2017-02-12 04:08:19 +00:00
OGN_GSM_GAIN = "40"
2016-12-22 13:31:42 +00:00
fi
2016-12-19 17:50:20 +00:00
fi
2016-04-01 16:55:46 +00:00
2017-02-12 03:31:01 +00:00
# Ask if user would like to calibrate the tuner.
2017-02-12 02:50:18 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-02-12 03:19:59 +00:00
whiptail --backtitle " ${ RECEIVER_PROJECT_TITLE } " --title "Tuner Calibration" --yesno " Would you like to calibrate the device \" ${ OGN_DEVICE_ID } \" which has been configured for use with ${ COMPONENT_NAME } ?\n\nPlease be aware this may take between 10 and 20 minutes. " 8 78
2017-02-12 02:50:18 +00:00
if [ [ $? -eq 0 ] ] ; then
# User would like to calibrate the tuner.
2017-02-12 03:19:59 +00:00
COMPONENT_DO_CALIBRATE = "true"
2017-02-12 02:50:18 +00:00
fi
elif [ [ -z " ${ OGN_FREQ_CORR } " ] ] || [ [ -z " ${ OGN_GSM_FREQ } " ] ] ; then
2017-02-12 03:19:59 +00:00
COMPONENT_DO_CALIBRATE = "true"
fi
2017-02-12 03:31:01 +00:00
# Calculate RTL-SDR device error rate.
2017-02-12 03:19:59 +00:00
if [ [ " ${ COMPONENT_DO_CALIBRATE } " ] ] ; then
2017-02-12 03:31:01 +00:00
# Requires a device to be specified.
2017-02-12 02:50:18 +00:00
if [ [ -n " ${ OGN_DEVICE_ID } " ] ] ; then
CalibrateTuner ${ OGN_DEVICE_ID }
else
echo -en "\e[33m The specified device is either invalid or does not exist...\e[97m"
false
fi
2017-02-12 02:26:54 +00:00
CheckReturnCode
fi
2017-02-12 03:31:01 +00:00
# Set Frequency Correction.
2017-01-09 15:01:16 +00:00
if [ [ -z " ${ OGN_FREQ_CORR } " ] ] ; then
2017-02-12 03:31:01 +00:00
# Using the value derived from calibration, if available.
2017-02-12 02:32:08 +00:00
if [ [ -n " ${ CALIBRATION_ERROR } " ] ] ; then
OGN_FREQ_CORR = " ${ CALIBRATION_ERROR } "
2017-01-02 05:04:27 +00:00
else
2017-02-12 02:32:08 +00:00
OGN_FREQ_CORR = "0"
2017-01-02 05:04:27 +00:00
fi
2016-12-30 17:05:52 +00:00
fi
2017-02-12 03:31:01 +00:00
# Set GSM Reference signal frequency.
2017-01-09 15:01:16 +00:00
if [ [ -z " ${ OGN_GSM_FREQ } " ] ] ; then
2017-02-12 03:31:01 +00:00
# Using the value derived from calibration, if available.
2017-02-12 02:32:08 +00:00
if [ [ -n " ${ CALIBRATION_GSM_FREQ } " ] ] ; then
OGN_GSM_FREQ = " ${ CALIBRATION_GSM_FREQ } "
2017-01-02 05:04:27 +00:00
else
OGN_GSM_FREQ = "958"
fi
2016-12-30 17:05:52 +00:00
fi
2017-02-12 03:11:50 +00:00
### CREATE THE CONFIGURATION FILE
2016-12-22 10:51:55 +00:00
# Test if config file exists, if not create it.
2017-02-12 12:42:35 +00:00
COMPONENT_CONFIG_FILE_NAME = " ${ COMPONENT_RECEIVER_NAME } .conf "
2017-02-07 20:19:52 +00:00
if [ [ -s " ${ COMPONENT_PROJECT_DIRECTORY } / ${ COMPONENT_CONFIG_FILE_NAME } " ] ] ; then
echo -en " \e[33m Using existing ${ COMPONENT_NAME } config file at \"\e[37m ${ COMPONENT_CONFIG_FILE_NAME } \e[33m\"...\e[97m "
2016-12-29 17:49:18 +00:00
else
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Generating new ${ COMPONENT_NAME } config file as \"\e[37m ${ COMPONENT_CONFIG_FILE_NAME } \e[33m\"...\e[97m "
sudo tee ${ COMPONENT_PROJECT_DIRECTORY } /${ COMPONENT_CONFIG_FILE_NAME } > /dev/null 2>& 1 <<EOF
2017-02-05 21:38:26 +00:00
#########################################################
# #
# CONFIGURATION FILE BASED ON #
# #
# http://wiki.glidernet.org/wiki:receiver-config-file #
# #
#########################################################
2016-12-19 17:50:20 +00:00
#
RF:
2016-12-29 17:49:18 +00:00
{
2017-01-01 20:35:51 +00:00
FreqCorr = ${ OGN_FREQ_CORR } ; # [ppm] Some R820T sticks have 40-80ppm correction factors, measure it with gsm_scan.
Device = ${ OGN_DEVICE_ID } ; # Device index of the USB RTL-SDR device to be selected.
# DeviceSerial = ${OGN_DEVICE_SERIAL}; # char[12] Serial number of the USB RTL-SDR device to be selected.
2016-12-19 17:50:20 +00:00
GSM:
2016-12-29 17:49:18 +00:00
{
2017-01-02 13:26:47 +00:00
CenterFreq = ${ OGN_GSM_FREQ } ; # [MHz] Fnd the best GSM frequency with gsm_scan.
2017-01-01 20:35:51 +00:00
Gain = ${ OGN_GSM_GAIN } ; # [0.1 dB] RF input gain for frequency calibration (beware that GSM signals are very strong).
2016-12-19 17:50:20 +00:00
} ;
} ;
#
Position:
2016-12-29 17:49:18 +00:00
{
2017-02-12 01:44:40 +00:00
Latitude = ${ COMPONENT_LATITUDE } ; # [deg] Antenna coordinates in decimal degrees.
Longitude = ${ COMPONENT_LONGITUDE } ; # [deg] Antenna coordinates in decimal degrees.
Altitude = ${ COMPONENT_ALTITUDE } ; # [m] Altitude above sea leavel.
2017-01-01 20:35:51 +00:00
GeoidSepar = ${ OGN_GEOID } ; # [m] Geoid separation: FLARM transmits GPS altitude, APRS uses means Sea level altitude.
2016-12-19 17:50:20 +00:00
} ;
#
APRS:
{
2017-02-12 12:42:35 +00:00
Call = " ${ COMPONENT_RECEIVER_NAME } " ; # char[9] APRS callsign (max. 9 characters).
2016-12-19 17:50:20 +00:00
} ;
#
DDB:
{
2017-01-01 20:35:51 +00:00
UseAsWhitelist = ${ OGN_WHITELIST } ; # [0|1] Setting to 1 enforces strict opt in.
2016-12-19 17:50:20 +00:00
} ;
#
EOF
2016-12-22 10:51:55 +00:00
fi
2016-12-29 17:36:39 +00:00
2016-12-28 21:39:55 +00:00
# Update ownership of new config file.
2017-02-07 20:19:52 +00:00
ACTION = $( chown -v pi:pi ${ COMPONENT_PROJECT_DIRECTORY } /${ COMPONENT_CONFIG_FILE_NAME } 2>& 1)
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-04-01 16:55:46 +00:00
2016-12-19 17:50:20 +00:00
### INSTALL AS A SERVICE
2017-01-02 21:02:00 +00:00
# Install service script.
2017-02-07 20:19:52 +00:00
if [ [ -f " ${ COMPONENT_SERVICE_SCRIPT_NAME } " ] ] ; then
2016-12-30 18:24:19 +00:00
# Check for local copy of service script.
2017-02-07 20:19:52 +00:00
if [ [ ` grep -c " conf= ${ COMPONENT_SERVICE_CONFIG_PATH } " ${ COMPONENT_SERVICE_SCRIPT_NAME } ` -eq 1 ] ] ; then
echo -en " \e[33m Installing service script at \"\e[37m ${ COMPONENT_SERVICE_SCRIPT_PATH } \e[33m\"...\e[97m "
2017-02-12 12:43:00 +00:00
ACTION = $( sudo cp -v ${ COMPONENT_SERVICE_SCRIPT_NAME } ${ COMPONENT_SERVICE_SCRIPT_PATH } 2>& 1)
2017-02-07 20:19:52 +00:00
ACTION = $( sudo chmod -v +x ${ COMPONENT_SERVICE_SCRIPT_PATH } 2>& 1)
2016-12-30 18:24:19 +00:00
else
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Invalid service script \"\e[37m ${ COMPONENT_SERVICE_SCRIPT_NAME } \e[33m\"...\e[97m "
2016-12-30 18:24:19 +00:00
false
fi
2017-02-07 20:19:52 +00:00
elif [ [ -n " ${ COMPONENT_SERVICE_SCRIPT_URL } " ] ] ; then
2016-12-30 18:24:19 +00:00
# Otherwise attempt to download service script.
2017-02-07 20:19:52 +00:00
if [ [ ` echo ${ COMPONENT_SERVICE_SCRIPT_URL } | grep -c "^http" ` -gt 0 ] ] ; then
echo -en " \e[33m Downloading service script to \"\e[37m ${ COMPONENT_SERVICE_SCRIPT_PATH } \e[33m\"...\e[97m "
ACTION = $( sudo curl -L ${ COMPONENT_SERVICE_SCRIPT_URL } -o ${ COMPONENT_SERVICE_SCRIPT_PATH } 2>& 1)
ACTION = $( sudo chmod -v +x ${ COMPONENT_SERVICE_SCRIPT_PATH } 2>& 1)
2016-12-30 18:24:19 +00:00
else
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Invalid service script url \"\e[37m ${ COMPONENT_SERVICE_SCRIPT_URL } \e[33m\"...\e[97m "
2016-12-30 18:24:19 +00:00
false
fi
2016-12-30 17:26:05 +00:00
else
2016-12-30 18:24:19 +00:00
# Otherwise error if unable to use local or downloaded service script
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Unable to install service script at \"\e[37m ${ COMPONENT_SERVICE_SCRIPT_PATH } \e[33m\"...\e[97m "
2016-12-30 18:24:19 +00:00
false
2016-12-30 17:05:52 +00:00
fi
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-04-01 16:55:46 +00:00
2016-12-30 18:24:19 +00:00
# Generate and install service script configuration file.
2017-02-07 20:19:52 +00:00
if [ [ -n " ${ COMPONENT_SERVICE_CONFIG_PATH } " ] ] ; then
echo -en " \e[33m Creating service config file \"\e[37m ${ COMPONENT_SERVICE_CONFIG_PATH } \e[33m\"...\e[97m "
sudo tee ${ COMPONENT_SERVICE_CONFIG_PATH } > /dev/null 2>& 1 <<EOF
2016-04-01 16:55:46 +00:00
#shellbox configuration file
#Starts commands inside a "box" with a telnet-like server.
#Contact the shell with: telnet <hostname> <port>
#Syntax:
#port user directory command args
2017-02-07 20:19:52 +00:00
50000 pi ${ COMPONENT_PROJECT_DIRECTORY } ./ogn-rf ${ OGN_RECEIVER_NAME } .conf
50001 pi ${ COMPONENT_PROJECT_DIRECTORY } ./ogn-decode ${ OGN_RECEIVER_NAME } .conf
2016-04-01 16:55:46 +00:00
EOF
2017-02-07 20:19:52 +00:00
ACTION = $( chown -v pi:pi ${ COMPONENT_SERVICE_CONFIG_PATH } 2>& 1)
2016-12-30 20:03:50 +00:00
else
2017-02-07 20:19:52 +00:00
echo -en " \e[33m Unable to create service config file \"\e[37m ${ COMPONENT_SERVICE_CONFIG_PATH } \e[33m\"...\e[97m "
2016-12-30 17:26:05 +00:00
false
2016-12-30 17:05:52 +00:00
fi
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-04-01 16:55:46 +00:00
2017-02-07 20:19:52 +00:00
# Potentially obsolete tuner detection code.
2017-02-11 02:25:07 +00:00
if [ [ " ${ RECEIVER_TUNERS_AVAILABLE } " -lt 2 ] ] ; then
2016-12-30 20:44:53 +00:00
# Less than 2 tuners present so we must stop other services before starting this decoder.
2017-01-02 21:47:26 +00:00
echo -en "\e[33m Found less than 2 tuners so other decoders will be disabled...\e[97m"
2017-01-11 21:59:29 +00:00
SERVICES_DISABLE = "dump1090-mutability"
for SERVICE in ${ SERVICES_DISABLE } ; do
2016-12-30 20:44:53 +00:00
if [ [ ` service ${ SERVICE } status | grep -c "Active: active" ` -gt 0 ] ] ; then
2017-01-03 03:02:16 +00:00
ACTION = $( sudo update-rc.d ${ SERVICE } disable 2>& 1)
2016-12-30 20:44:53 +00:00
fi
done
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-12-22 11:18:37 +00:00
fi
2017-02-07 20:19:52 +00:00
# Configure component as a service.
echo -en " \e[33m Configuring ${ COMPONENT_NAME } as a service...\e[97m "
ACTION = $( sudo update-rc.d ${ COMPONENT_SERVICE_NAME } defaults 2>& 1)
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-04-01 16:55:46 +00:00
2017-02-11 02:25:07 +00:00
# (re)start the component service.
COMPONENT_SERVICE_STATUS = $( sudo systemctl status ${ COMPONENT_SERVICE_NAME } 2>& 1)
if [ [ ` echo ${ COMPONENT_SERVICE_STATUS } | egrep "Active:" | egrep -c ": active" ` -gt 0 ] ] ; then
echo -e " \e[33m Restarting the ${ COMPONENT_NAME } service... "
ACTION = $( sudo systemctl reload-or-restart ${ COMPONENT_SERVICE_NAME } 2>& 1)
else
echo -e " \e[33m Starting the ${ COMPONENT_NAME } service... "
ACTION = $( sudo systemctl start ${ COMPONENT_SERVICE_NAME } 2>& 1)
fi
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-12-19 17:50:20 +00:00
2017-02-05 21:38:26 +00:00
### SETUP COMPLETE
2016-12-19 17:50:20 +00:00
2016-12-22 10:51:55 +00:00
# Return to the project root directory.
2017-01-02 20:05:51 +00:00
echo -en " \e[94m Returning to ${ RECEIVER_PROJECT_TITLE } root directory...\e[97m "
2017-02-12 01:44:40 +00:00
cd ${ RECEIVER_ROOT_DIRECTORY } 2>& 1
2017-01-03 04:13:26 +00:00
ACTION = ${ PWD }
2016-12-28 21:39:55 +00:00
CheckReturnCode
2016-12-19 17:50:20 +00:00
2017-01-02 20:19:23 +00:00
echo -e "\e[93m ------------------------------------------------------------------------------\n"
2017-02-07 20:19:52 +00:00
echo -e " \e[92m ${ COMPONENT_NAME } setup is complete.\e[39m "
2016-12-19 17:50:20 +00:00
echo -e ""
2017-01-09 14:51:50 +00:00
if [ [ " ${ RECEIVER_AUTOMATED_INSTALL } " = "false" ] ] ; then
2017-01-02 20:19:23 +00:00
read -p "Press enter to continue..." CONTINUE
fi
2016-12-19 17:50:20 +00:00
exit 0