55 lines
1.5 KiB
Python
55 lines
1.5 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()
|
|
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"]])
|