#!/usr/bin/env python3
import subprocess, sys, json
ns=sys.argv[2] if len(sys.argv)>2 else 't3e25991'
def ip(*args):
    subprocess.run(['sudo','-n','ip',*args],check=True)
def inside(*args): ip('-n',ns,*args)
mode=sys.argv[1]
# Only objects owned by this fixture; recreating dummy interfaces controls kernel enumeration order.
links=json.loads(subprocess.check_output(['sudo','-n','ip','-n',ns,'-j','link']))
for obj in links:
    if obj['ifname'] in ['utun40','vpnbench','wlan0','lanfixture','tailscale0']:
        inside('link','del',obj['ifname'])
if mode=='init':
    ip('link','add','t3e25991h','type','veth','peer','name','transport0')
    ip('link','set','transport0','netns',ns)
    ip('addr','add','10.172.46.1/30','dev','t3e25991h')
    ip('addr','add','203.0.113.1/30','dev','t3e25991h')
    ip('link','set','t3e25991h','up')
    inside('addr','add','203.0.113.2/30','dev','transport0')
    inside('link','set','transport0','up')
    inside('route','add','10.172.46.0/30','dev','transport0')
    mode='mixed'
# transport is documentation-public so private candidates can be absent.
for name,addr in [('utun40','198.19.2.2/32'),('vpnbench','198.18.0.1/32')]:
    inside('link','add',name,'type','dummy');inside('addr','add',addr,'dev',name);inside('link','set',name,'up')
if mode in ['mixed','lan']:
    inside('link','add','wlan0','type','dummy');inside('addr','add','10.172.46.2/32','dev','wlan0');inside('link','set','wlan0','up')
if mode=='mixed':
    inside('link','add','lanfixture','type','dummy');inside('addr','add','192.168.1.42/32','dev','lanfixture');inside('link','set','lanfixture','up')
if mode in ['mixed','lan','tailnet']:
    inside('link','add','tailscale0','type','dummy');inside('addr','add','100.101.102.103/32','dev','tailscale0');inside('link','set','tailscale0','up')
print(subprocess.check_output(['sudo','-n','ip','-n',ns,'-j','addr'],text=True))
