#!/usr/bin/env python3
# Copyright (c) 2020 AT&T Intellectual Property.  All rights reserved.
#
# SPDX-License-Identifier: GPL-2.0-only
#

import json
import argparse
import ipaddress
import subprocess
from vrfmanager import VrfManager

def localAddrs(vrf, dint, af):
    out = {}

    ipcmd = ["/sbin/ip", "--json", "-o", "address", "show"]
    if vrf:
        ipcmd += ["vrf", f"vrf{vrf}"]

    cout = subprocess.check_output(ipcmd)
    ip = json.loads(cout)
    for i in ip:
        for dict in i["addr_info"]:
            if dict["scope"] != "global":
                continue
            if dict["family"] != af:
                continue
            if dint.get(dict["dev"], "") != vrf:
                continue
            prefix = dict["local"] + "/" + str(dict["prefixlen"])
            out[dict["dev"]] = prefix

    return out

def v4LocalAddrs(vrf, dint):
    return localAddrs(vrf, dint, "inet")

def v6LocalAddrs(vrf, dint):
    return localAddrs(vrf, dint, "inet6")

def lookupVrf(lookupIntf):
    out = {}

    for vrf in VrfManager().get_vrfs():
        for i in vrf.interfaces:
            out[i] = vrf.name

    return out.get(lookupIntf, ""), out

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--prefix', dest='prefix', required=True)
    parser.add_argument('-i', '--interface', dest='intf', required=True)
    args = parser.parse_args()

    naddr = ipaddress.ip_network(args.prefix, strict=False)

    vrf, dint = lookupVrf(args.intf)

    if naddr.version == 4:
        vrfinfo = v4LocalAddrs(vrf, dint)
    elif naddr.version == 6:
        vrfinfo = v6LocalAddrs(vrf, dint)
    else:
        exit()

    for key in vrfinfo:
        caddr = ipaddress.ip_network(vrfinfo[key], strict=False)
        if naddr.overlaps(caddr):
            if key == args.intf and (naddr == caddr or naddr.version == 6):
                continue
            print(vrfinfo[key] + "(" + key + ")")

if __name__ == "__main__":
  main()
