#!/bin/bash # Exit on error, unset variable usage, and error in a pipeline set -euo pipefail # Define color variables RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No color # Function to print messages in color info() { echo -e "${BLUE}[INFO]${NC} $1"; } success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } # Check for root privileges if [[ "$EUID" -ne 0 ]]; then error "This script must be run as root. Use 'sudo ./installation.sh'" fi # Update and install necessary packages info "Updating package list and installing necessary packages..." sudo apt update && sudo apt install -y git gh apache2 sqlite3 php php-sqlite3 python3 python3-pip jq autossh i2c-tools python3-smbus || error "Failed to install required packages." # Install Python libraries info "Installing Python libraries..." sudo pip3 install pyserial requests RPi.GPIO adafruit-circuitpython-bme280 crcmod psutil gpiozero ntplib pytz --break-system-packages || error "Failed to install Python libraries." # Clone the repository (check if it exists first) REPO_DIR="/var/www/nebuleair_pro_4g" if [[ -d "$REPO_DIR" ]]; then warning "Repository already exists. Will update instead of clone." # Save current directory local current_dir=$(pwd) # Navigate to repository directory cd "$REPO_DIR" # Stash any local changes sudo git stash || warning "Failed to stash local changes" # Pull latest changes sudo git pull || error "Failed to pull latest changes" # Return to original directory cd "$current_dir" success "Repository updated successfully!" else info "Cloning the NebuleAir Pro 4G repository..." sudo git clone http://gitea.aircarto.fr/PaulVua/nebuleair_pro_4g.git "$REPO_DIR" || error "Failed to clone repository." fi # Set up repository files and permissions info "Setting up repository files and permissions..." sudo mkdir -p "$REPO_DIR/logs" sudo touch "$REPO_DIR/logs/app.log" "$REPO_DIR/logs/master.log" "$REPO_DIR/logs/master_errors.log" "$REPO_DIR/wifi_list.csv" sudo chmod -R 755 "$REPO_DIR/" sudo chown -R www-data:www-data "$REPO_DIR/" sudo git config --global core.fileMode false #sudo git -C /var/www/nebuleair_pro_4g config core.fileMode false sudo git config --global --add safe.directory "$REPO_DIR" # Set up cron jobs (ensure file exists first) info "Setting up cron jobs..." if [[ -f "$REPO_DIR/cron_jobs" ]]; then sudo crontab "$REPO_DIR/cron_jobs" success "Cron jobs set up successfully." else warning "Cron jobs file not found. Skipping." fi # Create databases info "Creating databases..." if [[ -f "$REPO_DIR/sqlite/create_db.py" ]]; then sudo /usr/bin/python3 "$REPO_DIR/sqlite/create_db.py" || error "Failed to create databases." success "Databases created successfully." else warning "Database creation script not found." fi # Set config info "Set config..." if [[ -f "$REPO_DIR/sqlite/set_config.py" ]]; then sudo /usr/bin/python3 "$REPO_DIR/sqlite/set_config.py" || error "Failed to set config." success "Databases created successfully." else warning "Database creation script not found." fi # Configure Apache info "Configuring Apache..." APACHE_CONF="/etc/apache2/sites-available/000-default.conf" if grep -q "DocumentRoot /var/www/nebuleair_pro_4g" "$APACHE_CONF"; then warning "Apache configuration already set. Skipping." else sudo sed -i 's|DocumentRoot /var/www/html|DocumentRoot /var/www/nebuleair_pro_4g|' "$APACHE_CONF" sudo systemctl reload apache2 success "Apache configuration updated and reloaded." fi # Add sudo authorization (prevent duplicate entries) info "Setting up sudo authorization..." if ! sudo grep -q "/usr/bin/nmcli" /etc/sudoers; then echo -e "ALL ALL=(ALL) NOPASSWD: /usr/bin/nmcli, /usr/sbin/reboot\nwww-data ALL=(ALL) NOPASSWD: /usr/bin/git pull\nwww-data ALL=(ALL) NOPASSWD: /usr/bin/ssh\nwww-data ALL=(ALL) NOPASSWD: /usr/bin/python3 * www-data ALL=(ALL) NOPASSWD: /bin/systemctl * www-data ALL=(ALL) NOPASSWD: /var/www/nebuleair_pro_4g/*" | sudo tee -a /etc/sudoers > /dev/null success "Sudo authorization added." else warning "Sudo authorization already set. Skipping." fi # Open all UART serial ports (avoid duplication) info "Configuring UART serial ports..." if ! grep -q "enable_uart=1" /boot/firmware/config.txt; then echo -e "\nenable_uart=1\ndtoverlay=uart0\ndtoverlay=uart1\ndtoverlay=uart2\ndtoverlay=uart3\ndtoverlay=uart4\ndtoverlay=uart5" | sudo tee -a /boot/firmware/config.txt > /dev/null success "UART configuration added." else warning "UART configuration already set. Skipping." fi # Ensure correct permissions for serial devices info "Setting permissions for serial devices..." sudo chmod 666 /dev/ttyAMA* || warning "Failed to set permissions for /dev/ttyAMA*" # Enable I2C ports info "Enabling I2C ports..." sudo raspi-config nonint do_i2c 0 success "I2C ports enabled." #creates databases info "Creates sqlites databases..." /usr/bin/python3 /var/www/nebuleair_pro_4g/sqlite/create_db.py # Completion message success "Setup completed successfully!" info "System will reboot in 5 seconds..." sleep 5 sudo reboot