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)
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
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