from fabric.api import execute, hide, run, settings
from fabric.network import disconnect_all


def remote_exec(task):
    def wrapper(host, password=None, key_filename=None, *args, **kwargs):
        try:
            with settings(
                    #hide('everything'),
                    #warn_only=True,
                    always_use_pty=True,
                    linewise=True,
                    use_shell=False,
                    abort_on_prompts=True,
                    password=password,
                    key_filename=key_filename):
                if not host:
                    raise Exception('Host string (user@host:port) is required.')
                try:
                    return execute(task, host=host, *args, **kwargs)[host]
                except SystemExit, err:
                    raise Exception('Unwanted prompt or time out is detected.')
        finally:
            disconnect_all()
    wrapper.__name__ = task.__name__
    wrapper.__dict__ = task.__dict__
    wrapper.__doc__ = task.__doc__
    return wrapper


@remote_exec
def get_uname():
    return run('uname -a')


@remote_exec
def ilom_set_system_power_on():
    run('stop /System -script')


@remote_exec
def ilom_get_mac():
    return run('show /System ilom_mac_address')


if __name__ == '__main__':
    import logging
    import optparse

    parser = optparse.OptionParser('%prog [OPTS]')
    parser.add_option('-s', '--host',
                      help='ssh host string in format: user@host:port')
    parser.add_option('-p', '--password',
                      help='ssh user password.')
    parser.add_option('-k', '--key-filename',
                      help='ssh private key filename.')
    parser.add_option('-l', '--loglevel', default='info',
                      help='specify log level. Default: %default')
    opts, args = parser.parse_args()

    logging.basicConfig(level=logging.getLevelName(opts.loglevel.upper()))

    #print get_uname(host=opts.host, password=opts.password, key_filename=opts.key_filename)
    print ilom_get_mac(host=opts.host, password=opts.password, key_filename=opts.key_filename)
