diff --git a/goaccess-setup.sh b/goaccess-setup.sh new file mode 100644 index 0000000..6339871 --- /dev/null +++ b/goaccess-setup.sh @@ -0,0 +1,215 @@ +#!/bin/bash + +# Enable debug mode to see what's happening +set -x + +# Function to check if a command exists +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Function to find user directories in /home with exclusions +find_user_dirs() { + find /home -maxdepth 1 -mindepth 1 -type d | grep -v -E '^/home/(lost\+found|mysql|homelab)$' +} + +# Function to setup GoAccess if not already installed +setup_goaccess() { + if ! command_exists goaccess; then + echo "Installing GoAccess..." + echo "deb https://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list + wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add - + sudo apt-get update + sudo apt-get install -y goaccess + else + echo "GoAccess is already installed." + fi +} + +# Function to update logrotate configuration while preserving existing configs +update_logrotate() { + local user_dirs=($(find_user_dirs)) + local existing_config="" + local new_config="" + + # Read existing configuration if it exists + if [ -f "/etc/logrotate.d/nginx" ]; then + existing_config=$(cat /etc/logrotate.d/nginx) + fi + + for user_dir in "${user_dirs[@]}"; do + username=$(basename "$user_dir") + if [ -d "$user_dir/logs/nginx" ]; then + # Check if this user's configuration already exists + if ! echo "$existing_config" | grep -q "$user_dir/logs/nginx/\*\.log"; then + echo "Adding new nginx logs directory for user: $username" + new_config+=" +$user_dir/logs/nginx/*.log { + yearly + maxsize 1000000000 + missingok + rotate 4 + compress + delaycompress + notifempty + create 0640 $username adm + sharedscripts + prerotate + if [ -d /etc/logrotate.d/httpd-prerotate ]; then \ + run-parts /etc/logrotate.d/httpd-prerotate; \ + fi \ + endscript + postrotate + invoke-rc.d nginx rotate >/dev/null 2>&1 + endscript +} +" + else + echo "Configuration already exists for user: $username" + fi + fi + done + + # Only update if there are new configurations + if [ ! -z "$new_config" ]; then + echo "${existing_config}${new_config}" | sudo tee /etc/logrotate.d/nginx + echo "Logrotate configuration updated with new entries." + else + echo "No new configurations to add to logrotate." + fi +} + +# Function to create or update GoAccess update script +create_goaccess_script() { + # Check if script already exists and is different + local script_path="/usr/bin/update_goaccess.sh" + local script_content='#!/bin/bash + +# Enable error handling +set -e + +# Enable debug output +set -x + +process_logs() { + # Find all user directories in /home, excluding mysql and homelab + for user_dir in /home/*/; do + user_dir=${user_dir%/} + username=$(basename "$user_dir") + + # Skip excluded directories + case "$username" in + "lost+found"|"mysql"|"homelab") + continue + ;; + esac + + echo "Processing user directory: $user_dir" + + # Check for nginx logs directory and access.log + log_file="$user_dir/logs/nginx/access.log" + if [ -f "$log_file" ]; then + echo "Found nginx access log: $log_file" + + # Check for htdocs directory + if [ -d "$user_dir/htdocs" ]; then + echo "Found htdocs directory" + + # Process each domain directory + for domain_dir in "$user_dir/htdocs"/*/ ; do + if [ -d "$domain_dir" ]; then + domain=$(basename "$domain_dir") + echo "Processing domain: $domain" + + # Create insights directory with proper permissions + insights_dir="$domain_dir/insights" + if [ ! -d "$insights_dir" ]; then + echo "Creating insights directory: $insights_dir" + mkdir -p "$insights_dir" + fi + + # Generate GoAccess report + goaccess "$log_file" \ + --log-format=COMBINED \ + --date-format="%d/%b/%Y" \ + --time-format="%H:%M:%S" \ + --double-decode \ + --anonymize-ip \ + -a \ + -o "$insights_dir/goaccess.html" + + # Set proper ownership + chown -R "$username:$username" "$insights_dir" + chmod -R 755 "$insights_dir" + + echo "Successfully generated report for $domain" + fi + done + else + echo "Warning: No htdocs directory found in $user_dir" + fi + else + echo "Warning: No access.log found at $log_file" + fi + done +} + +# Main execution +echo "Starting GoAccess report generation..." +process_logs +echo "Finished GoAccess report generation"' + + if [ -f "$script_path" ]; then + local existing_content=$(cat "$script_path") + if [ "$existing_content" != "$script_content" ]; then + echo "Updating existing GoAccess script with improvements..." + echo "$script_content" | sudo tee "$script_path" + else + echo "GoAccess script is already up to date." + fi + else + echo "Creating new GoAccess script..." + echo "$script_content" | sudo tee "$script_path" + fi + + sudo chmod +x "$script_path" +} + +# Function to setup or update cron job +setup_cron() { + # Check if cron job already exists + if ! crontab -l 2>/dev/null | grep -q "update_goaccess.sh"; then + # Add new cron job only if it doesn't exist + (crontab -l 2>/dev/null; echo "*/5 * * * * /usr/bin/update_goaccess.sh > /var/log/goaccess_cron.log 2>&1") | crontab - + echo "Added new cron job for GoAccess updates." + else + echo "Cron job already exists." + fi +} + +# Initial run of the update script +initial_run() { + echo "Running update_goaccess.sh to process new folders..." + sudo /usr/bin/update_goaccess.sh +} + +# Main execution +echo "Starting setup..." +setup_goaccess +update_logrotate +create_goaccess_script +setup_cron +initial_run + +# Only restart nginx if logrotate configuration was updated +if [ ! -z "$new_config" ]; then + sudo systemctl restart nginx + echo "Nginx restarted due to configuration changes." +else + echo "No nginx restart needed." +fi + +echo "Setup completed!" +echo "GoAccess reports will be updated every 5 minutes" +echo "You can check the cron job logs at /var/log/goaccess_cron.log" +echo "Reports should be available at: /home//htdocs//insights/goaccess.html" \ No newline at end of file