Compare commits

..

No commits in common. "bd55ef8613c6bd344a8699116ea250ded6f420b6" and "d477d65ff588424aa99cb454e3ef8815de43e71e" have entirely different histories.

4 changed files with 56 additions and 214 deletions

View File

@ -1,14 +1,9 @@
# Transmission RSS Manager v2.0.1 # Transmission RSS Manager v2.0.0
A comprehensive web-based tool to automate and manage your Transmission torrent downloads with RSS feed integration, intelligent media organization, and enhanced security features. Now with automatic updates and easy installation! A comprehensive web-based tool to automate and manage your Transmission torrent downloads with RSS feed integration, intelligent media organization, and enhanced security features. Now with automatic updates and easy installation!
## Changelog ## Changelog
### v2.0.1 (2025-03-05)
- **New**: Automatic detection of existing installations for seamless updates
- **Improved**: Enhanced update process that preserves existing configurations
- **Improved**: Installer now dynamically reads version from package.json
### v2.0.0 (2025-03-05) ### v2.0.0 (2025-03-05)
- **Major**: Completely redesigned installation system using git - **Major**: Completely redesigned installation system using git
- **New**: One-click update feature with version checking - **New**: One-click update feature with version checking
@ -82,10 +77,7 @@ The bootstrap installer will:
3. Run the main installer which guides you through configuration 3. Run the main installer which guides you through configuration
4. Set up the service and web interface 4. Set up the service and web interface
**New in v2.0.0:** **New in v2.0.0:** The installer now detects if Transmission is installed and offers to install and configure it automatically if needed.
- The installer now detects if Transmission is installed and offers to install and configure it automatically if needed.
- The installer automatically detects existing installations and runs in update mode, preserving your existing configuration.
- When updating, only necessary files are modified while maintaining your custom settings and preferences.
### Manual Installation ### Manual Installation
@ -280,25 +272,6 @@ The system will:
- Restore your configuration - Restore your configuration
- Restart the service automatically - Restart the service automatically
### Using the Installer
You can also update by running the installer again:
```bash
# Navigate to the installation directory
cd /opt/transmission-rss-manager
# Run the installer with sudo
sudo ./main-installer.sh
```
The installer will:
1. Detect your existing installation automatically
2. Run in update mode
3. Preserve all your existing configurations
4. Update only the necessary files
5. Restart the service with your updated installation
### Using the Command Line ### Using the Command Line
If you prefer to update via command line: If you prefer to update via command line:

View File

