#!/usr/bin/python

import os
import re
import sys
import json
import pycurl
from StringIO import StringIO

def error(s):
    print s
    sys.exit(1)

pool_opt = "--ip-pool="
onboot_opt = "--onboot"
onboot = False

bgp_config_header_s = "filter packet {\n"

bgp_config_subnet_s = "  if net ~ %s then accept;\n"

bgp_config_footer_s = "}\n" \
"\n" \
"router id %s;\n" \
"\n" \
"protocol device {\n" \
"  scan time 5;\n" \
"}\n" \
"\n" \
"protocol kernel {\n" \
"    learn;\n" \
"    import filter packet;\n" \
"}\n" \
"\n" \
"protocol bgp {\n" \
"  export filter packet;\n" \
"  local as 65000;\n" \
"  neighbor %s as 65530;\n" \
"}\n"

metadata_url = "https://metadata.packet.net/metadata"
subnets = []
bird_config = "/etc/bird.conf"
bird_service = "bird.service"

for a in sys.argv:
    if a == onboot_opt:
        onboot = True

for a in sys.argv:
    if not a.startswith(pool_opt):
        continue
    subnets = re.sub("^%s" % pool_opt, "", a).split(',')
    break

if not subnets:
    error("Usage: %s [%s] %sSUBNET[,SUBNET]...\n" % (os.path.basename(sys.argv[0]), onboot_opt, pool_opt))

try:
    buffer = StringIO()
    c = pycurl.Curl()
    c.setopt(c.URL, metadata_url)
    c.setopt(c.WRITEFUNCTION, buffer.write)
    #c.setopt(c.VERBOSE, True)
    c.setopt(c.FOLLOWLOCATION, True)
    c.perform()
    c.close()
except:
    error("Failed to retrieve %s" % metadata_url)

buffer.seek(0)

try:
    data = json.load(buffer)
except:
    error("Failed to parse %s" % metadata_url)

buffer.close()

router = None
gateway = None
for n in [ n for n in data["network"]["addresses"] if n["public"] == False ]:
    router = n["address"]
    gateway = n["gateway"]
    break

if not router:
    error("Failed to get router IP")
if not gateway:
    error("Failed to get gateway IP")

with open(bird_config, "w") as f:
    f.truncate()
    f.write(bgp_config_header_s)
    for s in subnets:
        f.write(bgp_config_subnet_s % s)
    f.write(bgp_config_footer_s % (router, gateway))
    f.close()

if onboot:
    sys.exit(0)

for action in ("enable", "restart"):
    if os.system("/usr/bin/systemctl %s %s" % (action, bird_service)):
        error("Failed to %s %s" % (action, bird_service))

sys.exit(0)
