#!/usr/bin/python3
#
# Copyright (c) 2013 Alon Swartz <alon@turnkeylinux.org>
# Copyright (c) 2019 SUSE LLC
#
# This file is part of ec2metadata.
#
# ec2metadata is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 3 of the License, or (at your
# option) any later version.
#
"""
Query and display EC2 metadata related to the AMI instance

If no options are specified, all will be displayed.
"""

import sys
import getopt

import ec2metadata
import ec2metadata.ec2metautils as ec2metautils


def usage(options, e=None):
    if e:
        print("Error:", e, file=sys.stderr)

    print("Syntax: %s [--options]" % sys.argv[0])
    print(__doc__.strip())

    print("Options:")
    for opt in options:
        print("    --" + opt)

    sys.exit(1)


def main():
    api_arg_pos = None
    api_version = None
    if '-a' in sys.argv:
        api_arg_pos = sys.argv.index('-a')
    elif '--api' in sys.argv:
        api_arg_pos = sys.argv.index('--api')
    if api_arg_pos:
        api_version = sys.argv[api_arg_pos + 1].strip()
        del sys.argv[api_arg_pos + 1]
        del sys.argv[api_arg_pos]

    meta = None
    try:
        meta = ec2metadata.EC2Metadata()
    except ec2metadata.EC2MetadataError as e:
        print(e, file=sys.stderr)
        sys.exit(1)

    if api_version:
        try:
            meta.set_api_version(api_version)
        except ec2metadata.EC2MetadataError as e:
            print(e, file=sys.stderr)
            sys.exit(1)
    try:
        getopt_metaopts = meta.get_meta_data_options()
        getopt_metaopts.append('api')
        getopt_metaopts.append('help')
        getopt_metaopts.append('listapis')
        getopt_metaopts.append('output')
        getopt_metaopts.append('version')
        getopt_metaopts.append('xml')
        getopt_metaopts.sort()
        opts, args = getopt.gnu_getopt(sys.argv[1:], 'hlo:uvx', getopt_metaopts)
    except getopt.GetoptError as e:
        usage(getopt_metaopts, e)

    if len(opts) == 0:
        ec2metautils.display(meta, meta.get_meta_data_options(), prefix=True)
        return

    metaopts = []
    generate_xml = False
    output_file_path = None
    for opt, val in opts:
        if opt in ('-h', '--help'):
            usage(getopt_metaopts)
            sys.exit(0)
        elif opt in ('-l', '--listapis'):
            api_versions = meta.get_available_api_versions()
            print('Available API versions:')
            for ver in api_versions:
                print('    %s' % ver)
            sys.exit(0)
        elif opt in ('-o', '--output'):
            output_file_path = val
            # getopt swallows tha value if the long option is used
            if opt == '--output':
                output_file_path = sys.argv[sys.argv.index('--output') + 1]
            continue
        elif opt in ('-v', '--version'):
            ec2metautils.show_version()
            sys.exit(0)
        elif opt in ('-x', '--xml'):
            generate_xml = True
            continue

        metaopts.append(opt.replace('--', ''))

    if len(metaopts) == 0:
        metaopts = meta.get_meta_data_options()
    if output_file_path:
        try:
            if generate_xml:
                ec2metautils.write_xml_file(output_file_path, meta, metaopts)
            else:
                ec2metautils.write_file(output_file_path, meta, metaopts, True)
        except IOError as e:
            print(e, file=sys.stderr)
            sys.exit(1)
    else:
        if generate_xml:
            ec2metautils.display_xml(meta, metaopts)
        else:
            ec2metautils.display(meta, metaopts)


if __name__ == "__main__":
    main()