@ -15,8 +15,7 @@ NC='\033[0m' # No Color
# Print header # Print header
echo -e "${BOLD}==================================================${NC}" echo -e "${BOLD}==================================================${NC}"
echo -e "${BOLD} Transmission RSS Manager Installer ${NC}" echo -e "${BOLD} Transmission RSS Manager Installer ${NC}"
VERSION=$(grep -oP '"version": "\K[^"]+' "${SCRIPT_DIR}/package.json" 2>/dev/null || echo "Unknown") echo -e "${BOLD} Version 2.0.0 - Git Edition ${NC}"
echo -e "${BOLD} Version ${VERSION} - Git Edition ${NC}"
echo -e "${BOLD}==================================================${NC}" echo -e "${BOLD}==================================================${NC}"
echo echo
@ -31,28 +30,10 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
# Check for installation type # Check for installation type
IS_UPDATE=false IS_UPDATE=false
INSTALLATION_DETECTED=false
# Check for config.json file (primary indicator)
if [ -f "${SCRIPT_DIR}/config.json" ]; then if [ -f "${SCRIPT_DIR}/config.json" ]; then
INSTALLATION_DETECTED=true
fi
# Check for service file (secondary indicator)
if [ -f "/etc/systemd/system/transmission-rss-manager.service" ]; then
INSTALLATION_DETECTED=true
fi
# Check for data directory (tertiary indicator)
if [ -d "${SCRIPT_DIR}/data" ] && [ "$(ls -A "${SCRIPT_DIR}/data" 2>/dev/null)" ]; then
INSTALLATION_DETECTED=true
fi
if [ "$INSTALLATION_DETECTED" = true ]; then
IS_UPDATE=true IS_UPDATE=true
echo -e "${YELLOW}Existing installation detected. Running in update mode.${NC}" echo -e "${YELLOW}Existing installation detected. Running in update mode.${NC}"
echo -e "${GREEN}Your existing configuration will be preserved.${NC}" echo -e "${GREEN}Your existing configuration will be preserved.${NC}"
echo -e "${GREEN}Only application files will be updated.${NC}"
else else
echo -e "${GREEN}Fresh installation. Will create new configuration.${NC}" echo -e "${GREEN}Fresh installation. Will create new configuration.${NC}"
fi fi
@ -64,7 +45,6 @@ REQUIRED_MODULES=(
"${SCRIPT_DIR}/modules/utils-module.sh" "${SCRIPT_DIR}/modules/utils-module.sh"
"${SCRIPT_DIR}/modules/dependencies-module.sh" "${SCRIPT_DIR}/modules/dependencies-module.sh"
"${SCRIPT_DIR}/modules/service-setup-module.sh" "${SCRIPT_DIR}/modules/service-setup-module.sh"
"${SCRIPT_DIR}/modules/file-creator-module.sh"
) )
for module in "${REQUIRED_MODULES[@]}"; do for module in "${REQUIRED_MODULES[@]}"; do
@ -80,7 +60,6 @@ source "${SCRIPT_DIR}/modules/utils-module.sh" # Load utilities first for loggin
source "${SCRIPT_DIR}/modules/config-module.sh" source "${SCRIPT_DIR}/modules/config-module.sh"
source "${SCRIPT_DIR}/modules/dependencies-module.sh" source "${SCRIPT_DIR}/modules/dependencies-module.sh"
source "${SCRIPT_DIR}/modules/service-setup-module.sh" source "${SCRIPT_DIR}/modules/service-setup-module.sh"
source "${SCRIPT_DIR}/modules/file-creator-module.sh"
# Function to handle cleanup on error # Function to handle cleanup on error
function cleanup_on_error() { function cleanup_on_error() {
@ -99,80 +78,48 @@ trap 'cleanup_on_error "$BASH_COMMAND"' ERR
# Execute the installation steps in sequence # Execute the installation steps in sequence
log "INFO" "Starting installation process..." log "INFO" "Starting installation process..."
if [ "$IS_UPDATE" = true ]; then # Step 1: Gather configuration from user
log "INFO" "Running in update mode - preserving existing configuration..." log "INFO" "Gathering configuration..."
gather_configuration || {
log "ERROR" "Configuration gathering failed"
exit 1
}
# When updating, we only need to update core files and dependencies # Step 2: Install dependencies
# Configuration should be preserved log "INFO" "Installing dependencies..."
install_dependencies || {
log "ERROR" "Dependency installation failed"
exit 1
}
# Step 1: Check dependencies (but don't reconfigure) # Step 3: Create installation directories
log "INFO" "Checking dependencies..." log "INFO" "Creating directories..."
install_dependencies || { create_directories || {
log "ERROR" "Dependency check failed" log "ERROR" "Directory creation failed"
exit 1 exit 1
} }
# Step the service configuration (will preserve existing settings) # Step 4: Create configuration files only (no application files since they're from git)
log "INFO" "Updating service configuration..." log "INFO" "Creating configuration files..."
setup_service || { create_config_files || {
log "ERROR" "Service update failed" log "ERROR" "Configuration file creation failed"
exit 1 exit 1
} }
# Install npm dependencies # Step 5: Create service files and install the service
log "INFO" "Updating npm dependencies..." log "INFO" "Setting up service..."
cd "$SCRIPT_DIR" setup_service || {
npm install || { log "ERROR" "Service setup failed"
log "ERROR" "NPM installation failed" exit 1
exit 1 }
}
else # Step 6: Install npm dependencies
# This is a fresh installation - run all steps log "INFO" "Installing npm dependencies..."
cd "$SCRIPT_DIR"
# Step 1: Gather configuration from user npm install || {
log "INFO" "Gathering configuration..." log "ERROR" "NPM installation failed"
gather_configuration || { exit 1
log "ERROR" "Configuration gathering failed" }
exit 1
}
# Step 2: Install dependencies
log "INFO" "Installing dependencies..."
install_dependencies || {
log "ERROR" "Dependency installation failed"
exit 1
}
# Step 3: Create installation directories
log "INFO" "Creating directories..."
create_directories || {
log "ERROR" "Directory creation failed"
exit 1
}
# Step 4: Create configuration files only (no application files since they're from git)
log "INFO" "Creating configuration files..."
create_config_files || {
log "ERROR" "Configuration file creation failed"
exit 1
}
# Step 5: Create service files and install the service
log "INFO" "Setting up service..."
setup_service || {
log "ERROR" "Service setup failed"
exit 1
}
# Step 6: Install npm dependencies
log "INFO" "Installing npm dependencies..."
cd "$SCRIPT_DIR"
npm install || {
log "ERROR" "NPM installation failed"
exit 1
}
fi
# Step 7: Set up update script # Step 7: Set up update script
log "INFO" "Setting up update script..." log "INFO" "Setting up update script..."
@ -279,13 +226,7 @@ finalize_setup || {
# Installation complete # Installation complete
echo echo
echo -e "${BOLD}${GREEN}==================================================${NC}" echo -e "${BOLD}${GREEN}==================================================${NC}"
echo -e "${BOLD}${GREEN} Installation Complete! ${NC}"
if [ "$IS_UPDATE" = true ]; then
echo -e "${BOLD}${GREEN} Update Complete! ${NC}"
else
echo -e "${BOLD}${GREEN} Installation Complete! ${NC}"
fi
echo -e "${BOLD}${GREEN}==================================================${NC}" echo -e "${BOLD}${GREEN}==================================================${NC}"
echo -e "You can access the web interface at: ${BOLD}http://localhost:$PORT${NC} or ${BOLD}http://your-server-ip:$PORT${NC}" echo -e "You can access the web interface at: ${BOLD}http://localhost:$PORT${NC} or ${BOLD}http://your-server-ip:$PORT${NC}"
echo -e "You may need to configure your firewall to allow access to port $PORT" echo -e "You may need to configure your firewall to allow access to port $PORT"
@ -296,12 +237,5 @@ echo -e " To view logs: ${YELLOW}journalctl -u $SERVICE_NAME${NC}"
echo -e " To restart the service: ${YELLOW}systemctl restart $SERVICE_NAME${NC}" echo -e " To restart the service: ${YELLOW}systemctl restart $SERVICE_NAME${NC}"
echo -e " To update the application: ${YELLOW}Use the Update button in the System Status section${NC}" echo -e " To update the application: ${YELLOW}Use the Update button in the System Status section${NC}"
echo echo
echo -e "Thank you for installing Transmission RSS Manager!"
if [ "$IS_UPDATE" = true ]; then
echo -e "Thank you for updating Transmission RSS Manager!"
echo -e "The service has been restarted with the new version."
else
echo -e "Thank you for installing Transmission RSS Manager!"
fi
echo -e "${BOLD}==================================================${NC}" echo -e "${BOLD}==================================================${NC}"

View File

@ -33,72 +33,14 @@ function setup_service() {
return 1 return 1
fi fi
# Check if service file already exists # Create backup of existing service file if it exists
if [ -f "/etc/systemd/system/$SERVICE_NAME.service" ]; then
backup_file "/etc/systemd/system/$SERVICE_NAME.service"
fi
# Create systemd service file
SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service" SERVICE_FILE="/etc/systemd/system/$SERVICE_NAME.service"
if [ -f "$SERVICE_FILE" ] && [ "$IS_UPDATE" = true ]; then cat > "$SERVICE_FILE" << EOF
log "INFO" "Service file already exists. Preserving existing service configuration."
# Extract existing JWT_SECRET if present to maintain session consistency
EXISTING_JWT_SECRET=$(grep "Environment=JWT_SECRET=" "$SERVICE_FILE" | cut -d'=' -f3)
# Extract existing PORT if it differs from the configured one
EXISTING_PORT=$(grep "Environment=PORT=" "$SERVICE_FILE" | cut -d'=' -f3)
if [ -n "$EXISTING_PORT" ] && [ "$EXISTING_PORT" != "$PORT" ]; then
log "INFO" "Using existing port configuration: $EXISTING_PORT"
PORT=$EXISTING_PORT
fi
# Create backup of existing service file
backup_file "$SERVICE_FILE"
# Update the service file while preserving key settings
cat > "$SERVICE_FILE" << EOF
[Unit]
Description=Transmission RSS Manager
After=network.target transmission-daemon.service
Wants=network-online.target
[Service]
Type=simple
User=$USER
WorkingDirectory=$INSTALL_DIR
ExecStart=/usr/bin/node $INSTALL_DIR/server.js
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
Environment=PORT=$PORT
Environment=NODE_ENV=production
Environment=DEBUG_ENABLED=false
Environment=LOG_FILE=$INSTALL_DIR/logs/transmission-rss-manager.log
EOF
# Preserve the existing JWT_SECRET if available
if [ -n "$EXISTING_JWT_SECRET" ]; then
echo "Environment=JWT_SECRET=$EXISTING_JWT_SECRET" >> "$SERVICE_FILE"
else
echo "# Generate a random JWT secret for security" >> "$SERVICE_FILE"
echo "Environment=JWT_SECRET=$(openssl rand -hex 32)" >> "$SERVICE_FILE"
fi
# Close the service file definition
cat >> "$SERVICE_FILE" << EOF
[Install]
WantedBy=multi-user.target
EOF
else
# For fresh installations, create a new service file
log "INFO" "Creating new service file"
# Create backup of existing service file if it exists
if [ -f "$SERVICE_FILE" ]; then
backup_file "$SERVICE_FILE"
fi
# Create systemd service file
cat > "$SERVICE_FILE" << EOF
[Unit] [Unit]
Description=Transmission RSS Manager Description=Transmission RSS Manager
After=network.target transmission-daemon.service After=network.target transmission-daemon.service
@ -123,7 +65,6 @@ Environment=JWT_SECRET=$(openssl rand -hex 32)
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
EOF EOF
fi
# Create logs directory # Create logs directory
mkdir -p "$INSTALL_DIR/logs" mkdir -p "$INSTALL_DIR/logs"
@ -205,9 +146,6 @@ server {
} }
EOF EOF
log "INFO" "Nginx configured to proxy connections from port 80 to port $PORT"
log "INFO" "You can access Transmission RSS Manager at http://your-server-ip/ (port 80) via Nginx"
# Check if Debian/Ubuntu style (need symlink between available and enabled) # Check if Debian/Ubuntu style (need symlink between available and enabled)
if [ "$NGINX_AVAILABLE_DIR" != "$NGINX_ENABLED_DIR" ]; then if [ "$NGINX_AVAILABLE_DIR" != "$NGINX_ENABLED_DIR" ]; then
# Create symbolic link to enable the site (if it doesn't already exist) # Create symbolic link to enable the site (if it doesn't already exist)
@ -229,10 +167,7 @@ EOF
# Check for port conflicts # Check for port conflicts
if ss -lnt | grep ":$PORT " &> /dev/null; then if ss -lnt | grep ":$PORT " &> /dev/null; then
log "WARN" "Port $PORT is already in use. This may cause conflicts with the service." log "WARN" "Port $PORT is already in use. This may cause conflicts with the service."
log "WARN" "The service will fail to start. Please stop any service using port $PORT and try again." log "WARN" "Consider changing the port if you encounter issues."
else
log "INFO" "You can access the web interface at: http://localhost:$PORT or http://your-server-ip:$PORT"
log "INFO" "You may need to configure your firewall to allow access to port $PORT"
fi fi
# Reload systemd # Reload systemd

View File

@ -1,6 +1,6 @@
{ {
"name": "transmission-rss-manager", "name": "transmission-rss-manager",
"version": "2.0.1", "version": "2.0.0",
"description": "A comprehensive web-based tool to automate and manage your Transmission torrent downloads with RSS feed integration and intelligent media organization", "description": "A comprehensive web-based tool to automate and manage your Transmission torrent downloads with RSS feed integration and intelligent media organization",
"main": "server.js", "main": "server.js",
"scripts": { "scripts": {