the-ephus

unRAID Script for ProtonVPN / qBittorent (u/the-ephus) - 20250722

Jul 22nd, 2025 (edited)
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 2.64 KB | Source Code | 0 0
  1. #!/bin/bash
  2.  
  3. # CONFIGURATION
  4. CONTAINER="qbittorrent" # exact name of the torrent container in unRAID
  5. LISTENING_PORT="6881" # port that the torrent software is expecting to listen on for P2P connections (found in webUI settings)
  6. WGTUNNEL="10.2.0.1" # Local tunnel network pool (change last number to 1). Provided in VPN provider's Wireguard configuration.
  7. LOGFILE="/var/log/natpmp_forward.log" # where the script logs will be stored - this script will create the file if needed. /var/log directory is stored in RAM and will not persist on reboot.
  8. LOG_RETENTION_DAY=3 # how often (in days) the log file is purged and a new one created
  9. INTERVAL=45 # How often this script loops, in seconds. Some VPN providers will only reserve a port for 60 seconds.
  10.  
  11. # Wait for container to initialize, helpful if script runs when array starts
  12. sleep 60
  13.  
  14. if ! docker exec "$CONTAINER" which natpmpc &>/dev/null; then
  15.     echo "natpmpc not found in container '$CONTAINER'. Exiting." >> "$LOGFILE"
  16.     exit 1
  17. fi
  18.  
  19. while true; do
  20.     mkdir -p "$(dirname "$LOGFILE")"
  21.    
  22.     # Rotate log if older than retention period
  23.     if [[ -f "$LOGFILE" ]]; then
  24.         FILE_AGE_DAYS=$(( ( $(date +%s) - $(stat -c %Y "$LOGFILE") ) / 86400 ))
  25.       if (( FILE_AGE_DAYS >= LOG_RETENTION_DAY )); then
  26.           rm -f "$LOGFILE"
  27.       fi
  28.     fi
  29.    
  30.     DATE_LINE="===== $(date) ====="
  31.     echo "$DATE_LINE"
  32.     echo "$DATE_LINE" >> "$LOGFILE"
  33.  
  34.     # Check if container is running
  35.     if ! docker inspect -f '{{.State.Running}}' "$CONTAINER" 2>/dev/null | grep -q true; then
  36.         echo "Container '$CONTAINER' is NOT running." | tee -a "$LOGFILE"
  37.         sleep "$INTERVAL"
  38.         continue
  39.     fi
  40.  
  41.     # Run natpmpc for TCP
  42.     TCP_OUTPUT=$(docker exec "$CONTAINER" natpmpc -a 0 "$LISTENING_PORT" tcp 60 -g "$WGTUNNEL" 2>&1)
  43.     echo "TCP Mapping Output:" >> "$LOGFILE"
  44.     echo "$TCP_OUTPUT" >> "$LOGFILE"
  45.     echo "" >> "$LOGFILE"
  46.  
  47.     # Run natpmpc for UDP
  48.     UDP_OUTPUT=$(docker exec "$CONTAINER" natpmpc -a 0 "$LISTENING_PORT" udp 60 -g "$WGTUNNEL" 2>&1)
  49.     echo "UDP Mapping Output:" >> "$LOGFILE"
  50.     echo "$UDP_OUTPUT" >> "$LOGFILE"
  51.     echo "" >> "$LOGFILE"
  52.    
  53.     # Extract mapped port
  54.     MAPPED_PORT=$(echo "$UDP_OUTPUT" | grep -oP 'Mapped public port \K[0-9]+' | tail -n1)
  55.  
  56.      if [[ -z "$MAPPED_PORT" || ! "$MAPPED_PORT" =~ ^[0-9]+$ ]]; then
  57.         echo "Failed to map port or retrieve mapped port. Check natpmpc output above." | tee -a "$LOGFILE"
  58.         echo "" >> "$LOGFILE"
  59.     else
  60.         echo "VPN port mapped successfully: $MAPPED_PORT to $LISTENING_PORT" | tee -a "$LOGFILE"
  61.         echo "" >> "$LOGFILE"
  62.     fi
  63.    
  64.     sleep "$INTERVAL"
  65.  
  66. done
Add Comment
Please, Sign In to add comment