-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathproxy_manager.py
More file actions
executable file
·137 lines (100 loc) · 3.78 KB
/
proxy_manager.py
File metadata and controls
executable file
·137 lines (100 loc) · 3.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python3
import argparse
import subprocess
import sys
from cli.commands import (
cmd_list_configs,
cmd_list_countries,
cmd_logs,
cmd_start,
cmd_status,
cmd_stop,
cmd_stop_all,
)
from core.config import OPENVPN_PASS, OPENVPN_USER
def check_dependencies():
"""Verify that required system tools are installed."""
for cmd in ["openvpn", "3proxy", "ip"]:
if subprocess.run(["which", cmd], stdout=subprocess.DEVNULL).returncode != 0:
print(f"Error: {cmd} is not installed.")
sys.exit(1)
def check_auth():
"""Check if OpenVPN credentials are provided in environment variables."""
if not OPENVPN_USER or not OPENVPN_PASS:
print("Error: OPENVPN_USER and OPENVPN_PASS environment variables must be set.")
print("Example: export OPENVPN_USER=your_user OPENVPN_PASS=your_pass")
sys.exit(1)
def main():
"""Main entry point for the Proxy Manager CLI."""
check_dependencies()
check_auth()
parser = argparse.ArgumentParser(description="Proxy Manager (OpenVPN + 3proxy)")
subparsers = parser.add_subparsers(dest="command")
# Start command
start_parser = subparsers.add_parser("start", help="Start a new proxy")
start_parser.add_argument("country", help="Country folder name")
start_parser.add_argument("config", help="Config file name (with or without .ovpn)")
start_parser.add_argument("port", type=int, help="Port for the proxy")
start_parser.add_argument("--label", "-l", help="Optional label for this proxy instance")
# Stop command
stop_parser = subparsers.add_parser("stop", help="Stop a proxy")
stop_parser.add_argument("port", type=int, help="Port of the proxy to stop")
# Stop-all command
subparsers.add_parser("stop-all", help="Stop all proxies and cleanup")
# List configs command
list_cfg_parser = subparsers.add_parser("list-configs", help="List available VPN configurations")
list_cfg_parser.add_argument("country", nargs="?", help="Country to list configs for")
# List countries command
subparsers.add_parser("list-countries", help="List available countries")
# Status command
subparsers.add_parser("status", help="Show running proxies")
# Logs command
log_parser = subparsers.add_parser("logs", help="Show OpenVPN logs for a port")
log_parser.add_argument("port", type=int, help="Port of the proxy")
args = parser.parse_args()
if args.command == "start":
cmd_start(args.country, args.config, args.port, args.label)
elif args.command == "stop":
cmd_stop(args.port)
elif args.command == "stop-all":
cmd_stop_all()
elif args.command == "list-configs":
cmd_list_configs(args.country)
elif args.command == "list-countries":
cmd_list_countries()
elif args.command == "status":
cmd_status()
elif args.command == "logs":
cmd_logs(args.port)
else:
parser.print_help()
def main_start():
sys.argv.insert(1, "start")
main()
def main_stop():
sys.argv.insert(1, "stop")
main()
def main_stop_all():
sys.argv.insert(1, "stop-all")
main()
def main_status():
sys.argv.insert(1, "status")
main()
def main_logs():
sys.argv.insert(1, "logs")
main()
def main_list_configs():
sys.argv.insert(1, "list-configs")
main()
def main_list_countries():
sys.argv.insert(1, "list-countries")
main()
def main_api():
"""Start the FastAPI server for managing proxies via REST API."""
import uvicorn
from core.config import API_HOST, API_PORT
print(f"Starting ProxyForFree API on {API_HOST}:{API_PORT}")
print(f"Docs available at http://{API_HOST}:{API_PORT}/docs")
uvicorn.run("api.app:app", host=API_HOST, port=API_PORT, reload=False)
if __name__ == "__main__":
main()