diff --git a/nord-checker.py b/nord-checker.py index 40ec7ef..747d77c 100644 --- a/nord-checker.py +++ b/nord-checker.py @@ -9,7 +9,6 @@ from psql_utils import connect_to_database, should_skip_file, update_or_insert_i from ovpn_downloader import download_and_extract_ovpn_configs from openvpn_manager import establish_vpn_connection, is_vpn_active, disconnect_vpn, get_external_ip - # Variables CREDENTIAL_FILE = "nord.creds" OVPN_DIR = "/root/nordvpn/ovpn_configs/ovpn_tcp" @@ -41,7 +40,7 @@ except subprocess.CalledProcessError: # Download and extract OVPN configurations (using the function from ovpn_downloader.py) debug_print(f"{datetime.datetime.now()} [Main Script]: Downloading and extracting OVPN configurations...") -ovpn_files = download_and_extract_ovpn_configs() # The function now returns the shuffled list +ovpn_files = download_and_extract_ovpn_configs() total_files = len(ovpn_files) @@ -72,8 +71,6 @@ for OVPN_FILE in ovpn_files: username = f.readline().strip() password = f.readline().strip() - debug_print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Read credentials: username={username}") - # Establish VPN connection (capture stdout and stderr) openvpn_command = ["openvpn", "--config", f"{OVPN_DIR}/{OVPN_FILE}", "--auth-user-pass", CREDENTIAL_FILE, "--daemon", @@ -90,13 +87,30 @@ for OVPN_FILE in ovpn_files: if process.returncode != 0: print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Error starting OpenVPN connection:") print(stderr.decode()) - else: - debug_print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: OpenVPN output:") - debug_print(stdout.decode()) - # Wait for connection to establish + # 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...") - time.sleep(10) + max_attempts = 10 + attempt = 0 + backoff_time = 0 + while attempt < max_attempts: + try: + last_lines = subprocess.check_output(["tail", "-n", "10", LOG_FILE]).decode().strip() + if "Initialization Sequence Completed" in last_lines: + print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN connection established.") + break + elif "AUTH: Received control message: AUTH_FAILED" in last_lines: + backoff_time += 1 # Increment backoff time + if backoff_time >= 30: # If backoff reaches 30 seconds, skip + print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: Authentication failed. Skipping this OVPN file.") + continue # Skip to the next OVPN file + except subprocess.CalledProcessError: + pass + time.sleep(1) + attempt += 1 + else: + print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: VPN connection failed to establish (timeout).") + continue # Check if the VPN connection is active try: @@ -128,8 +142,8 @@ for OVPN_FILE in ovpn_files: except subprocess.CalledProcessError: print(f"{datetime.datetime.now()} [{FILE_NUM}/{total_files}] [{OVPN_FILENAME}]: No openvpn process found.") - # Wait for a random time between 8 and 30 seconds - sleep_time = random.randint(6, 8) + # Wait for a random time between 5 and 8 seconds + sleep_time = random.randint(5, 8) 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...") @@ -139,4 +153,7 @@ for OVPN_FILE in ovpn_files: # Close the database connection cursor.close() -conn.close() \ No newline at end of file +conn.close() + +# Close the log file +log_file.close() \ No newline at end of file