#!/usr/bin/python

import os
import sys
import yaml

def mkdirp(path):
    try:
        os.makedirs(path)
    except OSError as e:
        if e.errno != 17:
            raise

def makeboot_tree(distribution, profiledir):
    bootdir = os.path.join(profiledir, 'boot')
    efisrc = os.path.join(distribution, 'EFI')
    efidir = os.path.join(bootdir, 'efi/boot')
    mkdirp(efidir)
    initrfsdir = os.path.join(bootdir, 'initramfs')
    mkdirp(initrfsdir)
    for directory in os.walk(efisrc):
        for filename in directory[2]:
            if filename.lower() == 'bootx64.efi':
                srcfile = os.path.join(directory[0], filename)
                trgfile = os.path.join(efidir, 'bootx64.efi')
                os.link(srcfile, trgfile)
            elif filename.lower() == 'grubx64.efi':
                srcfile = os.path.join(directory[0], filename)
                trgfile = os.path.join(efidir, 'grubx64.efi')
                os.link(srcfile, trgfile)
    netbootdir = os.path.join(distribution, 'images/pxeboot')
    srckern = os.path.join(netbootdir, 'vmlinuz')
    srcinitramfs = os.path.join(netbootdir, 'initrd.img')
    trgkern = os.path.join(bootdir, 'kernel')
    trginitramfs = os.path.join(initrfsdir, 'initrd.img')
    os.link(srckern, trgkern)
    os.link(srcinitramfs, trginitramfs)
    trginitramfs = os.path.join(initrfsdir, 'site-initramfs.gz')
    os.link('/var/lib/confluent/public/site/site-initramfs.gz', trginitramfs)
    profileinfo = os.path.join(profiledir, 'profile.yaml')
    with open(profileinfo) as info:
        profile = yaml.safe_load(info)
    cfgfile = os.path.join(efidir, 'grub.cfg')
    with open(cfgfile, 'w') as grubcfg:
        grubcfg.write('set timeout=5\n')
        grubcfg.write("menuentry '{0}' {{\n".format(
            profile.get('label', 'Unknown')))
        grubcfg.write('    linuxefi /kernel {0}\n'.format(profile.get(
                     'kernelargs', 'quiet')))
        initrds = ' '.join(
            ['/initramfs/{0}'.format(x) for x in os.listdir(initrfsdir)])
        grubcfg.write('    initrdefi {0}\n}}'.format(initrds))
    #TODO: create the netboot grub.cfg, is there a way to use grub http
    # without putting the server in the cfg?
    # If server is omitted, value of environment variable ‘net_default_server’
    # is used


if __name__ == '__main__':
    makeboot_tree(sys.argv[1], sys.argv[2])