예제 #1
0
 def load_credential_file(self, path):
     """Load a credential file as is setup like the Java utilities"""
     c_data = StringIO()
     c_data.write("[Credentials]\n")
     for line in open(path, "r").readlines():
         c_data.write(
             line.replace("AWSAccessKeyId", "aws_access_key_id").replace(
                 "AWSSecretKey", "aws_secret_access_key"))
     c_data.seek(0)
     self.readfp(c_data)
예제 #2
0
파일: utils.py 프로젝트: delaballe/fcu-boto
class ShellCommand(object):
    def __init__(self, command, wait=True, fail_fast=False, cwd=None):
        self.exit_code = 0
        self.command = command
        self.log_fp = StringIO()
        self.wait = wait
        self.fail_fast = fail_fast
        self.run(cwd=cwd)

    def run(self, cwd=None):
        fcu_boto.log.info('running:%s' % self.command)
        self.process = subprocess.Popen(self.command,
                                        shell=True,
                                        stdin=subprocess.PIPE,
                                        stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE,
                                        cwd=cwd)
        if (self.wait):
            while self.process.poll() is None:
                time.sleep(1)
                t = self.process.communicate()
                self.log_fp.write(t[0])
                self.log_fp.write(t[1])
            fcu_boto.log.info(self.log_fp.getvalue())
            self.exit_code = self.process.returncode

            if self.fail_fast and self.exit_code != 0:
                raise Exception("Command " + self.command +
                                " failed with status " + self.exit_code)

            return self.exit_code

    def setReadOnly(self, value):
        raise AttributeError

    def getStatus(self):
        return self.exit_code

    status = property(getStatus, setReadOnly, None,
                      'The exit code for the command')

    def getOutput(self):
        return self.log_fp.getvalue()

    output = property(getOutput, setReadOnly, None,
                      'The STDIN and STDERR output of the command')
