Esempio n. 1
0
 def process_request(self, req):
     """Process AJAX request.  Args are:
     
       path - contents should be returned as JSON
       set_time - 0 (default) or 1 sets 'now' in contents to current epoch
     """
     try:
         progress = Progress(req.args['path'])
         data = progress.get()
         if int(req.args.get('restart', 0)) == 1:
             progress.restart()
             progress.error('')  # clear error
         elif int(req.args.get('stop', 0)) == 1:
             progress.kill()
             progress.error("Stopped on user request.")
         if int(req.args.get('set_time', 0)) == 1:
             data['now'] = time.time()
         msg = json.dumps(data)
         req.send_response(200)
         req.send_header('Content-Type', 'application/json')
     except Exception:
         import traceback
         msg = "Oops...\n" + traceback.format_exc() + "\n"
         req.send_response(500)
         req.send_header('Content-Type', 'text/plain')
     req.send_header('Content-Length', len(msg))
     req.end_headers()
     req.write(msg)
Esempio n. 2
0
    def _is_deploying(self, env):
        """Determines whether there's an active deployment for the given
        environment and if so returns its progress file, else False."""
        deploy_file = '/tmp/deploy-%s' % env
        if not os.path.exists(deploy_file):
            return False

        # extract progress file
        f = open(deploy_file, 'r')
        progress_file = f.read().strip()
        f.close()

        # check if progress file exists
        if not os.path.exists(progress_file):
            return False

        # check if done deploying
        if Progress(progress_file).is_done():
            return False
        return progress_file
Esempio n. 3
0
    def __init__(self, steps, title, description='', can_continue=False):
        # setup command line parsing
        parser = OptionParser()
        parser.add_option("-d",
                          "--daemonize",
                          default=False,
                          action="store_true")
        parser.add_option("--trac-base-url")
        parser.add_option("--progress-file")
        parser.add_option("--log-file")
        parser.add_option("--log-level", default=logging.DEBUG)
        parser.add_option("--chef-base-path")
        parser.add_option("--chef-boot-run-list", default=[], action='append')
        parser.add_option("--chef-boot-sudo",
                          default=False,
                          action="store_true")
        parser.add_option("--chef-boot-version")
        parser.add_option("--aws-key")
        parser.add_option("--aws-secret")
        parser.add_option("--aws-keypair")
        parser.add_option("--aws-keypair-pem")
        parser.add_option("--aws-username")
        parser.add_option("--aws-security-groups")
        parser.add_option("--rds-username")
        parser.add_option("--rds-password")
        parser.add_option("--databag")
        parser.add_option("--launch-data", default='{}', help="JSON dict")
        parser.add_option("--attributes", default='{}', help="JSON dict")
        parser.add_option("--started-by")
        parser.add_option("--notify-jabber")
        parser.add_option("--jabber-server")
        parser.add_option("--jabber-port")
        parser.add_option("--jabber-username")
        parser.add_option("--jabber-password")
        parser.add_option("--jabber-channel")
        (self.options, _args) = parser.parse_args()

        # setup logging (presumes something else will rotate it)
        self.log = logging.getLogger(self.__class__.__name__)
        self.log.setLevel(self.options.log_level)
        self.handler = logging.FileHandler(self.options.log_file)
        self.handler.setLevel(self.options.log_level)
        format = "%(asctime)s %(name)s[%(process)d] %(levelname)s: %(message)s"
        self.handler.setFormatter(logging.Formatter(format))
        self.log.addHandler(self.handler)

        # setup apis
        self.chefapi = Chef(self.options.chef_base_path,
                            self.options.aws_keypair_pem,
                            self.options.aws_username,
                            self.options.chef_boot_run_list,
                            self.options.chef_boot_sudo,
                            self.options.chef_boot_version, self.log)

        self.cloudapi = Aws(self.options.aws_key, self.options.aws_secret,
                            self.options.aws_keypair,
                            self.options.aws_security_groups,
                            self.options.rds_username,
                            self.options.rds_password, self.log)

        # prepare the data
        self.databag = self.options.databag
        self.launch_data = json.loads(self.options.launch_data)
        self.attributes = json.loads(self.options.attributes)

        # prepare progress
        command = ''
        if can_continue:
            command = ['/usr/bin/python'] + sys.argv
        self.pidfile = tempfile.NamedTemporaryFile(delete=False).name
        self.progress = Progress(self.options.progress_file,
                                 self.pidfile,
                                 steps,
                                 title,
                                 description, {'0': (time.time(), None)},
                                 started_by=self.options.started_by,
                                 command=command)
        self.progress.pidfile(self.pidfile)  # in case this is a restart