#!/bin/bash # Synology Arrs Stack Log Viewer # This script helps view and manage container logs set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Function to print colored output print_status() { echo -e "${GREEN}[INFO]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Load environment variables load_env() { if [ -f ".env" ]; then set -a source .env set +a fi } # Check if docker-compose is available check_docker_compose() { if command -v docker-compose >/dev/null 2>&1; then COMPOSE_CMD="docker-compose" elif command -v docker >/dev/null 2>&1 && docker compose version >/dev/null 2>&1; then COMPOSE_CMD="docker compose" else print_error "Neither docker-compose nor docker compose found!" echo "This script requires Docker Compose to be installed." exit 1 fi } # Show all logs show_all_logs() { local follow=${1:-false} local compose_file="compose/docker-compose.yml" if [ "$follow" = "true" ]; then print_status "Following logs for all containers (Ctrl+C to exit)..." $COMPOSE_CMD -f "$compose_file" logs -f else print_status "Showing recent logs for all containers..." $COMPOSE_CMD -f "$compose_file" logs --tail=100 fi } # Show logs for specific service show_service_logs() { local service="$1" local follow=${2:-false} local compose_file="compose/docker-compose.yml" if [ -z "$service" ]; then print_error "Please specify a service name" echo "Available services: sonarr, radarr, lidarr, bazarr, prowlarr" exit 1 fi if [ "$follow" = "true" ]; then print_status "Following logs for $service (Ctrl+C to exit)..." $COMPOSE_CMD -f "$compose_file" logs -f "$service" else print_status "Showing recent logs for $service..." $COMPOSE_CMD -f "$compose_file" logs --tail=100 "$service" fi } # Show container status show_status() { local compose_file="compose/docker-compose.yml" print_status "Container status:" $COMPOSE_CMD -f "$compose_file" ps echo "" print_status "Container resource usage:" if command -v docker >/dev/null 2>&1; then docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}" \ sonarr radarr lidarr bazarr prowlarr 2>/dev/null || print_warning "Could not get resource usage" fi } # Export logs to file export_logs() { local service="$1" local compose_file="compose/docker-compose.yml" local timestamp=$(date +"%Y%m%d_%H%M%S") mkdir -p logs if [ -z "$service" ]; then # Export all logs local log_file="logs/arrs_all_logs_$timestamp.txt" print_status "Exporting all logs to $log_file..." $COMPOSE_CMD -f "$compose_file" logs --no-color > "$log_file" else # Export specific service logs local log_file="logs/${service}_logs_$timestamp.txt" print_status "Exporting $service logs to $log_file..." $COMPOSE_CMD -f "$compose_file" logs --no-color "$service" > "$log_file" fi print_status "Logs exported successfully!" local file_size=$(du -h "$log_file" | cut -f1) print_status "File size: $file_size" } # Interactive service selection interactive_selection() { echo "" echo "Select a service to view logs:" echo "1) All services" echo "2) Sonarr" echo "3) Radarr" echo "4) Lidarr" echo "5) Bazarr" echo "6) Prowlarr" echo "" read -p "Enter choice [1]: " choice choice=${choice:-1} echo "" echo "Log viewing options:" echo "1) Show recent logs" echo "2) Follow logs (live)" echo "3) Export logs to file" echo "" read -p "Enter option [1]: " option option=${option:-1} local follow=false if [ "$option" = "2" ]; then follow=true fi case $choice in 1) if [ "$option" = "3" ]; then export_logs else show_all_logs "$follow" fi ;; 2) if [ "$option" = "3" ]; then export_logs "sonarr" else show_service_logs "sonarr" "$follow" fi ;; 3) if [ "$option" = "3" ]; then export_logs "radarr" else show_service_logs "radarr" "$follow" fi ;; 4) if [ "$option" = "3" ]; then export_logs "lidarr" else show_service_logs "lidarr" "$follow" fi ;; 5) if [ "$option" = "3" ]; then export_logs "bazarr" else show_service_logs "bazarr" "$follow" fi ;; 6) if [ "$option" = "3" ]; then export_logs "prowlarr" else show_service_logs "prowlarr" "$follow" fi ;; *) print_error "Invalid choice" exit 1 ;; esac } # Main execution main() { echo -e "${BLUE}=== Synology Arrs Stack Log Viewer ===${NC}" echo "" load_env check_docker_compose case "${1:-}" in "all") show_all_logs "${2:-false}" ;; "follow"|"-f") if [ -n "$2" ]; then show_service_logs "$2" true else show_all_logs true fi ;; "export") export_logs "$2" ;; "status") show_status ;; "sonarr"|"radarr"|"lidarr"|"bazarr"|"prowlarr") show_service_logs "$1" "${2:-false}" ;; "help"|"-h"|"--help") echo "Usage: $0 [command] [options]" echo "" echo "Commands:" echo " (no command) Interactive service selection" echo " all [follow] Show logs for all services" echo " follow, -f [svc] Follow logs (live) for service or all" echo " export [service] Export logs to file" echo " status Show container status and resource usage" echo " Show logs for specific service" echo "" echo "Services: sonarr, radarr, lidarr, bazarr, prowlarr" echo "" echo "Examples:" echo " $0 # Interactive selection" echo " $0 sonarr # Show Sonarr logs" echo " $0 follow radarr # Follow Radarr logs" echo " $0 export # Export all logs" echo " $0 status # Show container status" ;; "") interactive_selection ;; *) print_error "Unknown command: $1" echo "Use '$0 help' for usage information" exit 1 ;; esac } # Run main function main "$@"