72 lines
2.1 KiB
Python
72 lines
2.1 KiB
Python
#!/usr/bin/env python3
|
|
from argparse import ArgumentParser
|
|
from os import environ
|
|
import shlex
|
|
import subprocess
|
|
import sys
|
|
from typing import List
|
|
from protonvpn_cli.cli_wrapper import CLIWrapper
|
|
from protonvpn_nm_lib.api import FeatureEnum
|
|
from protonvpn_nm_lib.core.servers.list import LogicalServer
|
|
|
|
cli = CLIWrapper()
|
|
|
|
if not cli.protonvpn.get_session().is_valid:
|
|
print("You are not logged in.", file=sys.stderr)
|
|
|
|
if (sys.__stdin__ != None) and sys.__stdin__.isatty():
|
|
print("Please log in to ProtonVPN", file=sys.stderr)
|
|
print("Username: " + environ["PVPN_USERNAME"], file=sys.stderr)
|
|
result = subprocess.run(["protonvpn-cli", "login", environ["PVPN_USERNAME"]])
|
|
|
|
if result.returncode != 0:
|
|
exit(result.returncode)
|
|
else:
|
|
exit(0)
|
|
else:
|
|
print("Please run this container interactively in order to log in.", file=sys.stderr)
|
|
exit(1)
|
|
|
|
parser = ArgumentParser()
|
|
|
|
args = sys.argv[1:]
|
|
|
|
if not args:
|
|
args = shlex.split(environ.get("PVPN_CMD_ARGS") or "")
|
|
|
|
for alias in [
|
|
["-s", "--streaming"],
|
|
["--sc"],
|
|
["--p2p"],
|
|
["--tor"]
|
|
]:
|
|
parser.add_argument(*alias, action="store_true")
|
|
|
|
group = parser.add_mutually_exclusive_group()
|
|
|
|
for alias in [
|
|
["-f", "--fastest"],
|
|
["-r", "--random"]
|
|
]:
|
|
group.add_argument(*alias, action="store_true")
|
|
|
|
parser.add_argument("--cc")
|
|
parsedArgs = parser.parse_args()
|
|
features: List[FeatureEnum] = list()
|
|
|
|
if parsedArgs.streaming:
|
|
features.append(FeatureEnum.STREAMING)
|
|
if parsedArgs.sc:
|
|
features.append(FeatureEnum.SECURE_CORE)
|
|
if parsedArgs.p2p:
|
|
features.append(FeatureEnum.P2P)
|
|
if parsedArgs.tor:
|
|
features.append(FeatureEnum.TOR)
|
|
|
|
def match(server: LogicalServer):
|
|
return (parsedArgs.cc is None or server.exit_country.lower() == parsedArgs.cc.lower()) and (
|
|
all(feature in server.features for feature in features))
|
|
|
|
matches = cli.protonvpn.get_session().servers.filter(match)
|
|
server = matches.get_fastest_server() if parsedArgs.fastest else matches.get_random_server()
|
|
subprocess.run(["protonwire", "connect", server.data["Domain"]])
|