#!/usr/bin/python3
#
#
# Development Order #5:
#
# This is the meat and bones of the tool, where the actual desired
# commands or operation will be run. The results are then recorded
# and added to the 'results' JSON data, which will then be sent
# back to the test. Both system and api are able to be used here.
#

import datetime
import subprocess as sp
import json
import sys
import time
import pscheduler

from common import *


# from stdin
input = pscheduler.json_load(exit_on_error=True)
spec = input['test']['spec']

# Take input from test spec
interface = spec.get('interface')

succeeded = False
error = ''
diags = []
ip_addr = ""

try:
    pscheduler.sleep_until(input['schedule']['start'])
except KeyError:
    pscheduler.fail("Unable to find start time in input")


# Release any existing lease

dhclient_release_args = ['sudo', 'dhclient', '-r', '-v', '-1']
if interface:
    dhclient_release_args.append(interface)
diags.append(' '.join(dhclient_release_args))

start_time = pscheduler.time_now()
status, stdout, stderr = pscheduler.run_program(dhclient_release_args, timeout=RELEASE_TIMEOUT)
end_time = pscheduler.time_now()
diags.append(stderr)
if status != 0:
    fail_json = {
        'succeeded': succeeded,
        'error': 'DHClient unable to release current lease.',
        'diags': '\n'.join(diags) }
    pscheduler.succeed_json(fail_json)


# Get a new lease

lease_timeout = pscheduler.iso8601_as_timedelta(spec.get('timeout', 'PT%dS' % DEFAULT_LEASE_TIMEOUT)).total_seconds()

dhclient_args = ['sudo', 'dhclient', '-v', '-1', '-timeout', str(lease_timeout)]

if interface:
    dhclient_args.append(interface)

diags.append(' '.join(dhclient_args))
diags.append('')

status, stdout, stderr = pscheduler.run_program(dhclient_args, timeout=lease_timeout)
diags.append(stderr)

if status != 0:
    fail_json = {
        'succeeded': succeeded,
        'error': 'DHClient unable to lease a new IP address.',
        'diags': '\n'.join(diags) }
    pscheduler.succeed_json(fail_json)

succeeded = True
# get ip address
if 'bound to' in stderr:
    stderr_list = stderr.split('bound to ')
    ip_info_list = stderr_list[1].split(' ')
    ip_addr = ip_info_list[0]

results = {
    'succeeded': succeeded,
    'result': {
        'schema': 1,
        'succeeded': succeeded,
        'time': pscheduler.timedelta_as_iso8601( end_time - start_time),
        'ip_address': ip_addr
    },
    'error': error,
    'diags': '\n'.join(diags) }

pscheduler.succeed_json(results)


