update ovpn downloader to handle missing files.
This commit is contained in:
@@ -6,7 +6,7 @@ import datetime
|
||||
import re
|
||||
import sys
|
||||
from psql_utils import connect_to_database, update_or_insert_ip
|
||||
from ovpn_downloader import download_and_extract_ovpn_configs
|
||||
from ovpn_downloader import download_and_extract_ovpn_configs, download_ovpn_if_needed
|
||||
from openvpn_manager import establish_vpn_connection, is_vpn_active, disconnect_vpn, get_external_ip
|
||||
|
||||
# Variables
|
||||
@@ -67,7 +67,7 @@ ovpn_files_to_check = download_and_extract_ovpn_configs(cursor, conn)
|
||||
total_files = len(ovpn_files_to_check)
|
||||
|
||||
debug_print(f"{datetime.datetime.now()} [Main Script]: Found {total_files} OVPN files to check.")
|
||||
debug_print(ovpn_files_to_check) # Print the list of OVPN files
|
||||
#debug_print(ovpn_files_to_check) # Print the list of OVPN files
|
||||
|
||||
# Process each OVPN file
|
||||
FILE_NUM = 1
|
||||
@@ -76,55 +76,63 @@ for OVPN_FILE in ovpn_files_to_check:
|
||||
|
||||
debug_print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Processing OVPN file...")
|
||||
|
||||
# Check if the OVPN file exists, download if needed
|
||||
file_exists = download_ovpn_if_needed(OVPN_FILENAME, cursor, conn)
|
||||
|
||||
if not file_exists:
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Skipping, file not found and removed from database.")
|
||||
FILE_NUM += 1
|
||||
continue
|
||||
|
||||
# Read credentials
|
||||
with open(CREDENTIAL_FILE, 'r') as f:
|
||||
username = f.readline().strip()
|
||||
password = f.readline().strip()
|
||||
|
||||
# Establish VPN connection (capture stdout and stderr)
|
||||
max_retries = 3 # Maximum number of retries
|
||||
max_retries = 3
|
||||
retry_count = 0
|
||||
while retry_count < max_retries:
|
||||
openvpn_command = ["openvpn", "--config", f"{OVPN_DIR}/{OVPN_FILE}",
|
||||
"--auth-user-pass", CREDENTIAL_FILE, "--daemon",
|
||||
openvpn_command = ["openvpn", "--config", f"{OVPN_DIR}/{OVPN_FILE}",
|
||||
"--auth-user-pass", CREDENTIAL_FILE, "--daemon",
|
||||
"--log-append", LOG_FILE, "--verb", "3"]
|
||||
|
||||
debug_print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Executing OpenVPN command: {' '.join(openvpn_command)}")
|
||||
process = subprocess.Popen(openvpn_command,
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
process = subprocess.Popen(openvpn_command,
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
stdout, stderr = process.communicate(input=password.encode())
|
||||
|
||||
# Check for errors and print output
|
||||
if process.returncode != 0 or "AUTH_FAILED" in stderr.decode():
|
||||
if process.returncode != 0 or "Error opening configuration file" in stderr.decode() or "AUTH_FAILED" in stderr.decode():
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Error starting OpenVPN connection or authentication failed:")
|
||||
print(stderr.decode())
|
||||
|
||||
print(stderr.decode())
|
||||
|
||||
# Explicitly disconnect VPN if there was an error or auth failure
|
||||
disconnect_vpn()
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN disconnected (due to error or auth failure).")
|
||||
|
||||
if retry_count < max_retries - 1: # Retry if not the last attempt
|
||||
if retry_count < max_retries - 1 and "Error opening configuration file" not in stderr.decode():
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Retrying connection in 10 seconds...")
|
||||
time.sleep(10)
|
||||
retry_count += 1
|
||||
else:
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Max retries reached. Skipping this OVPN file.")
|
||||
break # Exit the retry loop if max retries reached
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Max retries reached or config file error. Skipping this OVPN file.")
|
||||
break
|
||||
else:
|
||||
break # Exit the retry loop if connection is successful
|
||||
break
|
||||
|
||||
# Wait for connection to establish (with backoff for auth failure)
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Waiting for VPN connection to establish...")
|
||||
max_attempts = 10
|
||||
attempt = 0
|
||||
backoff_time = 0
|
||||
with open(LOG_FILE, 'r') as f:
|
||||
with open(LOG_FILE, 'r') as f:
|
||||
while attempt < max_attempts:
|
||||
line = f.readline()
|
||||
if not line:
|
||||
time.sleep(1)
|
||||
time.sleep(1)
|
||||
attempt += 1
|
||||
continue
|
||||
|
||||
@@ -135,29 +143,26 @@ for OVPN_FILE in ovpn_files_to_check:
|
||||
backoff_time += 1
|
||||
if backoff_time >= 30:
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Authentication failed. Skipping this OVPN file.")
|
||||
break
|
||||
break
|
||||
|
||||
if attempt == max_attempts or backoff_time >= 30:
|
||||
if attempt == max_attempts or backoff_time >= 30:
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN connection failed to establish (timeout or auth failure).")
|
||||
|
||||
# Disconnect VPN
|
||||
# Disconnect VPN
|
||||
disconnect_vpn()
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN disconnected.")
|
||||
if not DEBUG_MODE:
|
||||
log_file.flush()
|
||||
|
||||
# Wait for a random time between 1 and 4 seconds
|
||||
sleep_time = random.randint(1, 4)
|
||||
sleep_time = random.randint(1, 4)
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Waiting for {sleep_time} seconds before the next connection...")
|
||||
time.sleep(sleep_time)
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Resuming...")
|
||||
if not DEBUG_MODE:
|
||||
log_file.flush()
|
||||
|
||||
continue # Skip to the next OVPN file
|
||||
|
||||
# Check if the VPN connection is active (using the function from openvpn_manager.py)
|
||||
# Check if the VPN connection is active (using the function from openvpn_manager.py)
|
||||
try:
|
||||
subprocess.run(["pgrep", "-f", OVPN_FILENAME], check=True, capture_output=True)
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN connection established.")
|
||||
|
||||
# Check external IP (with validation and retries)
|
||||
external_ip = get_external_ip()
|
||||
@@ -174,7 +179,7 @@ for OVPN_FILE in ovpn_files_to_check:
|
||||
except subprocess.CalledProcessError:
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN connection failed to establish.")
|
||||
|
||||
# Disconnect VPN
|
||||
# Disconnect VPN
|
||||
disconnect_vpn()
|
||||
print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN disconnected.")
|
||||
if not DEBUG_MODE:
|
||||
|
||||
Reference in New Issue
Block a user