#!/usr/bin/python3

import argparse
import os
import sys

import requests

import amt.client
import amt.hostdb
import amt.wsman

def parse_args():
    parser = argparse.ArgumentParser('amtctrl')
#                                      description=(
# """
# amtctrl acts of servers that you've registered with it to issue amt commands.

# amtctrl list - list all servers registered
# amtctrl add <name> <ip> <passwd> - register a server
# amtctrl rm <name> - unregister a server

# amtctrl <name> <command> - run an amt command on the server

# command is one of:

#   on - power on
#   off - power off
#   reboot - reboot
#   pxeboot - reboot the machine and pxeboot on the next reboot cycle
#   status - dump cim power status
# """
#     ))
    parser.add_argument('server', metavar='name',
                        help='')
    parser.add_argument('-p', '--prompt-pass',
                        dest='prompt', action='store_true',
                        default=False,
                        help='Prompt for password, bypass database')
    parser.add_argument('command', metavar='command', nargs='?',
                        help='')
    return parser.parse_known_args()[0]

def parse_args_add():
    parser = argparse.ArgumentParser('amtctrl')
    parser.add_argument('op', metavar='add',
                   help='')
    parser.add_argument('name', metavar='name',
                   help='')
    parser.add_argument('host', metavar='host',
                   help='')
    parser.add_argument('passwd', metavar='passwd',
                   help='')
    return parser.parse_args()

def parse_args_rm():
    parser = argparse.ArgumentParser('amtctrl')
    parser.add_argument('op', metavar='remove',
                   help='')
    parser.add_argument('name', metavar='name',
                   help='')
    return parser.parse_args()


def main():
    args = parse_args()
    # if the "server" name is reserve word, run that command
    db = amt.hostdb.HostDB()
    if args.server == 'list':
        return db.list_servers()
    elif args.server == 'add':
        add_args = parse_args_add()
        return db.add_server(add_args.name, add_args.host, add_args.passwd)
    elif args.server == 'rm':
        rm_args = parse_args_rm()
        return db.rm_server(rm_args.name)

    if args.prompt:
        host = args.server
        if sys.stdin.isatty():
            from getpass import getpass
            passwd = getpass()
        else:
            passwd = sys.stdin.readline().rstrip('\r\n')
    else:
        server = db.get_server(args.server)
        if not server:
            print("Server %s not found in hostdb" % args.server)
            return 1
        host = server['host']
        passwd = server['passwd']

    client = amt.client.Client(host, passwd)
    try:
        if args.command == "on":
            client.power_on()
        elif args.command == "off":
            client.power_off()
        elif args.command == "reboot":
            client.power_cycle()
        elif args.command == "pxeboot":
            client.pxe_next_boot()
            client.power_cycle()
        elif args.command == "status":
           print(amt.wsman.friendly_power_state(client.power_status()))
        elif args.command == "vnc":
             client.enable_vnc()
             print("VNC enabled on port 5900 with AMT password")
        elif args.command == "vncstatus":
             print(client.vnc_status())
        else:
            print(("Unknown command %s"
                   "try one of on, off, reboot, pxeboot, status, vnc, vncstatus")
                  % args.command)
    except requests.exceptions.HTTPError as e:
        print("Error: %s" % e)

if __name__ == "__main__":
    sys.exit(main())
