#!/usr/bin/python
#
# Copyright (c) 2013 Alon Swartz <alon@turnkeylinux.org>
# Copyright (c) 2014 SUSE LLC, Robert Schweikert <rjschwei@suse.com>
#
# 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 >> sys.stderr, "Error:", e

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

    print >> sys.stdout, "Options:"
    for opt in options:
        print >> sys.stdout, "    --" + opt

    sys.exit(1)

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

    meta = None
    try:
        meta = ec2metadata.EC2Metadata()
    except ec2metadata.EC2MetadataError, e:
        print >> sys.stderr, e
        sys.exit(1)
        
    if apiVersion:
        try:
            meta.setAPIVersion(apiVersion)
        except ec2metadata.EC2MetadataError, e:
            print >> sys.stderr, e
            sys.exit(1)
    try:
        getopt_metaopts = meta.getMetaOptions()
        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:vx', getopt_metaopts)
    except getopt.GetoptError, e:
        usage(getopt_metaopts, e)

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

    metaopts = []
    genXML = False
    outFile = None
    for opt, val in opts:
        if opt in ('-h', '--help'):
            usage(getopt_metaopts)
            sys.exit(0)
        elif opt in ('-l', '--listapis'):
            apiVers = meta.getAvailableAPIVersions()
            print >> sys.stdout, 'Available API versions:'
            for ver in apiVers:
                print >> sys.stdout, '    %s' %ver
            sys.exit(0)
        elif opt in ('-o', '--output'):
            outFile = args[0]
            continue
        elif opt in ('-v', '--version'):
            ec2metautils.showVersion()
            sys.exit(0)
        elif opt in ('-x', '--xml'):
            genXML = True
            continue
            
        metaopts.append(opt.replace('--', ''))

    if len(metaopts) == 0:
        metaopts = meta.getMetaOptions()
    if outFile:
        try:
            if genXML:
                ec2metautils.writeXMLfile(outFile, meta, metaopts)
            else: 
                ec2metautils.writefile(outFile, meta, metaopts, True)
        except IOError as e:
           print >> sys.stderr, e
           sys.exit(1)
    else:
        if genXML:
            ec2metautils.displayXML(meta, metaopts)
        else:
            ec2metautils.display(meta, metaopts)

if __name__ == "__main__":
   main()
