#!/bin/bash ##################################################################################### # ADS-B RECEIVER # ##################################################################################### # # # This script is not meant to be executed directly. # # Instead execute install.sh to begin the installation process. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Copyright (c) 2016-2017, Joseph A. Prochazka & Romeo Golf # # # # 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. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ### VARIABLES RECEIVER_ROOT_DIRECTORY="${PWD}" RECEIVER_BASH_DIRECTORY="${RECEIVER_ROOT_DIRECTORY}/bash" RECEIVER_BUILD_DIRECTORY="${RECEIVER_ROOT_DIRECTORY}/build" # Component specific variables. # Component service script variables. ### INCLUDE EXTERNAL SCRIPTS source ${RECEIVER_BASH_DIRECTORY}/variables.sh source ${RECEIVER_BASH_DIRECTORY}/functions.sh # To be moved to functions.sh... ################################################################################# # Blacklist DVB-T drivers for RTL-SDR devices. function BlacklistModules () { RECEIVER_MODULE_BLACKLIST="/etc/modprobe.d/rtlsdr-blacklist.conf" if [[ ! -f "${RECEIVER_MODULE_BLACKLIST}" ]] || [[ `cat ${RECEIVER_MODULE_BLACKLIST} | wc -l` -lt 9 ]] ; then echo -en "\e[33m Installing blacklist to prevent unwanted kernel modules from being loaded...\e[97m" sudo tee ${RECEIVER_MODULE_BLACKLIST} > /dev/null </dev/null | grep -c "ok installed") -eq 1 ]] ; then 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 DUMP1090_IS_INSTALLED="true" else DUMP1090_IS_INSTALLED="false" fi # Check if the dump978 binaries exist. echo -e "\e[94m Checking if the dump978 binaries exist on this device...\e[97m" 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 DUMP978_IS_INSTALLED="true" else DUMP978_IS_INSTALLED="false" fi # If either dump1090 or dump978 is installed we must assign RTL-SDR dongles for each of these decoders. if [[ "${DUMP1090_IS_INSTALLED}" = "true" ]] || [[ "${DUMP978_IS_INSTALLED}" = "true" ]] ; then # Check if Dump1090 is installed. if [[ "${DUMP1090_IS_INSTALLED}" = "true" ]] ; then # The dump1090-mutability package appear to be installed. if [[ "${RECEIVER_AUTOMATED_INSTALL}" = "false" ]] ; then # Ask the user which USB device is to be used for dump1090. 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) while [[ -z "${DUMP1090_DEVICE_ID}" ]] ; do 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) done else ### GET DONGLE ID FROM THE INSTALLATION CONFIGURATION FILE... true fi fi # Check if Dump978 is installed. if [[ "${DUMP978_IS_INSTALLED}" = "true" ]] ; then # The dump978 binaries appear to exist on this device. if [[ "${RECEIVER_AUTOMATED_INSTALL}" = "false" ]] ; then # Ask the user which USB device is to be use for dump978. 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) while [[ -z "${DUMP978_DEVICE_ID}" ]] ; do 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) done else ### GET DONGLE ID FROM THE INSTALLATION CONFIGURATION FILE... true fi fi # if [[ "${RECEIVER_AUTOMATED_INSTALL}" = "false" ]] ; then # Ask the user which USB device is to be use for RTL-SDR OGN. 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) while [[ -z "${DUMP978_DEVICE_ID}" ]] ; do 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) done else ### GET DONGLE ID FROM THE INSTALLATION CONFIGURATION FILE... true fi # Assign the specified RTL-SDR dongle to dump1090. if [[ "${DUMP1090_IS_INSTALLED}" = "true" ]] && [[ -n "${DUMP1090_DEVICE_ID}" ]] ; then echo -e "\e[94m Assigning RTL-SDR dongle \"${DUMP1090_DEVICE_ID}\" to dump1090-mutability...\e[97m" ChangeConfig "DEVICE" ${DUMP1090_DEVICE_ID} "/etc/default/dump1090-mutability" echo -e "\e[94m Reloading dump1090-mutability...\e[97m" echo -e "" sudo /etc/init.d/dump1090-mutability force-reload echo -e "" fi # Assign the specified RTL-SDR dongle to dump978 if [[ "${DUMP978_IS_INSTALLED}" = "true" ]] && [[ -n "${DUMP978_DEVICE_ID}" ]] ; then echo -e "\e[94m Assigning RTL-SDR dongle \"${DUMP978_DEVICE_ID}\" to dump978...\e[97m" ### 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 ### ASSIGN RTL-SDR DONGLE FOR RTL-SDR OGN... ### DOWNLOAD AND SET UP THE BINARIES # Create build directory if not already present. if [[ ! -d "${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn" ]] ; then echo -e "\e[94m Creating the directory (${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn)...\e[97m" mkdir -vp ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn fi # Enter the build directory. if [[ ! "${PWD}" = "${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn" ]] ; then echo -e "\e[94m Entering the directory (${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn)...\e[97m" cd ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn 2>&1 fi # Use function to detect cpu architecture. if [[ -z "${CPU_ARCHITECTURE}" ]] ; then Check_CPU echo -e "" fi # Identify the correct binaries to download. case ${CPU_ARCHITECTURE} in "armv6l") # Raspberry Pi 1. COMPONENT_BINARY_URL="http://download.glidernet.org/rpi-gpu/rtlsdr-ogn-bin-RPI-GPU-latest.tgz" echo -e "\e[94m Downloading the latest RTL-SDR OGN RPI-GPU binaries...\e[97m" echo -e "" wget "${COMPONENT_BINARY_URL}" -O "${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn-bin-RPI-GPU-latest.tgz" echo -e "" echo -e "\e[94m Extracting the latest RTL-SDR OGN RPI-GPU binaries from the archive...\e[97m" echo -e "" tar xvzf rtlsdr-ogn-bin-RPI-GPU-latest.tgz -C ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn ;; "armv7l") # Raspberry Pi 2 onwards. COMPONENT_BINARY_URL="http://download.glidernet.org/arm/rtlsdr-ogn-bin-ARM-latest.tgz" echo -e "\e[94m Downloading the latest RTL-SDR OGN ARM binaries...\e[97m" echo -e "" wget "${COMPONENT_BINARY_URL}" -O "${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn-bin-ARM-latest.tgz" echo -e "" echo -e "\e[94m Extracting the latest RTL-SDR OGN ARM binaries from the archive...\e[97m" echo -e "" tar xvzf rtlsdr-ogn-bin-ARM-latest.tgz -C ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn ;; "x86_64") # 64 Bit. COMPONENT_BINARY_URL="http://download.glidernet.org/x64/rtlsdr-ogn-bin-x64-latest.tgz" echo -e "\e[94m Downloading the latest RTL-SDR OGN x64 binaries...\e[97m" echo -e "" wget "${COMPONENT_BINARY_URL}" -O "${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn-bin-x64-latest.tgz" echo -e "" echo -e "\e[94m Extracting the latest RTL-SDR OGN x64 binaries from the archive...\e[97m" echo -e "" tar xvzf rtlsdr-ogn-bin-x64-latest.tgz -C ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn ;; *) # 32 Bit (default install if no others matched). COMPONENT_BINARY_URL="http://download.glidernet.org/x86/rtlsdr-ogn-bin-x86-latest.tgz" echo -e "\e[94m Downloading the latest RTL-SDR OGN x86 binaries...\e[97m" echo -e "" wget "${COMPONENT_BINARY_URL}" -O "${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn-bin-x86-latest.tgz" echo -e "" echo -e "\e[94m Extracting the latest RTL-SDR OGN x86 binaries from the archive...\e[97m" echo -e "" tar xvzf rtlsdr-ogn-bin-x86-latest.tgz -C ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn ;; esac # Change to component work directory for post-build actions. echo -e "" echo -e "\e[94m Entering the directory containing the RTL-SDR binaries...\e[97m" cd ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn 2>&1 # Create named pipe if required. if [[ ! -p "ogn-rf.fifo" ]] ; then echo -e "\e[94m Creating named pipe...\e[97m" sudo mkfifo ogn-rf.fifo fi # Set file permissions. echo -e "\e[94m Setting proper file permissions...\e[97m" sudo chown root gsm_scan sudo chmod a+s gsm_scan sudo chown root ogn-rf sudo chmod a+s ogn-rf sudo chown root rtlsdr-ogn sudo chmod a+s rtlsdr-ogn # And check that the file permissions have been applied. # Creat GPU device if required. if [[ ! -c "gpu_dev" ]] ; then # The mknod major_version number varies with kernel version. echo -e "\e[94m Getting the version of the kernel currently running...\e[97m" KERNEL=`uname -r` KERNEL_VERSION=`echo ${KERNEL} | cut -d \. -f 1`.`echo ${KERNEL} | cut -d \. -f 2` # Check if the currently running kernel is version 4.1 or higher. if [[ "${KERNEL_VERSION}" < 4.1 ]] ; then # Kernel is older than version 4.1. echo -e "\e[94m Executing mknod for older kernels...\e[97m" sudo mknod gpu_dev c 100 0 else # Kernel is version 4.1 or newer. echo -e "\e[94m Executing mknod for newer kernels...\e[97m" sudo mknod gpu_dev c 249 0 fi fi ## GATHER INFORMATION FROM USER # Latitude. # Longitude. # Altitude. # Check for component specific variables, otherwise populate with dummy values to ensure valid config generation. # Ask if user would like to calibrate the tuner. ### CREATE THE CONFIGURATION FILE # Update existing or create new config file. ######################################################### # # # CREATE THE CONFIGURATION FILE # # # # http://wiki.glidernet.org/wiki:receiver-config-file # # # ######################################################### # Update ownership of new config file. ### INSTALL AS A SERVICE # Install service script. echo -e "\e[94m Downloading and setting permissions on the init script...\e[97m" echo -e "" sudo wget http://download.glidernet.org/common/service/rtlsdr-ogn -O /etc/init.d/rtlsdr-ogn sudo chmod +x /etc/init.d/rtlsdr-ogn # Generate and install service script configuration file. echo -e "\e[94m Creating the file /etc/rtlsdr-ogn.conf...\e[97m" echo -e "" sudo tee /etc/rtlsdr-ogn.conf > /dev/null < #Syntax: #port user directory command args 50000 pi ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn ./ogn-rf rtlsdr-ogn.conf 50001 pi ${RECEIVER_BUILD_DIRECTORY}/rtlsdr-ogn/rtlsdr-ogn ./ogn-decode rtlsdr-ogn.conf EOF # Configure component as a service. echo -e "\e[94m Setting up rtlsdr-ogn as a service...\e[97m" echo -e "" sudo update-rc.d rtlsdr-ogn defaults # (re)start the component service. echo -e "\e[94m Starting the rtlsdr-ogn service...\e[97m" echo -e "" sudo service rtlsdr-ogn start ### SETUP COMPLETE # Return to the project root directory. echo -e "\e[94m Entering the ADS-B Receiver Project root directory...\e[97m" cd ${RECEIVER_ROOT_DIRECTORY} 2>&1 echo -e "\e[93m ------------------------------------------------------------------------------\n" echo -e "\e[92m RTL-SDR OGN setup is complete.\e[39m" echo -e "" if [[ "${RECEIVER_AUTOMATED_INSTALL}" = "false" ]] ; then read -p "Press enter to continue..." CONTINUE fi exit 0