#!/usr/bin/python3

import sys
import json
import subprocess
import ipaddress

IN_AUTHDB = sys.argv[1]
OUT_AUTHDB = sys.argv[2] if len(sys.argv) > 2 else sys.argv[1]

def resolve_ip6_linklocal_target(target):
    if '%' not in target:
        return target
    
    parts = tuple(target.split('%'))
    if len(parts) != 2:
        return target
    
    if not parts[1].isdigit():
        return target
        
    try:
        ip6 = ipaddress.IPv6Address(parts[0])
        if not ip6.is_link_local:
            return target
        # we have (ip6 link local addr, iface-idx) tuple
        output = subprocess.run(['ip', '-j', 'link'], capture_output=True)
        for link in json.loads(output.stdout):
            if str(link['ifindex']) == parts[1]:
                return '{}%{}'.format(parts[0], link['ifname'])
    except:
        pass
    return target

newdb = {}
with open(IN_AUTHDB) as dbfile:
    db = json.load(dbfile)
    for target_name in db.keys():
        harmonized_name = resolve_ip6_linklocal_target(target_name)
        if target_name != harmonized_name and harmonized_name not in db:
            newdb[target_name] = db[target_name]
            newdb[harmonized_name] = db[target_name]
        else:
            newdb[target_name] = db[target_name]

with open(OUT_AUTHDB, 'w+') as dbfile:
    json.dump(newdb, dbfile, indent=2)

