commit e7fb83438c8daf9bbc99585bc789bf3f3863f74d Author: David Young Date: Tue Mar 24 08:56:25 2026 -0600 first commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..51a0dad --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +A collection of Ham Radio server utilities to transform CoreServer machines in to Ham Radio servers. + +``` +wget -qO- https://gitea.young.computer/david/hampackserver/raw/branch/main/install.sh | bash +``` diff --git a/compile.conf b/compile.conf new file mode 100644 index 0000000..12c12d0 --- /dev/null +++ b/compile.conf @@ -0,0 +1,40 @@ +[QtTermTCP] +version=0.1 +wget=http://www.cantab.net/users/john.wiseman/Downloads/QtTermSource.zip +install=$HOME/.local/bin/QtTermTCP +gui=true +steps=qmake, make, mv QtTermTCP $HOME/.local/bin/ + +[Kiwix-Desktop] +version=2.75.1 +git=https://github.com/kiwix/kiwix-desktop.git +install=/usr/local/bin/kiwix-desktop +steps=/usr/lib/qt6/bin/qmake, make, sudo make install + +[Kiwix-Tools] +version=3.8.2 +git=https://github.com/kiwix/kiwix-tools.git +install=/usr/local/bin/ +steps=meson setup build, ninja -C build, sudo ninja -C build install + +[Dump1090] +version=1.0.0 +git=https://github.com/antirez/dump1090.git +install=$HOME/.local/bin/dump1090 +steps=make, mv dump1090 $HOME/.local/bin/dump1090 + +[yaac] +version=1.0.0 +wget=https://www.ka2ddo.org/ka2ddo/YAAC.zip +install=$HOME/.local/bin/yaac/YAAC.jar +desktop=$HOME/.local/share/HamPack/desktop/yaac.desktop +gui=true +steps=rm -rf $HOME/.local/bin/yaac, mkdir -p $HOME/.local/bin/yaac, mv /tmp/hampack-build/yaac $HOME/.local/bin/yaac + +[potacat] +version=1.1.1 +git=https://github.com/Waffleslop/POTACAT.git +install=$HOME/.local/bin/POTACAT.AppImage +desktop=$HOME/.local/share/HamPack/desktop/potacat.desktop +gui=true +steps=bash $HOME/.local/share/HamPack/patch-potacat.sh, npm install, npm run dist:linux, mv dist/*.AppImage $HOME/.local/bin/POTACAT.AppImage \ No newline at end of file diff --git a/install-compiled.sh b/install-compiled.sh new file mode 100755 index 0000000..ffccaad --- /dev/null +++ b/install-compiled.sh @@ -0,0 +1,316 @@ +#!/bin/bash +# +# Purpose : Compile and install applications from compile.conf + +CONF_FILE="$HOME/.local/share/HamPack/compile.conf" +TMP_DIR="/tmp/hampack-build" +VERSION_FILE="$HOME/.local/state/HamPack/.installed_versions" + +# Get the installed version of an app +get_installed_version() { + local app="$1" + local gui="$2" + + # Skip --version check for GUI apps as it would launch them + if [ "$gui" != "true" ]; then + if command -v "$app" &> /dev/null; then + local ver + ver=$("$app" --version 2>&1 | grep -oP '\d+\.\d+[\.\d]*' | head -n1) + if [ -n "$ver" ]; then + echo "$ver" + return + fi + fi + fi + + # Fall back to version file + if [ -f "$VERSION_FILE" ]; then + local stored + stored=$(grep "^$app=" "$VERSION_FILE" | cut -d'=' -f2) + if [ -n "$stored" ]; then + echo "$stored" + return + fi + fi + + echo "unknown" +} + +# Save installed version to version file +save_installed_version() { + local app="$1" + local version="$2" + + touch "$VERSION_FILE" + + if grep -q "^$app=" "$VERSION_FILE"; then + sed -i "s/^$app=.*/$app=$version/" "$VERSION_FILE" + else + echo "$app=$version" >> "$VERSION_FILE" + fi +} + +# Ask the user whether to proceed when version can't be determined +ask_user_proceed() { + local app="$1" + local latest="$2" + + echo "Warning: could not determine installed version of $app." + echo "compile.conf specifies version $latest." + read -rp "Compile and install $app anyway? [y/N] " response + [[ "$response" =~ ^[yY] ]] +} + +# Check if an update is needed +needs_update() { + local app="$1" + local install_path="$2" + local latest="$3" + local gui="$4" + + # Not installed at all + if ! command -v "$app" &> /dev/null && [ ! -f "$install_path" ]; then + echo " $app is not installed." + return 0 + fi + + local installed + installed=$(get_installed_version "$app" "$gui") + + if [ "$installed" = "unknown" ]; then + if ask_user_proceed "$app" "$latest"; then + return 0 + else + return 1 + fi + fi + + echo " Installed version : $installed" + echo " Latest version : $latest" + + if [ "$installed" = "$latest" ]; then + echo " $app is up to date, skipping." + return 1 + fi + + echo " Update available for $app." + return 0 +} + +# Generate desktop file with absolute paths +generate_desktop() { + local desktop="$1" + local tmp_desktop="/tmp/$(basename "$desktop")" + + sed "s|\$HOME|$HOME|g" "$desktop" > "$tmp_desktop" + echo "$tmp_desktop" +} + +# Install desktop file if specified +install_desktop() { + local desktop="$1" + + if [ -z "$desktop" ]; then + return + fi + + if [ ! -f "$desktop" ]; then + echo " Warning: desktop file $desktop not found, skipping." + return + fi + + echo " Installing desktop file..." + mkdir -p "$HOME/.local/share/applications" + local resolved + resolved=$(generate_desktop "$desktop") + cp "$resolved" "$HOME/.local/share/applications/$(basename "$desktop")" + chmod +x "$HOME/.local/share/applications/$(basename "$desktop")" + rm -f "$resolved" + echo " Desktop file installed." +} + +# Fetch source via git or wget +fetch_source() { + local app="$1" + local git_url="$2" + local wget_url="$3" + local src_dir="$TMP_DIR/$app" + + rm -rf "$src_dir" + mkdir -p "$src_dir" + + if [ -n "$git_url" ]; then + echo " Cloning $git_url..." + git clone "$git_url" "$src_dir" + + elif [ -n "$wget_url" ]; then + echo " Downloading $wget_url..." + local filename="${wget_url##*/}" + local filepath="$TMP_DIR/$filename" + + wget -q "$wget_url" -O "$filepath" + + echo " Extracting $filename..." + case "$filename" in + *.zip) + unzip -q "$filepath" -d "$src_dir" + # If the zip extracted into a single subdirectory, flatten it + local contents + contents=$(ls -1 "$src_dir") + local count + count=$(echo "$contents" | wc -l) + if [ "$count" -eq 1 ] && [ -d "$src_dir/$contents" ]; then + echo " Descending into $contents..." + local inner="$src_dir/$contents" + mv "$inner"/* "$src_dir/" + rmdir "$inner" + fi + ;; + *.tar.gz|*.tgz) + tar -xzf "$filepath" -C "$src_dir" --strip-components=1 + ;; + *.tar.bz2) + tar -xjf "$filepath" -C "$src_dir" --strip-components=1 + ;; + *.tar.xz) + tar -xJf "$filepath" -C "$src_dir" --strip-components=1 + ;; + *) + echo " Error: unknown file type for $filename" + exit 1 + ;; + esac + + rm -f "$filepath" + else + echo " Error: no git or wget URL specified for $app" + exit 1 + fi +} + +# cd into source directory and run steps +run_steps() { + local app="$1" + local steps="$2" + local src_dir="$TMP_DIR/$app" + + if [ ! -d "$src_dir" ]; then + echo " Error: source directory $src_dir not found." + exit 1 + fi + + echo " Changing into $src_dir..." + cd "$src_dir" + + echo " Building $app..." + IFS=',' read -ra step_list <<< "$steps" + for step in "${step_list[@]}"; do + step=$(echo "$step" | xargs) + echo " Running: $step" + eval "$step" + done +} + +# Process a single app +process_app() { + local app="$1" + local git_url="$2" + local wget_url="$3" + local install_path="$4" + local steps="$5" + local version="$6" + local desktop="$7" + local gui="$8" + + echo "" + echo "=== $app ===" + + # Check if already installed + if command -v "$app" &> /dev/null || [ -f "$install_path" ]; then + if [ -z "$version" ]; then + echo " $app is already installed, skipping." + return + fi + fi + + if [ -z "$version" ]; then + echo " Warning: no version specified in compile.conf for $app." + read -rp " Compile and install $app anyway? [y/N] " response + if [[ ! "$response" =~ ^[yY] ]]; then + echo " Skipping $app." + return + fi + elif ! needs_update "$app" "$install_path" "$version" "$gui"; then + return + fi + + fetch_source "$app" "$git_url" "$wget_url" + run_steps "$app" "$steps" + install_desktop "$desktop" + save_installed_version "$app" "$version" + + # Return to a safe directory after build + cd "$HOME" + + echo " $app $version installed successfully." +} + +# Parse compile.conf and process each app +process_conf() { + local app="" git_url="" wget_url="" install_path="" steps="" version="" desktop="" gui="" + + while IFS= read -r line || [ -n "$line" ]; do + [[ -z "$line" || "$line" == \#* ]] && continue + + if [[ "$line" =~ ^\[(.+)\]$ ]]; then + if [ -n "$app" ]; then + process_app "$app" "$git_url" "$wget_url" "$install_path" "$steps" "$version" "$desktop" "$gui" + fi + app="${BASH_REMATCH[1]}" + git_url="" wget_url="" install_path="" steps="" version="" desktop="" gui="" + continue + fi + + local key="${line%%=*}" + local value="${line#*=}" + value=$(eval echo "$value") + + case "$key" in + git) git_url="$value" ;; + wget) wget_url="$value" ;; + install) install_path="$value" ;; + steps) steps="$value" ;; + version) version="$value" ;; + desktop) desktop="$value" ;; + gui) gui="$value" ;; + esac + + done < "$CONF_FILE" + + # Process the last app in the file + if [ -n "$app" ]; then + process_app "$app" "$git_url" "$wget_url" "$install_path" "$steps" "$version" "$desktop" "$gui" + fi +} + +# --- Main --- + +if [ ! -f "$CONF_FILE" ]; then + echo "Error: $CONF_FILE not found." + exit 1 +fi + +mkdir -p "$TMP_DIR" +mkdir -p "$HOME/.local/state/HamPack" + +echo "Starting HamPack source builds..." +process_conf + +echo "Updating desktop database..." +update-desktop-database "$HOME/.local/share/applications/" + +echo "" +echo "Cleaning up..." +rm -rf "$TMP_DIR" + +echo "All done." \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..3fde07a --- /dev/null +++ b/install.sh @@ -0,0 +1,106 @@ +#!/bin/bash -i +# +# Purpose : HamPack installer + +# Print the logo +print_logo() { + cat << "EOF" + + ██╗ ██╗ █████╗ ███╗ ███╗██████╗ █████╗ ██████╗██╗ ██╗ + ██║ ██║██╔══██╗████╗ ████║██╔══██╗██╔══██╗██╔════╝██║ ██╔╝ + ███████║███████║██╔████╔██║██████╔╝███████║██║ █████╔╝ + ██╔══██║██╔══██║██║╚██╔╝██║██╔═══╝ ██╔══██║██║ ██╔═██╗ + ██║ ██║██║ ██║██║ ╚═╝ ██║██║ ██║ ██║╚██████╗██║ ██╗ + ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ + + + +EOF +} + +# --- Main --- + +set -e + +clear +print_logo + +cd ~ +sudo -v + +echo "Getting the latest version of HamPack..." +rm -rf ~/.local/share/HamPack +git clone https://gitea.young.computer/david/HamPack.git ~/.local/share/HamPack > /dev/null + +sudo cp ~/.local/share/HamPack/hampackrefresh ~/.local/bin/hampackrefresh +sudo cp ~/.local/share/HamPack/hampackupdate ~/.local/bin/hampackupdate + +cd ~/.local/share/HamPack + +# Source utility functions +source utils.sh + +# Source package list +if [ ! -f "packages.conf" ]; then + echo "Error: packages.conf not found!" + exit 1 +fi +source packages.conf + +# echo "Updating system..." +# sudo pacman -Syu --noconfirm + +cd ~/ + +# Install yay AUR helper if not present +#if ! command -v yay &> /dev/null; then +# echo "Installing yay AUR helper..." +# sudo pacman -S --needed git base-devel --noconfirm +# if [[ -d "yay" ]]; then +# echo "yay directory already exists, removing it..." +# rm -rf yay +# fi +# echo "Cloning yay repository..." +# git clone https://aur.archlinux.org/yay.git +# cd yay +# echo "Building yay..." +# makepkg -si --noconfirm +# cd .. +# rm -rf yay +#else +# echo "yay is already installed." +#fi + +echo "Installing system utilities..." +install_packages "${UTILITIES[@]}" + +echo "Installing applications..." +install_packages "${APPLICATIONS[@]}" + +cd ~/.local/share/HamPack + +echo "Installing Flatpak applications..." +. install-flatpaks.sh + +echo "Installing stand-alone compiled applications..." + +. install-compiled.sh + +curl -LsSf uvx.sh/not1mm/install.sh | sh + +if ! ls /usr/lib/modules/$(uname -r) > /dev/null 2>&1; then + echo "HamPack is installed. A newer kernel has been installed, a reboot is recommended." + read -rp "Reboot now? [y/N] " response + case "$response" in + [yY][eE][sS]|[yY]) + echo "Rebooting..." + sudo reboot + ;; + *) + echo "Reboot skipped. Please remember to reboot when convenient." + exit 0 + ;; + esac +else + echo "Ham Pack is installed. Reboot when convenient." +fi \ No newline at end of file diff --git a/packages.conf b/packages.conf new file mode 100644 index 0000000..c5fe427 --- /dev/null +++ b/packages.conf @@ -0,0 +1,48 @@ +# Ham utilities +UTILITIES=( + alsa-utils + aria2 + at-spi2-core + base-devel + cmake + docopt + fldigi + flrig + gpds + gpsbabel + gtk4 + hamlib + jdk-openjdk + libappindicator-gtk3 + libkiwix + libnotify + libsecret + libxcrypt-compat + libxtst + libzim + meson + ninja + nss + pat-bin + python-yattag # must come before chirp-next + qgis + qt6-base + qt6-tools + qt6-webengine + splat + util-linux-libs + voacapl + wine + winetricks + xdg-utils + zim-tools + zimwriterfs +) + +# Ham applications +APPLICATIONS=( + gridtracker2 + chattervox-bin + chirp-next +) + diff --git a/serverrefresh b/serverrefresh new file mode 100755 index 0000000..23501a2 --- /dev/null +++ b/serverrefresh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Print the logo +print_logo() { + cat << "EOF" + + + ██╗ ██╗ █████╗ ███╗ ███╗██████╗ █████╗ ██████╗██╗ ██╗ + ██║ ██║██╔══██╗████╗ ████║██╔══██╗██╔══██╗██╔════╝██║ ██╔╝ + ███████║███████║██╔████╔██║██████╔╝███████║██║ █████╔╝ + ██╔══██║██╔══██║██║╚██╔╝██║██╔═══╝ ██╔══██║██║ ██╔═██╗ + ██║ ██║██║ ██║██║ ╚═╝ ██║██║ ██║ ██║╚██████╗██║ ██╗ + ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ + + +EOF +} + +# Clear screen and show logo +clear +print_logo + +echo "Let's get the lastest changes to HamPack..." + +wget -qO- https://gitea.young.computer/david/hampack/raw/branch/main/install.sh | bash diff --git a/serverupdate b/serverupdate new file mode 100755 index 0000000..29431ab --- /dev/null +++ b/serverupdate @@ -0,0 +1,46 @@ +#!/bin/bash + +# Print the logo +print_logo() { + cat << "EOF" + + + ██╗ ██╗ █████╗ ███╗ ███╗██████╗ █████╗ ██████╗██╗ ██╗ + ██║ ██║██╔══██╗████╗ ████║██╔══██╗██╔══██╗██╔════╝██║ ██╔╝ + ███████║███████║██╔████╔██║██████╔╝███████║██║ █████╔╝ + ██╔══██║██╔══██║██║╚██╔╝██║██╔═══╝ ██╔══██║██║ ██╔═██╗ + ██║ ██║██║ ██║██║ ╚═╝ ██║██║ ██║ ██║╚██████╗██║ ██╗ + ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ + + +EOF +} + +# Clear screen and show logo +clear +print_logo + +echo "Updating Arch..." +sudo pacman -Syu + +echo "Updating AUR..." + +if ! yay -Sua 2>/dev/null; then + echo "yay -Sua returned an error. Let's rebuild YAY." + sudo pacman -R yay + cd /tmp + git clone https://aur.archlinux.org/yay.git + cd yay + makepkg -si + cd .. + rm -rf yay + cd + yay -Sua --noconfirm +else + yay -Sua --noconfirm +fi + +# Will need to update the downloaded binaries and the compiled apps +# In the area below... + +echo "Done. You probably want to reboot your system..." diff --git a/utils.sh b/utils.sh new file mode 100755 index 0000000..62c5d07 --- /dev/null +++ b/utils.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# Function to check if a package is installed +is_installed() { + pacman -Qi "$1" &> /dev/null +} + +# Function to check if a package is installed +is_group_installed() { + pacman -Qg "$1" &> /dev/null +} + +# Function to install packages if not already installed +install_packages() { + local packages=("$@") + local to_install=() + + for pkg in "${packages[@]}"; do + if ! is_installed "$pkg" && ! is_group_installed "$pkg"; then + to_install+=("$pkg") + fi + done + + if [ ${#to_install[@]} -ne 0 ]; then + echo "Installing: ${to_install[*]}" + yay -S --noconfirm "${to_install[@]}" + fi +} \ No newline at end of file