Files
nordvpn/ovpn_downloader.py

74 lines
2.9 KiB
Python

import os
import subprocess
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):
"""
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)
subprocess.run(["curl", "-s", "-L", "-o", f"{OVPN_DIR}/ovpn.zip", OVPN_ZIP_URL])
subprocess.run(["unzip", "-q", "-o", f"{OVPN_DIR}/ovpn.zip", "-d", OVPN_DIR])
os.remove(f"{OVPN_DIR}/ovpn.zip")
# Find all OVPN files
ovpn_files = [f for f in os.listdir(OVPN_DIR) if f.endswith(".ovpn")]
# Add new entries to the database
for filename in ovpn_files:
cursor.execute("SELECT 1 FROM ovpn_files WHERE file_name = %s", (filename,))
if cursor.fetchone() is None: # If no record found, insert a new one
cursor.execute("""
INSERT INTO ovpn_files (file_name, last_observed)
VALUES (%s, CURRENT_TIMESTAMP)
""", (filename,))
conn.commit()
# 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):
"""
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):
print(f"{filename} already exists. Skipping download.")
return True
url = OVPN_LEGACY_URL + filename
print(f"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"Downloaded {filename} from legacy URL.")
return True
elif response.status_code == 404:
print(f"{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:
print(f"Error downloading {filename}: {response.status_code}")
return False