#!/bin/bash # # Purpose : HamPack installer # Print the logo print_logo() { cat << "EOF" ██╗ ██╗ █████╗ ███╗ ███╗██████╗ █████╗ ██████╗██╗ ██╗ ██║ ██║██╔══██╗████╗ ████║██╔══██╗██╔══██╗██╔════╝██║ ██╔╝ ███████║███████║██╔████╔██║██████╔╝███████║██║ █████╔╝ ██╔══██║██╔══██║██║╚██╔╝██║██╔═══╝ ██╔══██║██║ ██╔═██╗ ██║ ██║██║ ██║██║ ╚═╝ ██║██║ ██║ ██║╚██████╗██║ ██╗ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝ ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗ ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗ ███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝ ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗ ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║ ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ EOF } # --- Main --- set -e export PATH="$HOME/.local/bin:$PATH" if ! grep -q 'LOCAL_BIN_PATH' "$HOME/.bashrc"; then echo '' >> "$HOME/.bashrc" echo '# HamPack: add user local bin to PATH' >> "$HOME/.bashrc" echo 'export PATH="$HOME/.local/bin:$PATH" # LOCAL_BIN_PATH' >> "$HOME/.bashrc" fi clear print_logo cd ~ sudo -v # Grant passwordless sudo for the duration of the install, revoke on exit echo "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/99-hampack-install > /dev/null sudo chmod 440 /etc/sudoers.d/99-hampack-install trap "sudo rm -f /etc/sudoers.d/99-hampack-install" EXIT if ! command -v git &> /dev/null; then echo "Installing git..." sudo pacman -S --noconfirm git fi if ! pacman -Qi base-devel &> /dev/null; then echo "Installing base-devel..." sudo pacman -S --noconfirm base-devel else echo "base-devel is already installed, skipping." fi echo "Getting the latest version of HamPackServer..." rm -rf ~/.local/share/HamPackServer git clone https://gitea.young.computer/david/HamPackServer.git "$HOME/.local/share/HamPackServer" > /dev/null mkdir -p "$HOME/.local/bin" cp "$HOME/.local/share/HamPackServer/hampackserverrefresh" "$HOME/.local/bin/hampackserverrefresh" cp "$HOME/.local/share/HamPackServer/hampackserverupdate" "$HOME/.local/bin/hampackserverupdate" cp "$HOME/.local/share/HamPackServer/scripts/start-hamclock.sh" "$HOME/.local/bin/start-hamclock.sh" chmod +x "$HOME/.local/bin/start-hamclock.sh" mkdir -p "$HOME/.config/systemd/user" cp "$HOME/.local/share/HamPackServer/servicefiles/hamclock.service" "$HOME/.config/systemd/user/" systemctl --user daemon-reload systemctl --user enable --now hamclock cd ~/.local/share/HamPackServer echo "Updating system..." sudo pacman -Syu --noconfirm install_yay() { rm -rf /tmp/yay git clone https://aur.archlinux.org/yay.git /tmp/yay cd /tmp/yay makepkg -si --noconfirm cd ~/.local/share/HamPackServer rm -rf /tmp/yay } if ! command -v yay &> /dev/null; then echo "Installing yay AUR helper..." install_yay else echo "yay is already installed, skipping." fi if ! yay --version &> /dev/null; then echo "yay does not appear to be working, reinstalling..." install_yay fi # 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 "Installing servers..." install_packages "${SERVERS[@]}" echo "Installing utilities..." install_packages "${UTILITIES[@]}" if ! command -v pm2 &> /dev/null; then npm install pm2 -g --prefix "$HOME/.local" fi cd ~/.local/share/HamPackServer echo "Enabling PHP extensions in /etc/php/php.ini..." for ext in curl mbstring xml pdo_mysql mysqli openssl; do sudo sed -i "s/^;extension=${ext}$/extension=${ext}/" /etc/php/php.ini done echo "Configuring PHP module in httpd.conf..." if ! grep -q 'LoadModule php_module' /etc/httpd/conf/httpd.conf; then printf '\nLoadModule php_module modules/libphp.so\nAddHandler php-script .php\nInclude conf/extra/php_module.conf\n' | sudo tee -a /etc/httpd/conf/httpd.conf > /dev/null fi echo "Switching Apache MPM to prefork in httpd.conf..." sudo sed -i 's|^LoadModule mpm_event_module|#LoadModule mpm_event_module|' /etc/httpd/conf/httpd.conf sudo sed -i 's|^LoadModule mpm_worker_module|#LoadModule mpm_worker_module|' /etc/httpd/conf/httpd.conf if grep -q '^#LoadModule mpm_prefork_module' /etc/httpd/conf/httpd.conf; then sudo sed -i 's|^#LoadModule mpm_prefork_module|LoadModule mpm_prefork_module|' /etc/httpd/conf/httpd.conf elif ! grep -q '^LoadModule mpm_prefork_module' /etc/httpd/conf/httpd.conf; then printf 'LoadModule mpm_prefork_module modules/mod_mpm_prefork.so\n' | sudo tee -a /etc/httpd/conf/httpd.conf > /dev/null fi # Install Cockpit if ! pacman -Qi cockpit &> /dev/null; then echo "Installing Cockpit..." sudo pacman -S --noconfirm cockpit sudo systemctl enable --now cockpit.socket echo "Cockpit installed. Access it at http://localhost:9090" else echo "Cockpit is already installed, skipping." fi # Install Wavelog WAVELOG_DIR="$HOME/.local/bin/wavelog" if [ ! -d "$WAVELOG_DIR" ]; then echo "Installing Wavelog..." mkdir -p "$WAVELOG_DIR" cp "$HOME/.local/share/HamPackServer/wavelog/docker-compose.yaml" "$WAVELOG_DIR/docker-compose.yaml" WAVELOG_DB_PASS=$(openssl rand -base64 32 | tr -d '=/+' | cut -c1-24) sed -i "s|MARIADB_PASSWORD: wavelog # <- Insert a strong password here|MARIADB_PASSWORD: ${WAVELOG_DB_PASS}|" "$WAVELOG_DIR/docker-compose.yaml" if ! systemctl is-active --quiet docker; then echo "Starting Docker..." sudo systemctl enable --now docker fi echo "Waiting for Docker socket..." timeout=30 while [ ! -S /var/run/docker.sock ] && [ $timeout -gt 0 ]; do sleep 1 timeout=$((timeout - 1)) done if [ ! -S /var/run/docker.sock ]; then echo "Error: Docker socket not available after 30 seconds." exit 1 fi sudo usermod -aG docker "$USER" sudo chown root:docker /var/run/docker.sock sudo chmod 660 /var/run/docker.sock sg docker -c "docker compose -f '$WAVELOG_DIR/docker-compose.yaml' up -d" echo "Wavelog installed. Access it at http://localhost:8086" else echo "Wavelog is already installed, skipping." fi # Install openhamclock echo "Installing openhamclock..." INSTALL_SUCCESS=true if ! bash install-openhamclock.sh; then echo "Warning: install-openhamclock.sh encountered errors. openhamclock may not have installed correctly." INSTALL_SUCCESS=false fi # Install Compiled Servers echo "Installing compiled servers..." if ! bash install-compiled.sh; then echo "Warning: install-compiled.sh encountered errors. Some applications may not have installed correctly." INSTALL_SUCCESS=false fi echo "" if [ "$INSTALL_SUCCESS" = true ]; then echo "HamPackServer is installed successfully!" else echo "HamPackServer installation completed with errors. Please review the output above." fi if [ -n "$WAVELOG_DB_PASS" ]; then echo "" echo "Wavelog database password: $WAVELOG_DB_PASS (Please save this.)" echo "(also stored in $WAVELOG_DIR/docker-compose.yaml)" fi echo "" read -rp "A reboot is required to complete setup. Reboot now? [y/N] " response