import os import zipfile import random import datetime import requests OVPN_DIR = "ovpn_configs" OVPN_ZIP_URL = "https://downloads.nordcdn.com/configs/archives/servers/ovpn.zip" OVPN_LEGACY_URL = "https://downloads.nordcdn.com/configs/files/ovpn_legacy/servers/" def download_and_extract_ovpn_configs(cursor, conn, debug_print=None): """ Downloads the OVPN ZIP archive, extracts its contents, adds new entries to the database, and cleans up. Returns a list of OVPN filenames that need to be checked. """ if not os.path.exists(OVPN_DIR): os.makedirs(OVPN_DIR) zip_file_path = os.path.join(OVPN_DIR, "ovpn.zip") try: # Download the ZIP file using requests debug_print(f"[Ovpn Downloader]: Downloading {OVPN_ZIP_URL}") response = requests.get(OVPN_ZIP_URL, stream=True) response.raise_for_status() # Raise an exception for bad status codes with open(zip_file_path, 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk) debug_print(f"[Ovpn Downloader]: Download complete. Extracting...") # Extract the ZIP file with zipfile.ZipFile(zip_file_path, 'r') as zip_ref: zip_ref.extractall(OVPN_DIR) debug_print(f"[Ovpn Downloader]: Extraction complete.") except requests.exceptions.RequestException as e: debug_print(f"[Ovpn Downloader]: Error downloading or extracting: {e}") return [] # Return an empty list if there's an error finally: # Clean up the ZIP file if os.path.exists(zip_file_path): os.remove(zip_file_path) # Fetch the list of VPN servers that need to be checked (last check older than 3 days) three_days_ago = datetime.datetime.now() - datetime.timedelta(days=3) cursor.execute("SELECT file_name FROM ovpn_files WHERE last_exit_ip_check < %s OR last_exit_ip_check IS NULL", (three_days_ago,)) ovpn_files_to_check = [row[0] for row in cursor.fetchall()] return ovpn_files_to_check def download_ovpn_if_needed(filename, cursor, conn, debug_print=None): """ Downloads the specified OVPN file from the legacy URL if it doesn't exist in the OVPN_DIR. Removes the entry from the database if the file returns a 404 error. Returns True if the file was downloaded or already exists, False if it was not found and removed from the database """ filepath = os.path.join(OVPN_DIR+"/ovpn_tcp/", filename) if os.path.exists(filepath): debug_print(f"[{filename}]: Skipping download, file already exists.") return True url = OVPN_LEGACY_URL + filename debug_print(f" [Ovpn Downloader]: Attempting to download {filename} from legacy URL...") response = requests.get(url) if response.status_code == 200: with open(filepath, 'wb') as f: f.write(response.content) print(f"{datetime.datetime.now()} [Ovpn Downloader]: from legacy URL.") return True elif response.status_code == 404: debug_print(f"[Ovpn Downloader]:{filename} not found on legacy URL: {filepath}. Removing from database.") # this is the updated line cursor.execute("DELETE FROM ovpn_files WHERE file_name = %s", (filename,)) conn.commit() return False else: debug_print(f"Error downloading {filename}: {response.status_code}") return False