def install_supervisor(self, programs=None): if utils.PY3: return () if programs is None: programs = [] if 'CELERY_URL' in os.environ: if self.is_django: programs.insert(0, "celeryd = %s celeryd" % join(self.bin_dir, 'manage')) else: programs.insert(0, "celeryd = %s" % join(self.bin_dir, 'celeryd')) if programs: config = self.install_config('supervisor.conf', programs=programs) else: config = self.install_config('supervisor.conf') self.install_script( name='supervisor', eggs='supervisor\nmeld3', scripts='supervisorctl=pytheonctl', script_initialization=('import sys;' 'sys.argv[1:1] = ["-c", %r]') % config, arguments='sys.argv[1:]') self.install_script( name='supervisor', eggs='supervisor\nmeld3', scripts='supervisord=pytheond', script_initialization=('import sys;' 'sys.argv[1:] = ["-c", %r]') % config) # restart supervisor pid = join(self.run_dir, 'supervisord.pid') if os.path.isfile(pid): pid = int(open(pid).read().strip()) try: os.kill(pid, signal.SIGHUP) except OSError: # start deamon if process does not exist utils.call('bin/pytheond') return tuple()
def create(parser, options, args): """create your pytheon project""" binary = utils.vcs_binary() global_config = utils.user_config() if not os.path.isfile(global_config._filename): global_config.pytheon = dict( username=options.username or utils.get_input('Username'), ) global_config.write() rc = global_config.pytheon config = utils.project_config(filename=options.buildout) if not os.path.isfile(config._filename): if not options.project_name: options.project_name = utils.get_input('Project name', default=os.path.basename(os.getcwd())) config.deploy = dict( version='1', use='gunicorn', project_name=options.project_name, ) if options.project_name: config.deploy.project_name = options.project_name config.write() kw = dict(username=rc.username, project_name=config.deploy.project_name) if binary == 'git': remote = os.environ.get('PYTHEON_REMOTE', '[email protected]:%(project_name)s.git').rstrip('/') remote = remote % kw utils.call(binary, 'remote', 'add', 'pytheon', remote, silent=True) else: remote = os.environ.get('PYTHEON_REMOTE', '[email protected]/%(project_name)s').rstrip('/') remote = remote % kw filename = '.hg/hgrc' config = Config.from_file(filename) config.paths.pytheon = remote config.write() commit(binary, config._filename) return http.request('/v1/applications', name=config.deploy.project_name)
def deploy(parser, options, args, config): """Deploy current repository to pytheon""" binary = utils.vcs_binary() if binary == 'git': state = utils.call(binary, 'status', '-s', silent=True) else: state = utils.call(binary, 'status', silent=True) if state: parser.error('You have some uncommited changes. Deploy aborted.') for filename in ('buildout.cfg', 'deploy.ini'): if os.path.isfile(filename): break if binary == 'git': utils.call('git', 'push', 'pytheon', 'master') else: utils.call('hg', 'push', 'pytheon') log.info('Deploy success')
def admin(): root = os.path.join(os.getcwd(), 'root') parser.add_option("-i", "--interpreter", dest="interpreter", action="store", default=sys.executable, help='Default to: ' + sys.executable) parser.add_option("-d", "--deploy", dest="source", action="store", metavar='SOURCE', default=os.environ.get('SOURCE', None), help='Default to $SOURCE if exist.') parser.add_option("-b", "--branch", dest="branch", action="store", default=os.environ.get('BRANCH', None), help='Default to $BRANCH if exist') parser.add_option("-a", "--app-name", dest="app_name", action="store", default=None) parser.add_option("--destroy", dest="destroy", action="store") parser.add_option("--host", dest="host", action="append", default=os.environ.get('HOSTS', '').split(';')) parser.add_option("-r", "--root", dest="root", action="store", default=root, help='Default to %s' % root) parser.add_option("-e", "--eggs", dest="eggs", action="store", default=os.path.expanduser('~/eggs'), help='Default to: ' + os.path.expanduser('~/eggs')) parser.add_option("--develop", dest="develop", action="append", default=[], help="Testing only") parser.add_option("--develop-dir", dest="develop_dir", default=os.environ.get('DEVELOP_DIR', None), help=("Used for buildout:develop-dir. " "Default to $DEVELOP_DIR if exist")) (options, args) = parser.parse_args() if 'GIT_DIR' in os.environ: del os.environ['GIT_DIR'] if not options.root: parser.error('Invalid root option') root = utils.realpath(options.root) if not os.path.isdir(options.root): parser.error('Invalid root option') os.chdir(root) def guess_app(): for ext in ('.hg', '.git'): app_dirs = glob(join(root, '*', ext)) if len(app_dirs) == 1: app_dir = os.path.dirname(app_dirs[0]) return app_dir app_dir = guess_app() if options.destroy: if not app_dir: parser.error('No application in %s' % options.root) supervisor = join(app_dir, 'bin', 'supervisorctl') if os.path.isfile(supervisor): utils.call(supervisor, 'shutdown', silent=True) time.sleep(0.5) shutil.rmtree(options.root) sys.exit(0) if options.source: if app_dir and os.path.isdir(app_dir): shutil.rmtree(app_dir) if not options.source: parser.error('No source option') log.info(options.source) # .git url or local path are git repositories if options.source.endswith('.git') or options.source.startswith('/'): if options.app_name: utils.call('git', 'clone', '-q', options.source, options.app_name) else: utils.call('git', 'clone', '-q', options.source) app_dir = guess_app() log.info(app_dir) os.chdir(app_dir) if not options.branch: options.branch = 'master' utils.call('git', 'checkout', options.branch) else: if options.app_name: utils.call('hg', 'clone', '-q', options.source, options.app_name) else: utils.call('hg', 'clone', '-q', options.source) app_dir = guess_app() log.info(app_dir) os.chdir(app_dir) if options.branch and options.branch != 'master': # dont take care of hg branch for now pass elif app_dir is None: parser.error('You must have an existing repository or a deploy url') os.chdir(app_dir) app_name = os.path.basename(app_dir) if os.path.isfile('setup.py'): options.develop.insert(0, '.') for setup in glob(join(app_dir, '*', 'setup.py')): options.develop.append(os.path.dirname(setup)) for setup in glob(join(app_dir, 'src', '*', 'setup.py')): options.develop.append(os.path.dirname(setup)) var = utils.realpath(root, 'var', 'buildout') config = Config.from_template('pytheon.cfg') config.buildout['dump-picked-versions-file'] = join(root, 'etc', 'versions.cfg') config.buildout['eggs-directory'] = options.eggs or join(var, 'eggs') config.buildout['parts-directory'] = join(var, 'parts') config.buildout['develop-eggs-directory'] = join(var, 'develop-eggs') config.buildout.develop = options.develop config.deploy.recipe = 'pytheon.deploy' config.deploy['deploy-dir'] = root if options.develop_dir: config.buildout['develop-dir'] = options.develop_dir if options.host: config.deploy.host = options.host config.deploy.environ = ['PYTHEON=1', 'PRODUCTION=1'] + list(args) if os.path.isfile('requirements.txt'): config.buildout.requirements = 'requirements.txt' extends = [] for filename in ('buildout.cfg', 'versions.cfg', 'deploy-%s.ini' % app_name, 'deploy.ini'): filename = utils.realpath(os.getcwd(), filename) if os.path.isfile(filename): extends.append(filename) config.buildout.extends = extends buildout = 'pytheon.cfg' config.write(buildout) env = os.environ env.update(dict([v.split('=', 1) for v in args if '=' in v])) utils.buildout(options.interpreter, buildout, eggs=CONFIG.pytheon.eggs_dir, env=env) if os.path.isfile('post_install.sh'): lib_dir = join(root, 'lib') if os.path.isfile(os.path.join(lib_dir, 'environ.py')): execfile(os.path.join(lib_dir, 'environ.py')) utils.call('/bin/bash', 'post_install.sh', env=os.environ)
def commit(binary, filename): utils.call(binary, 'add', filename, silent=True) utils.call(binary, 'commit', filename, '-m', '"[pytheon] auto update %s"' % filename, silent=True)
def shell(parser, options, args, config): """Open a ssh shell on pytheon""" kw = dict(project_name=global_config.pytheon.project_name) utils.call('ssh', '%(project_name)[email protected]' % kw)