diff options
author | Soren Hansen <soren@canonical.com> | 2009-06-26 13:57:27 +0200 |
---|---|---|
committer | Soren Hansen <soren@canonical.com> | 2009-06-26 13:57:27 +0200 |
commit | b098228ab03003218b894855142dec9a8f406cfb (patch) | |
tree | efd52bd8ab547fd1b61406a68cb1eb5f0d2e2042 /ec2init | |
parent | bb5711688e7f6b2abe4e82a5b5233194a323b99d (diff) | |
download | vyos-cloud-init-b098228ab03003218b894855142dec9a8f406cfb.tar.gz vyos-cloud-init-b098228ab03003218b894855142dec9a8f406cfb.zip |
* Distutils added
* New ec2init python module introduced
* Lots and lots of stuff cleaned up and moved to ec2init python module.
* Started the move to Boto
Diffstat (limited to 'ec2init')
-rw-r--r-- | ec2init/__init__.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/ec2init/__init__.py b/ec2init/__init__.py new file mode 100644 index 00000000..3fa0de1d --- /dev/null +++ b/ec2init/__init__.py @@ -0,0 +1,93 @@ +# +# Common code for the EC2 initialisation scripts in Ubuntu +# Copyright 2009 Canonical Ltd. +# +# Author: Soren Hansen <soren@canonical.com> +# +# This program 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. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +# + +from configobj import ConfigObj +import os +import socket + +import boto.utils + +class EC2Init(): + api_ver = '2008-02-01' + filename = '/etc/ec2-init/ec2-config.cfg' + + def __init__(self): + self.meta_data_base_url = 'http://169.254.169.254/%s/meta-data' % self.api_ver + self.user_data_base_url = 'http://169.254.169.254/%s/user-data' % self.api_ver + self.config = ConfigObj(filename) + self.wait_for_metadata_service() + bailout_command = self.get_cfg_option_str('bailout_command') + if bailout_command: + os.system(bailout_command) + + def get_cfg_option_bool(self, key): + val = self.config[key] + if val.lower() in ['1', 'on', 'yes']: + return True + return False + + def get_cfg_option_str(self, key): + return config[key] + + def get_ssh_keys(self): + data = urllib.urlopen('%s/public-keys/' % self.meta_data_base_url).read() + keyids = [line.split('=')[0] for line in data.split('\n')] + return [urllib.urlopen('%s/public-keys/%d/openssh-key' % (self.meta_data_base_url, int(keyid))).read().rstrip() for keyid in keyids] + + def get_user_data(self): + return boto.utils.get_instance_userdata() + + def get_instance_metadata(self): + self.instance_metadata = getattr(self, 'instance_metadata', boto.utils.get_instance_metadata()) + return self.instance_metadata + + def get_ami_id(self): + return self.get_instance_metadata()['ami-id'] + + def get_availability_zone(self): + return self.get_instance_metadata()['availability-zone'] + + def get_hostname(self): + return self.get_instance_metadata()['local-hostname'] + + def get_mirror_for_availability_zone(self): + availability_zone = self.get_availability_zone() + if zone.startswith("us"): + return 'http://us.ec2.archive.ubuntu.com/ubuntu/' + elif zone.startswith("eu"): + return 'http://eu.ec2.archive.ubuntu.com/ubuntu/' + + return 'http://archive.ubuntu.com/ubuntu/' + + def wait_for_metadata_service(self): + timeout = 2 + # This gives us about half an hour before we ultimately bail out + for x in range(10): + s = socket.socket() + try: + address = '169.254.169.254' + port = 80 + s.connect((address,port)) + s.close() + return True + except socket.error, e: + time.sleep(timeout) + timeout = timeout * 2 + return False |