# Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish, dis-
# tribute, sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject to the fol-
# lowing conditions:
#
# The above copyright notice and this permission notice shall be included
# in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
#
import os, sys, StringIO
import boto
import ConfigParser
from boto.utils import find_class
MetadataConfigPath = '/home/pyami/metadata.ini'
class PyamiConfig(ConfigParser.RawConfigParser):
def __init__(self, path=None, fp=None):
ConfigParser.RawConfigParser.__init__(self)
if path:
self.read(path)
if fp:
self.readfp(fp)
def get_instance(self, name, default=None):
try:
val = self.get('Instance', name)
except:
val = default
return val
def get_user(self, name, default=None):
try:
val = self.get('User', name)
except:
val = default
return val
def getint_user(self, name, default=0):
try:
val = self.getint('User', name)
except:
val = default
return val
def dump(self):
s = StringIO.StringIO()
self.write(s)
s.seek(0)
print s.read()
class Startup:
def read_metadata(self):
self.config = PyamiConfig(os.path.expanduser(MetadataConfigPath))
def get_script(self):
script_name = self.config.get_user('script_name')
if script_name:
c = boto.connect_s3(self.config.get_user('aws_access_key_id'),
self.config.get_user('aws_secret_access_key'))
script_name = script_name + '.py'
script_bucket = self.config.get_user('script_bucket')
if not script_bucket:
script_bucket = self.config.get_user('bucket_name')
bucket = c.get_bucket(script_bucket)
script = bucket.get_key(script_name)
print 'Fetching %s.%s' % (bucket.name, script.name)
script_path = os.path.join(self.config.get_user('working_dir'),
script_name)
script.get_contents_to_filename(script_path)
self.module_name = self.config.get_user('script_name')
sys.path.append(self.config.get_user('working_dir'))
else:
self.module_name = self.config.get_user('module_name')
def run_script(self):
debug = self.config.getint_user('debug')
# debug level greater than 1 means don't even startup the script
if debug > 1:
return
if self.module_name:
cls = find_class(self.module_name,
self.config.get_user('class_name'))
s = cls(self.config)
s.run()
def main(self):
self.read_metadata()
self.get_script()
self.run_script()
if __name__ == "__main__":
su = Startup()
su.main()
syntax highlighted by Code2HTML, v. 0.9.1