#!/usr/bin/env python # pylint: disable=C0103 # vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2010 United States Government as represented by the # Administrator of the National Aeronautics and Space Administration. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """Euca add-on to use ajax console""" import getopt import os import sys # If ../nova/__init__.py exists, add ../ to Python search path, so that # it will override what happens to be installed in /usr/(local/)lib/python... possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]), os.pardir, os.pardir)) if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): sys.path.insert(0, possible_topdir) import boto import nova from boto.ec2.connection import EC2Connection import euca2ools from euca2ools import Euca2ool, InstanceValidationError, Util usage_string = """ Retrieves a url to an ajax console terminal euca-get-ajax-console [-h, --help] [--version] [--debug] instance_id REQUIRED PARAMETERS instance_id: unique identifier for the instance show the console output for. OPTIONAL PARAMETERS """ # This class extends boto to add AjaxConsole functionality class NovaEC2Connection(EC2Connection): def get_ajax_console(self, instance_id): """ Retrieves a console connection for the specified instance. :type instance_id: string :param instance_id: The instance ID of a running instance on the cloud. :rtype: :class:`AjaxConsole` """ class AjaxConsole: def __init__(self, parent=None): self.parent = parent self.instance_id = None self.url = None def startElement(self, name, attrs, connection): return None def endElement(self, name, value, connection): if name == 'instanceId': self.instance_id = value elif name == 'url': self.url = value else: setattr(self, name, value) params = {} self.build_list_params(params, [instance_id], 'InstanceId') return self.get_object('GetAjaxConsole', params, AjaxConsole) pass def override_connect_ec2(aws_access_key_id=None, aws_secret_access_key=None, **kwargs): return NovaEC2Connection(aws_access_key_id, aws_secret_access_key, **kwargs) # override boto's connect_ec2 method, so that we can use NovaEC2Connection # (This is for Euca2ools 1.2) boto.connect_ec2 = override_connect_ec2 # Override Euca2ools' EC2Connection class (which it gets from boto) # (This is for Euca2ools 1.3) euca2ools.EC2Connection = NovaEC2Connection def usage(status=1): print usage_string Util().usage() sys.exit(status) def version(): print Util().version() sys.exit() def display_console_output(console_output): print console_output.instance_id print console_output.timestamp print console_output.output def display_ajax_console_output(console_output): print console_output.url def main(): try: euca = Euca2ool() except Exception, e: print e usage() instance_id = None for name, value in euca.opts: if name in ('-h', '--help'): usage(0) elif name == '--version': version() elif name == '--debug': debug = True for arg in euca.args: instance_id = arg break if instance_id: try: euca.validate_instance_id(instance_id) except InstanceValidationError: print 'Invalid instance id' sys.exit(1) try: euca_conn = euca.make_connection() except Exception, e: print e.message sys.exit(1) try: console_output = euca_conn.get_ajax_console(instance_id) except Exception, ex: euca.display_error_and_exit('%s' % ex) display_ajax_console_output(console_output) else: print 'instance_id must be specified' usage() if __name__ == "__main__": main()