94 lines
2.0 KiB
Python
Executable File
94 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import argparse
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
|
|
WG_DIR = Path("/etc/wireguard")
|
|
WG0 = WG_DIR / "wg0.conf"
|
|
|
|
|
|
def require_root():
|
|
if os.geteuid() != 0:
|
|
print("ERROR: run as root (sudo).", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
|
|
def run(cmd, check=True, capture=False):
|
|
return subprocess.run(
|
|
cmd,
|
|
check=check,
|
|
text=True,
|
|
stdout=subprocess.PIPE if capture else None,
|
|
stderr=subprocess.PIPE if capture else None,
|
|
)
|
|
|
|
|
|
def backup_if_exists(p: Path):
|
|
if p.exists():
|
|
ts = datetime.now().strftime("%Y-%m-%d_%H%M%S")
|
|
b = p.with_name(p.name + f".bak.{ts}")
|
|
shutil.copy2(p, b)
|
|
|
|
|
|
def cmd_install(src: str):
|
|
srcp = Path(src)
|
|
if not srcp.exists():
|
|
raise RuntimeError(f"Missing source config: {srcp}")
|
|
WG_DIR.mkdir(parents=True, exist_ok=True)
|
|
os.chmod(WG_DIR, 0o700)
|
|
backup_if_exists(WG0)
|
|
shutil.copy2(srcp, WG0)
|
|
os.chmod(WG0, 0o600)
|
|
os.chown(WG0, 0, 0)
|
|
print(f"OK: installed {WG0}")
|
|
|
|
|
|
def cmd_up():
|
|
run(["wg-quick", "up", "wg0"], check=True)
|
|
|
|
|
|
def cmd_down():
|
|
run(["wg-quick", "down", "wg0"], check=False)
|
|
|
|
|
|
def cmd_status():
|
|
run(["wg", "show"], check=False)
|
|
run(["ip", "a", "show", "wg0"], check=False)
|
|
|
|
|
|
def main():
|
|
require_root()
|
|
p = argparse.ArgumentParser(prog="wg_client.py")
|
|
sub = p.add_subparsers(dest="cmd", required=True)
|
|
|
|
i = sub.add_parser("install")
|
|
i.add_argument("config", help="Path to clientX.conf from server export")
|
|
|
|
sub.add_parser("up")
|
|
sub.add_parser("down")
|
|
sub.add_parser("status")
|
|
|
|
args = p.parse_args()
|
|
|
|
try:
|
|
if args.cmd == "install":
|
|
cmd_install(args.config)
|
|
elif args.cmd == "up":
|
|
cmd_up()
|
|
elif args.cmd == "down":
|
|
cmd_down()
|
|
elif args.cmd == "status":
|
|
cmd_status()
|
|
except Exception as e:
|
|
print(f"ERROR: {e}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|