def __init__(self, args): " Load configuration. " super(Installer, self).__init__() assert args.PROJECT and args.branch and args.home self.args = args self['project'] = args.PROJECT self['branch'] = args.branch self['safe_branch'] = self['branch'].replace('/', '-').replace(' ', '-') self['makesite_home'] = args.home self['deploy_dir'] = mkdtemp() call("chmod a+rwx %s" % self.deploy_dir, shell=True) self.read([ settings.BASECONFIG, settings.HOMECONFIG, op.join(args.home, settings.CFGNAME), args.config ]) src = args.src or self['src'] assert src, "Not found the source. Use options '-s' or set 'src' in your ini files." self['src'] = src self.target_dir = getattr(args, 'deploy_dir', None) or op.join( args.home, self['project'], self['safe_branch']) self.templates = ['base'] self['src_user'] = self['src_user'] or environ.get('USER')
def uninstall(args): " Uninstall site. " site = find_site(args.PATH) site.run_remove() site.clean() if not listdir(op.dirname(site.deploy_dir)): call('sudo rm -rf %s' % op.dirname(site.deploy_dir))
def remove_template(self, template_name): assert template_name in self.templates, "Template not installed." print_header("Remove template: %s" % template_name) template = self._get_template_path(template_name) if not template.startswith(self.source_dir): for f in gen_template_files(template): call('sudo rm -f %s' % op.join(self.deploy_dir, f)) self.templates = filter(lambda x: x != template_name, self.templates) self['template'] = ','.join(self.templates) self.write()
def add_template(self, template_name): assert not template_name in self.templates, "Template already installed." print_header("Append template: %s" % template_name) deploy_tmpdir = mkdtemp() self.paste_template(template_name, deploy_dir=deploy_tmpdir) call('sudo cp -r %s/* %s' % (deploy_tmpdir, self.deploy_dir)) call('sudo chown %s:%s %s' % (self.site_user, self.site_group, self.deploy_dir)) self.templates.append(template_name) self['template'] = ','.join(self.templates) self.write()
def run_check(self, template_name=None, service_dir=None): " Run checking scripts. " print_header('Check requirements', sep='-') map(lambda cmd: call("bash %s" % cmd), self._gen_scripts( 'check', template_name=template_name, service_dir=service_dir)) return True
def clone_source(self): " Clone source and prepare templates " print_header('Clone src: %s' % self.src, '-') # Get source source_dir = self._get_source() # Append settings from source self.read(op.join(source_dir, settings.CFGNAME)) self.templates += (self.args.template or self.template).split(',') self.templates = OrderedSet(self._gen_templates(self.templates)) self['template'] = ','.join(str(x[0]) for x in self.templates) print_header('Deploy templates: %s' % self.template, sep='-') with open(op.join(self.deploy_dir, settings.TPLNAME), 'w') as f: f.write(self.template) with open(op.join(self.deploy_dir, settings.CFGNAME), 'w') as f: self['deploy_dir'], tmp_dir = self.target_dir, self.deploy_dir self.write(f) self['deploy_dir'] = tmp_dir # Create site site = Site(self.deploy_dir) # Prepare templates for template_name, template in self.templates: site.paste_template(template_name, template, tmp_dir) # Create site if self.args.info: print_header('Project context', sep='-') LOGGER.info(site.get_info(full=True)) return None # Check requirements call('sudo chmod +x %s/*.sh' % self.service_dir) site.run_check(service_dir=self.service_dir) # Save options site.write() return site
def _get_source(self): " Get source from CVS or filepath. " source_dir = op.join(self.deploy_dir, 'source') for tp, cmd in settings.SRC_CLONE: if self.src.startswith(tp + '+'): program = which(tp) assert program, '%s not found.' % tp cmd = cmd % dict(src=self.src[len(tp) + 1:], source_dir=source_dir, branch=self.branch) cmd = "sudo -u %s %s" % (self['src_user'], cmd) call(cmd, shell=True) self.templates.append('src-%s' % tp) break else: self.templates.append('src-dir') copytree(self.src, source_dir) return source_dir
def run_check(self, template_name=None, service_dir=None): " Run checking scripts. " print_header('Check requirements', sep='-') map( lambda cmd: call("bash %s" % cmd), self._gen_scripts('check', template_name=template_name, service_dir=service_dir)) return True
def build(self): print_header('Build site', sep='-') call('sudo mkdir -p %s' % op.dirname(self.target_dir)) call('sudo mv %s %s' % (self.deploy_dir, self.target_dir)) call('sudo chmod 0755 %s' % self.target_dir)
def clean(self): print_header('Delete %s' % self.get_name(), sep="-") call('sudo rm -rf %s' % self.deploy_dir)