You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
SkywarnPlus/swp-install

335 lines
12 KiB

#!/bin/bash
# swp-install by Mason Nelson
# ===============================================================================
# Script to install SkywarnPlus. This script will determine the system type (ASL1/2, ASL3, or HamVoIP),
# install the required dependencies, download the latest version of SkywarnPlus from GitHub,
# configure the necessary permissions, and set up a crontab entry to run SkywarnPlus at a specified interval.
# This script also checks if the SkywarnPlus directory already exists and asks for user confirmation to remove it before continuing.
# Please note that this script should be run as root.
# This file is part of SkywarnPlus.
# SkywarnPlus is free software: you can redistribute it and/or modify it under the terms of
# the GNU General Public License as published by the Free Software Foundation, either version 3
# of the License, or (at your option) any later version. SkywarnPlus is distributed in the hope
# that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with SkywarnPlus. If not, see <https://www.gnu.org/licenses/>.
clear
print_divider() {
echo "========================================"
}
print_notice() {
print_divider
echo "This script is designed to automate the installation of SkywarnPlus."
echo "Author: Mason Nelson"
echo
echo "NOTE: This script is an installer only and will NOT automate configuration."
echo "Please edit the config.yaml file manually after installation."
print_divider
read -r -p "Would you like to continue? (Y/n): " CONTINUE
CONTINUE=${CONTINUE:-y}
if [[ "$CONTINUE" != [Yy] ]]; then
print_divider
echo "Installation aborted. Exiting."
print_divider
exit 1
fi
}
check_root() {
if [ "$EUID" -ne 0 ]; then
print_divider
echo "This script must be run as root. Exiting."
print_divider
exit 1
fi
}
determine_system_type() {
echo "Determining system type..."
if [ -f /etc/debian_version ]; then
. /etc/os-release
OS=$ID
VER=$VERSION_ID
ASTERISK_VERSION=$(asterisk -V)
if [[ "$ASTERISK_VERSION" =~ "Asterisk "([2-9][0-9]|[1-9][0-9]{2,}) ]]; then
SYSTEM_TYPE="ASL3"
else
SYSTEM_TYPE="ASL1/2"
fi
elif [ -f /etc/arch-release ]; then
OS=arch
VER=$(uname -r)
SYSTEM_TYPE="HamVoIP"
else
print_divider
echo "Unsupported OS. This script supports only Debian and Arch."
print_divider
exit 1
fi
}
confirm_system_type() {
print_divider
echo "Detected system type: $SYSTEM_TYPE."
print_divider
read -r -p "Is this correct? (Y/n): " CONFIRMATION
CONFIRMATION=${CONFIRMATION:-y}
if [[ "$CONFIRMATION" != [Yy] ]]; then
print_divider
echo "Please enter the correct system type:"
echo "1 = ASL1/2"
echo "3 = ASL3"
echo "5 = HamVoIP"
print_divider
read -r -p "Enter the system type number: " SYSTEM_TYPE_INPUT
SYSTEM_TYPE_INPUT=${SYSTEM_TYPE_INPUT:-3}
case $SYSTEM_TYPE_INPUT in
1) SYSTEM_TYPE="ASL1/2" ;;
3) SYSTEM_TYPE="ASL3" ;;
5) SYSTEM_TYPE="HamVoIP" ;;
*)
print_divider
echo "Invalid input. Exiting."
print_divider
exit 1
;;
esac
fi
}
install_dependencies() {
print_divider
echo "Installing dependencies..."
if [ "$OS" = "debian" ]; then
apt update
if [ "$SYSTEM_TYPE" = "ASL1/2" ]; then
apt install -y unzip python3 python3-pip ffmpeg
pip3 install ruamel.yaml requests python-dateutil pydub
else
apt install -y unzip python3 python3-pip ffmpeg python3-ruamel.yaml python3-requests python3-dateutil python3-pydub
fi
elif [ "$OS" = "arch" ]; then
pacman -Syu --noconfirm
pacman -S --noconfirm --needed ffmpeg
if ! command -v pip &> /dev/null; then
wget -q https://bootstrap.pypa.io/pip/3.5/get-pip.py
python get-pip.py
fi
pip install requests python-dateutil pydub ruamel.yaml==0.15.100
else
print_divider
echo "Unsupported OS version. Exiting."
print_divider
exit 1
fi
}
check_existing() {
if [ -d "/usr/local/bin/SkywarnPlus" ]; then
print_divider
echo "Existing SkywarnPlus installation detected. This installer script was intended for new installations."
read -r -p "Would you like to run UpdateSWP.py instead?
[Y] Switch to UpdateSWP.py
[N] Continue with a fresh install after making a backup to SkywarnPlus_$(date +'%m-%d-%Y')/
(you can grab your old config.yaml file from the backup)
Please choose an option (Y/n): " INSTALL_OPTION
INSTALL_OPTION=${INSTALL_OPTION:-y}
if [[ "$INSTALL_OPTION" =~ ^[Yy]$ ]]; then
print_divider
echo "Switching to UpdateSWP.py..."
print_divider
/usr/local/bin/SkywarnPlus/UpdateSWP.py
exit 0
else
BACKUP_DIR="/usr/local/bin/SkywarnPlus_$(date +'%m-%d-%Y')"
print_divider
echo "Making a backup to $BACKUP_DIR..."
if [ -d "$BACKUP_DIR" ]; then
rm -rf "$BACKUP_DIR"
fi
mv /usr/local/bin/SkywarnPlus "$BACKUP_DIR"
print_divider
echo "Backup complete. Continuing with fresh installation..."
fi
fi
}
download_swp() {
print_divider
echo "Downloading SkywarnPlus..."
wget -q -P /usr/local/bin https://github.com/Mason10198/SkywarnPlus/releases/latest/download/SkywarnPlus.zip
unzip /usr/local/bin/SkywarnPlus.zip -d /usr/local/bin
rm /usr/local/bin/SkywarnPlus.zip
}
configure_perms() {
print_divider
echo "Configuring permissions..."
if [ "$SYSTEM_TYPE" = "ASL3" ]; then
chown -R asterisk:asterisk /usr/local/bin/SkywarnPlus/
chmod -R u+rw /usr/local/bin/SkywarnPlus/
fi
chmod +x /usr/local/bin/SkywarnPlus/*.py
}
remove_old_cron() {
print_divider
echo "Checking for \"old style\" crontab entry for SkywarnPlus.py..."
CRONTAB_OLD=$(crontab -l | grep 'SkywarnPlus.py')
if [ -n "$CRONTAB_OLD" ]; then
echo "Found \"old style\" crontab entry for SkywarnPlus.py:"
echo "$CRONTAB_OLD"
echo "This must be removed to avoid conflicts. A new crontab entry will reside in /etc/cron.d/SkywarnPlus."
echo "Removing \"old style\" crontab entry for SkywarnPlus.py..."
(crontab -l | grep -v 'SkywarnPlus.py') | crontab -
echo "\"Old style\" crontab entry for SkywarnPlus.py removed."
else
echo "No \"old style\" crontab entry found for SkywarnPlus.py."
fi
print_divider
echo "Checking for existing crontab entry for ast_var_update.sh..."
CRONTAB_AST=$(crontab -l | grep 'ast_var_update.sh')
if [ -n "$CRONTAB_AST" ]; then
echo "It looks like you have added a crontab entry for ast_var_update.sh - this functionality will now be handled by SkywarnPlus, and this crontab entry should be removed to avoid conflicts."
read -r -p "Would you like to remove the crontab entry now? (Y/n): " choice
choice=${choice:-y}
if [[ "$choice" =~ ^[Yy]$ ]]; then
echo "Removing old crontab entry for ast_var_update.sh..."
(crontab -l | grep -v 'ast_var_update.sh') | crontab -
echo "Old crontab entry for ast_var_update.sh removed."
else
echo "Crontab entry for ast_var_update.sh not removed."
fi
else
echo "No existing crontab entry found for ast_var_update.sh."
fi
}
setup_crontab() {
print_divider
CRON_FILE="/etc/cron.d/SkywarnPlus"
if [ -f "$CRON_FILE" ]; then
EXISTING_INTERVAL=$(grep -o '^\*/[0-9]*' "$CRON_FILE" | cut -d'/' -f2)
if [ -n "$EXISTING_INTERVAL" ]; then
echo "An existing crontab entry for SkywarnPlus was found with a $EXISTING_INTERVAL minute interval."
echo
echo "By default, the existing crontab entry will be kept."
echo
echo "To keep the existing $EXISTING_INTERVAL minute interval, press enter."
echo "To change the interval, enter a different number of minutes."
echo "To disable the crontab entry and require manual execution, enter '0'."
read -r -p "Crontab interval ($EXISTING_INTERVAL): " CRONTAB_INTERVAL
print_divider
CRONTAB_INTERVAL=${CRONTAB_INTERVAL:-$EXISTING_INTERVAL}
fi
else
echo "By default, a new crontab entry will be added to trigger SkywarnPlus (check for alerts) every 1 minute."
echo
echo "To keep the default 1 minute interval, press enter."
echo "If you would like to increase this interval, enter a different number of minutes."
echo "To disable the crontab entry and require manual execution, enter '0'."
read -r -p "Crontab interval (1): " CRONTAB_INTERVAL
CRONTAB_INTERVAL=${CRONTAB_INTERVAL:-1}
fi
if [ "$CRONTAB_INTERVAL" -eq 0 ]; then
if [ -f "$CRON_FILE" ]; then
rm "$CRON_FILE"
echo "Existing crontab entry removed. You will need to run SkywarnPlus manually."
else
echo "No crontab entry created. You will need to run SkywarnPlus manually."
fi
else
if [ "$SYSTEM_TYPE" = "ASL3" ]; then
CRONTAB_ENTRY="*/$CRONTAB_INTERVAL * * * * asterisk /usr/local/bin/SkywarnPlus/SkywarnPlus.py"
else
CRONTAB_ENTRY="*/$CRONTAB_INTERVAL * * * * root /usr/local/bin/SkywarnPlus/SkywarnPlus.py"
fi
if grep -Fxq "$CRONTAB_ENTRY" "$CRON_FILE" 2>/dev/null; then
echo "Crontab entry already exists. Skipping."
else
echo "$CRONTAB_ENTRY" > "$CRON_FILE" || {
print_divider
echo "Failed to create crontab entry. Exiting."
print_divider
exit 1
}
fi
fi
if [ "$SYSTEM_TYPE" = "ASL3" ]; then
print_divider
echo "This is an ASL3 system. In order for Supermon to display SkywarnPlus alerts on ASL3, a second crontab entry needs to be created to run ASL3_Supermon_Workaround.py as the root user."
if [ -d "/var/www/html/supermon/" ]; then
echo "It looks like you have Supermon installed, so it is recommended to create this crontab entry."
else
echo "It looks like you do not have Supermon installed, but you can still safely create this crontab entry in case you decide to use Supermon later."
fi
read -r -p "Would you like to create the crontab entry for ASL3_Supermon_Workaround.py now? (Y/n): " CREATE_SUPERMON_CRON
CREATE_SUPERMON_CRON=${CREATE_SUPERMON_CRON:-y}
if [[ "$CREATE_SUPERMON_CRON" =~ ^[Yy]$ ]]; then
SUPERMON_CRON_FILE="/etc/cron.d/ASL3_Supermon_Workaround"
SUPERMON_CRONTAB_ENTRY="* * * * * root /usr/local/bin/SkywarnPlus/ASL3_Supermon_Workaround.py"
if grep -Fxq "$SUPERMON_CRONTAB_ENTRY" "$SUPERMON_CRON_FILE" 2>/dev/null; then
echo "Supermon crontab entry already exists. Skipping."
else
echo "$SUPERMON_CRONTAB_ENTRY" > "$SUPERMON_CRON_FILE" || {
print_divider
echo "Failed to create Supermon crontab entry. Exiting."
print_divider
exit 1
}
echo "Supermon crontab entry created successfully."
fi
else
echo "Supermon crontab entry not created."
fi
fi
}
edit_config() {
print_divider
echo "Installation and configuration complete. Please edit the config.yaml file as per your needs."
print_divider
read -r -p "Would you like to edit the config.yaml file now? (Y/n): " EDIT_CONFIG
EDIT_CONFIG=${EDIT_CONFIG:-y}
if [[ "$EDIT_CONFIG" =~ ^[Yy]$ ]]; then
nano /usr/local/bin/SkywarnPlus/config.yaml
else
echo "You can edit the config.yaml file later using your preferred text editor."
fi
}
main() {
check_root
print_notice
determine_system_type
confirm_system_type
install_dependencies
check_existing
download_swp
configure_perms
remove_old_cron
setup_crontab
edit_config
}
main

Powered by TurnKey Linux.