예제 #3
0
 def run(self):
     """
     Open a subprocess and run a command on the local host.
     
     :rtype: tuple
     :return: This function returns a tuple that contains an integer status
             and a string with the combined stdout and stderr output.
     """
     fcu_boto.log.info('running:%s' % self.command)
     log_fp = StringIO()
     process = subprocess.Popen(self.command,
                                shell=True,
                                stdin=subprocess.PIPE,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
     while process.poll() is None:
         time.sleep(1)
         t = process.communicate()
         log_fp.write(t[0])
         log_fp.write(t[1])
     fcu_boto.log.info(log_fp.getvalue())
     fcu_boto.log.info('output: %s' % log_fp.getvalue())
     return (process.returncode, log_fp.getvalue())
예제 #4
0
파일: task.py 프로젝트: delaballe/fcu-boto
 def _run(self, msg, vtimeout):
     fcu_boto.log.info('Task[%s] - running:%s' % (self.name, self.command))
     log_fp = StringIO()
     process = subprocess.Popen(self.command, shell=True, stdin=subprocess.PIPE,
                                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     nsecs = 5
     current_timeout = vtimeout
     while process.poll() is None:
         fcu_boto.log.info('nsecs=%s, timeout=%s' % (nsecs, current_timeout))
         if nsecs >= current_timeout:
             current_timeout += vtimeout
             fcu_boto.log.info('Task[%s] - setting timeout to %d seconds' % (self.name, current_timeout))
             if msg:
                 msg.change_visibility(current_timeout)
         time.sleep(5)
         nsecs += 5
     t = process.communicate()
     log_fp.write(t[0])
     log_fp.write(t[1])
     fcu_boto.log.info('Task[%s] - output: %s' % (self.name, log_fp.getvalue()))
     self.last_executed = self.now
     self.last_status = process.returncode
     self.last_output = log_fp.getvalue()[0:1023]
예제 #5
0
 def dump_safe(self, fp=None):
     if not fp:
         fp = StringIO()
     for section in self.sections():
         fp.write('[%s]\n' % section)
         for option in self.options(section):
             if option == 'aws_secret_access_key':
                 fp.write('%s = xxxxxxxxxxxxxxxxxx\n' % option)
             else:
                 fp.write('%s = %s\n' % (option, self.get(section, option)))
예제 #6
0
 def bundle(self,
            bucket=None,
            prefix=None,
            key_file=None,
            cert_file=None,
            size=None,
            ssh_key=None,
            fp=None,
            clear_history=True):
     iobject = IObject()
     if not bucket:
         bucket = iobject.get_string('Name of S3 bucket')
     if not prefix:
         prefix = iobject.get_string('Prefix for AMI file')
     if not key_file:
         key_file = iobject.get_filename('Path to RSA private key file')
     if not cert_file:
         cert_file = iobject.get_filename('Path to RSA public cert file')
     if not size:
         size = iobject.get_int('Size (in MB) of bundled image')
     if not ssh_key:
         ssh_key = self.server.get_ssh_key_file()
     self.copy_x509(key_file, cert_file)
     if not fp:
         fp = StringIO()
     fp.write('sudo mv %s /mnt/fcu_boto.cfg; ' % BotoConfigPath)
     fp.write('mv ~/.ssh/authorized_keys /mnt/authorized_keys; ')
     if clear_history:
         fp.write('history -c; ')
     fp.write(self.bundle_image(prefix, size, ssh_key))
     fp.write('; ')
     fp.write(self.upload_bundle(bucket, prefix, ssh_key))
     fp.write('; ')
     fp.write('sudo mv /mnt/fcu_boto.cfg %s; ' % BotoConfigPath)
     fp.write('mv /mnt/authorized_keys ~/.ssh/authorized_keys')
     command = fp.getvalue()
     print('running the following command on the remote server:')
     print(command)
     t = self.ssh_client.run(command)
     print('\t%s' % t[0])
     print('\t%s' % t[1])
     print('...complete!')
     print('registering image...')
     self.image_id = self.server.ec2.register_image(
         name=prefix,
         image_location='%s/%s.manifest.xml' % (bucket, prefix))
     return self.image_id
예제 #7
0
class ResponseGroup(xml.sax.ContentHandler):
    """A Generic "Response Group", which can
    be anything from the entire list of Items to
    specific response elements within an item"""
    def __init__(self, connection=None, nodename=None):
        """Initialize this Item"""
        self._connection = connection
        self._nodename = nodename
        self._nodepath = []
        self._curobj = None
        self._xml = StringIO()

    def __repr__(self):
        return '<%s: %s>' % (self.__class__.__name__, self.__dict__)

    #
    # Attribute Functions
    #
    def get(self, name):
        return self.__dict__.get(name)

    def set(self, name, value):
        self.__dict__[name] = value

    def to_xml(self):
        return "<%s>%s</%s>" % (self._nodename, self._xml.getvalue(),
                                self._nodename)

    #
    # XML Parser functions
    #
    def startElement(self, name, attrs, connection):
        self._xml.write("<%s>" % name)
        self._nodepath.append(name)
        if len(self._nodepath) == 1:
            obj = ResponseGroup(self._connection)
            self.set(name, obj)
            self._curobj = obj
        elif self._curobj:
            self._curobj.startElement(name, attrs, connection)
        return None

    def endElement(self, name, value, connection):
        self._xml.write(
            "%s</%s>" %
            (cgi.escape(value).replace("&amp;amp;", "&amp;"), name))
        if len(self._nodepath) == 0:
            return
        obj = None
        curval = self.get(name)
        if len(self._nodepath) == 1:
            if value or not curval:
                self.set(name, value)
            if self._curobj:
                self._curobj = None
        #elif len(self._nodepath) == 2:
        #self._curobj = None
        elif self._curobj:
            self._curobj.endElement(name, value, connection)
        self._nodepath.pop()
        return None