osmo-gui/install.sh

282 lines
7.6 KiB
Bash

#!/bin/bash
arguments=$@
unknown_os ()
{
echo "Unfortunately, your operating system distribution and version are not supported by this script."
echo
echo "You can override the OS detection by setting os= and dist= prior to running this script."
echo
echo "For example, to force Ubuntu Trusty: os=ubuntu dist=trusty ./script.sh"
echo
exit 1
}
detect_os ()
{
if [[ ( -z "${os}" ) && ( -z "${dist}" ) ]]; then
# some systems dont have lsb-release yet have the lsb_release binary and
# vice-versa
if [ -e /etc/lsb-release ]; then
. /etc/lsb-release
if [ "${ID}" = "raspbian" ]; then
os=${ID}
dist=`cut --delimiter='.' -f1 /etc/debian_version`
else
os=${DISTRIB_ID}
dist=${DISTRIB_CODENAME}
if [ -z "$dist" ]; then
dist=${DISTRIB_RELEASE}
fi
fi
elif [ `which lsb_release 2>/dev/null` ]; then
dist=`lsb_release -c | cut -f2`
os=`lsb_release -i | cut -f2 | awk '{ print tolower($1) }'`
elif [ -e /etc/debian_version ]; then
# some Debians have jessie/sid in their /etc/debian_version
# while others have '6.0.7'
os=`cat /etc/issue | head -1 | awk '{ print tolower($1) }'`
if grep -q '/' /etc/debian_version; then
dist=`cut --delimiter='/' -f1 /etc/debian_version`
else
dist=`cut --delimiter='.' -f1 /etc/debian_version`
fi
else
unknown_os
fi
fi
if [ -z "$dist" ]; then
unknown_os
fi
# remove whitespace from OS and dist name
os="${os// /}"
dist="${dist// /}"
echo "Detected operating system as $os/$dist."
}
detect_version_id () {
# detect version_id and round down float to integer
if [ -f /etc/os-release ]; then
. /etc/os-release
version_id=${VERSION_ID%%.*}
elif [ -f /usr/lib/os-release ]; then
. /usr/lib/os-release
version_id=${VERSION_ID%%.*}
else
version_id="1"
fi
echo "Detected version id as $version_id"
}
set_working_dir ()
{
working_dir="$(cd -P "$(dirname -- "${BASH_SOURCE}")" >/dev/null 2>&1 && pwd)"
echo "Working dir is $working_dir"
echo
}
get_sudo_password ()
{
# Ask for the administrator password upfront
sudo -v
# Keep-alive: update existing sudo time stamp until the script has finished
while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
}
setup_dependencies ()
{
echo
echo "Installing dependencies..."
if [ "${os,,}" = "arch" ]; then
sudo pacman -S --noconfirm --needed build-essential libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev python3-venv libgirepository1.0-dev
elif [ "${os,,}" = "centos" ] || [ "${os,,}" = "rhel" ]; then
sudo yum -y -q install epel-release
sudo yum -y -q install build-essential libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev python3-venv libgirepository1.0-dev
elif [ "${os,,}" = "debian" ] || [ "${os,,}" = "ubuntu" ]; then
sudo apt-get -y install build-essential libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev python3-venv libgirepository1.0-dev
else
echo "Dependencies cannot be installed on ${os}"
exit 1
fi
echo
}
setup_python_env () {
echo
if [ -d "${working_dir}/.env" ]; then
echo "Virtual environment already exists. Deleting..."
rm -rf "${working_dir}/.env"
fi
echo "Creating Python virtual env in ${working_dir}/.env"
/usr/bin/python3 -m venv $working_dir/.env
source $working_dir/.env/bin/activate
python3 -m pip install -r $working_dir/requirements.txt
echo "Python virtual env created."
}
setup_dependencies_no_gui () {
echo
echo "Installing dependencies..."
if [ "${os,,}" = "arch" ]; then
sudo pacman -S --noconfirm --needed python3-venv
elif [ "${os,,}" = "centos" ] || [ "${os,,}" = "rhel" ]; then
sudo yum -y -q install epel-release
sudo yum -y -q install python3-venv
elif [ "${os,,}" = "debian" ] || [ "${os,,}" = "ubuntu" ]; then
sudo apt-get -y -qq install python3-venv
else
echo "Dependencies cannot be installed on ${os}"
exit 1
fi
echo
}
setup_python_env_no_gui () {
echo
if [ -d "${working_dir}/.env" ]; then
echo "Virtual environment already exists. Deleting..."
rm -rf "${working_dir}/.env"
fi
echo "Creating Python virtual env in ${working_dir}/.env"
/usr/bin/python3 -m venv $working_dir/.env
source $working_dir/.env/bin/activate
python3 -m pip install django==4.1
echo "Python virtual env created."
}
create_desktop_file ()
{
echo
if [ -f "/usr/share/applications/osmo-gui.desktop" ]; then
echo "Desktop file already exists. Deleting..."
sudo rm -f "/usr/share/applications/osmo-gui.desktop"
fi
echo "Creating desktop file..."
sudo cat > $working_dir/osmo-gui.desktop << EOF
[Desktop Entry]
Version=1.0
Name=Osmocom
Comment=Open source mobile communications
Exec=${working_dir}/osmo-gui
Icon=${working_dir}/static/images/osmocom_icon.png
Type=Application
Categories=HamRadio;Science;
Keywords=SDR;Radio;HAM;RF;
MimeType=application/gnuradio-grc;
Terminal=false
EOF
chmod +x $working_dir/osmo-gui.desktop
sudo cp $working_dir/osmo-gui.desktop /usr/share/applications/osmo-gui.desktop
rm $working_dir/osmo-gui.desktop
echo "Desktop file created."
}
create_program_file ()
{
echo
echo "Creating program..."
if [ -f "${working_dir}/osmo-gui" ]; then
rm "${working_dir}/osmo-gui"
fi
cat > ${working_dir}/osmo-gui << EOF
#!${working_dir}/.env/bin/python3
import webview
import subprocess
import time
django = subprocess.Popen(
["${working_dir}/.env/bin/python3", "${working_dir}/manage.py", "runserver", "127.0.0.1:8900"], )
time.sleep(1)
webview.create_window(
"Osmocom",
"http://localhost:8900/hlr/",
confirm_close=True,
width=1366,
height=768,
min_size=(800, 600),
)
webview.start()
django.terminate()
if __name__ == "__main__":
pass
EOF
chmod +x ${working_dir}/osmo-gui
echo "osmo-gui created."
}
create_shortcut ()
{
echo "Creating shortcut..."
if [ -f "/usr/bin/osmo-gui" ]; then
echo "Shortcut already exists. Deleting..."
sudo rm -rf "/usr/bin/osmo-gui"
echo "Creating new shortcut..."
fi
sudo ln -s ${working_dir}/osmo-gui /usr/bin/osmo-gui
echo "Shortcut created."
}
main ()
{
detect_os
detect_version_id
set_working_dir
echo "Welcome to the Osmocom GUI installer!"
echo "This script will install the Osmocom GUI on your system."
echo "Note that this program requires OsmoHLR version 1.5.0"
echo "If you have not installed OsmoHLR yet,
please do so now and then run this script again."
echo "Press enter to continue or ctrl+c to exit."
read -r
get_sudo_password
if [ $arguments = "--no-gui" ] > /dev/null 2>&1; then
echo "Installing without GUI..."
setup_dependencies_no_gui
echo "-----------------------------------------------------"
setup_python_env_no_gui
echo "-----------------------------------------------------"
echo
echo "Ready to go!"
echo
echo "To start the program, activate the virtual environment by running:"
echo
echo "source $working_dir/.env/bin/activate"
echo
echo "Then run the program by running:"
echo
echo "python3 ${working_dir}/manage.py runserver"
echo
echo "-----------------------------------------------------"
else
setup_dependencies
echo "-----------------------------------------------------"
setup_python_env
echo "-----------------------------------------------------"
create_program_file
create_desktop_file
create_shortcut
echo "-----------------------------------------------------"
echo
echo "Ready to go!"
echo
echo "To start the program, run 'osmo-gui'"
echo
echo "-----------------------------------------------------"
fi
}
main