#!/usr/bin/env python

r"""
Set the auto_boot policy according to the caller's wishes.
"""

import os
import sys

save_dir_path = sys.path.pop(0)

modules = ['gen_arg', 'gen_print', 'gen_valid', 'gen_misc', 'gen_cmd', 'gen_plug_in_utils', 'gen_call_robot']
for module in modules:
    exec("from " + module + " import *")

sys.path.insert(0, save_dir_path)


# Set exit_on_error for gen_valid functions.
set_exit_on_error(True)

parser = argparse.ArgumentParser(
    usage='%(prog)s [OPTIONS]',
    description="%(prog)s will set the auto_boot policy according to the"
        + " user's wishes.",
    formatter_class=argparse.RawTextHelpFormatter,
    prefix_chars='-+')


# Populate stock_list with options we want.
stock_list = [("test_mode", get_plug_default("test_mode", 0)),
              ("quiet", get_plug_default("quiet", 0)),
              ("debug", get_plug_default("debug", 0))]

AUTO_REBOOT_DISABLE = "1"


def validate_parms():

    r"""
    Validate program parameters, etc.  Return True or False (i.e. pass/fail) accordingly.
    """

    get_plug_vars()

    valid_value(AUTOBOOT_OPENBMC_HOST)
    global AUTO_REBOOT_DISABLE
    if pgm_name == "cp_cleanup":
        AUTO_REBOOT_DISABLE = 0
    else:
        valid_value(AUTO_REBOOT_DISABLE, valid_values=["0", "1"])
        AUTO_REBOOT_DISABLE = int(AUTO_REBOOT_DISABLE)


def main():

    gen_setup()

    set_term_options(term_requests='children')

    print_plug_in_header()

    if pgm_name == "cp_setup" or pgm_name == "cp_cleanup":
        exit_not_master()

    init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")

    lib_file_path = init_robot_file_path("lib/utils.robot")

    enable_auto_reboot = 1 - AUTO_REBOOT_DISABLE
    print_var(enable_auto_reboot)
    keyword_string = "Set Auto Reboot  ${%i}" % enable_auto_reboot

    cmd_buf = create_robot_cmd_string("extended/run_keyword.robot", OPENBMC_HOST, SSH_PORT, HTTPS_PORT,
                                      REST_USERNAME, REST_PASSWORD, keyword_string, lib_file_path, quiet,
                                      test_mode, debug, outputdir, output, log, report)
    if not robot_cmd_fnc(cmd_buf):
        print_error_report("Robot command execution failed.")
        exit(1)


main()
