def expand_into(self, rg): cmdline = ['/usr/bin/aptitude', 'install', '-y', '--', ] cmdline.extend(self.to_aptitude_list()) cmd = transition('Command', extra_env={ 'DEBIAN_FRONTEND': 'noninteractive', }, cmdline=cmdline) rg.add_transition(cmd)
def expand_into(self, rg): loc_ref = self.id_attrs['location'] loc_path = loc_ref.id_attrs['path'] run_file_path = loc_path + '/run' contents = self.wanted_attrs['contents'] present = self.wanted_attrs['present'] status = self.wanted_attrs['status'] if not present and status != 'down': raise ValueError(present, status) down_file_present = present and status == 'down' down_file = rg.add_resource(resource('PlainFile', path=loc_path+'/down', mode='0644', present=down_file_present, ), depends=(loc_ref, )) run_file = rg.add_resource(resource('PlainFile', path=run_file_path, mode='0755', present=present, contents=contents, ), depends=(down_file, )) if present: # We have no guarantee there is a runsv for us, # be lax with exit codes. cmd = {'up': 'start', 'down': 'force-shutdown', }[status] set_state = rg.add_transition(transition('Command', cmdline=['/usr/bin/sv', cmd, loc_path], expected_retcodes=(0, 1, ), ), depends=(run_file, ))
def expand_into(self, rg): name = self.id_attrs['name'] enabled = self.wanted_attrs['enabled'] apache2 = rg.add_to_top(resource('AptitudePackage', name='apache2.2-common', )) cmd = '/usr/sbin/a2%smod' % { True: 'en', False: 'dis', }[enabled] endis = rg.add_transition(transition('Command', cmdline=[cmd, name, ] ), depends=[apache2]) # We don't need to restart everytime, which takes some time. reload = rg.add_transition(transition('Command', cmdline=['/usr/sbin/invoke-rc.d', 'apache2', 'restart', ], ), depends=[endis], )
def expand_into(self, rg): p0, p1 = self.read_attrs()['present'], self.wanted_attrs['present'] if (p0, p1) == (False, True): tr = rg.add_transition(transition('Command', cmdline=['/usr/bin/gem', 'install', '--quiet', '--no-rdoc', '--no-ri', '--include-dependencies', '--version', self.id_attrs['version'], self.id_attrs['name'], ])) elif (p0, p1) == (True, False): tr = rg.add_transition(transition('Command', cmdline=['/usr/bin/gem', 'uninstall', '--quiet', self.id_attrs['name'], ]))
def command_trans(self, **kwargs): if 'username' not in kwargs: # The default admin user on debian kwargs['username'] = '******' e = kwargs.get('extra_env', {}) e.update(extra_env(self.id_attrs)) kwargs['extra_env'] = e return transition('Command', **kwargs)
def expand_into(self, rg): # XXX key mngmt source_path = self.id_attrs['source'].id_attrs['path'] dest_url = self.id_attrs['dest'] pkg = rg.add_resource(resource('AptitudePackage', name='duplicity', )) cmd = rg.add_transition(transition('Command', cmdline=['/usr/bin/duplicity', source_path, dest_url ] ), depends=[pkg])
def expand_into(self, rg): name = self.id_attrs['name'] enabled = self.wanted_attrs['enabled'] apache2 = rg.add_to_top(resource('AptitudePackage', name='apache2.2-common', )) cmd = '/usr/sbin/a2%smod' % { True: 'en', False: 'dis', }[enabled] endis = rg.add_transition(transition('Command', cmdline=[cmd, name, ] ), depends=[apache2])
def expand_into(self, rg): name = self.id_attrs['name'] present = self.wanted_attrs['present'] enabled = self.wanted_attrs['enabled'] hostname = self.wanted_attrs['hostname'] port = self.wanted_attrs['port'] contents = self.wanted_attrs['contents'] if not present and enabled: raise ValueError(present, enabled) fcontents = build_and_render(''' NameVirtualHost {{ hostname }}:{{ port }} <VirtualHost {{ hostname }}:{{ port }}> {{ contents }} </VirtualHost> ''', contents=contents, hostname=hostname, port=port).encode('utf8') apache2 = rg.add_to_top(resource('AptitudePackage', name='apache2.2-common', )) site_file = rg.add_resource(resource('PlainFile', path='/etc/apache2/sites-available/' + name, contents=fcontents, present=present, mode='0644', ), depends=[apache2]) cmd = '/usr/sbin/a2%ssite' % { True: 'en', False: 'dis', }[enabled] endis = rg.add_transition(transition('Command', cmdline=[cmd, name, ] ), depends=[site_file]) # We don't really need to reload everytime. reload = rg.add_transition(transition('Command', cmdline=['/usr/sbin/invoke-rc.d', 'apache2', 'reload', ], ), depends=[endis], )
def expand_into(self, rg): loc_ref = self.id_attrs['location'] # An alternative to valid_condition if not loc_ref.wanted_attrs['present']: raise ValueError pkg_ref = rg.add_to_top(resource('AptitudePackage', name='subversion')) repo_url = self.wanted_attrs['url'] path = loc_ref.id_attrs['path'] owner = loc_ref.wanted_attrs['owner'] co = rg.add_transition(transition('Command', username=owner, cmdline=['/usr/bin/svn', 'checkout', '--non-interactive', '--force', '--', repo_url, path, ]), depends=(pkg_ref, loc_ref, )) up = rg.add_transition(transition('Command', username=owner, cmdline=['/usr/bin/svn', 'update', '--non-interactive', '--force', '--', path, ]), depends=(co, ))
def test_gitosis(pub_file, user_name='git', user_home='/var/git'): with open(pub_file) as f: pub_file_s = f.read() pkg = rg.add_resource(resource('AptitudePackage', name='gitosis')) usr = rg.add_resource(resource('User', name=user_name, home=user_home, shell='/bin/sh')) rg.add_transition(transition('Command', username=user_name, extra_env={'HOME': user_home, }, cmdline=['/usr/bin/gitosis-init', ], cmdline_input=pub_file_s, unless=[ '/usr/bin/test', '-f', user_home+'/.gitosis.conf'], ), depends=(pkg, usr), )
def expand_into(self, rg): state0 = self.read_attrs() state1 = self.wanted_attrs if state0 == state1: return home = self.wanted_attrs['home'] shell = self.wanted_attrs['shell'] p0, p1 = state0['present'], state1['present'] if (p0, p1) == (False, False): return elif (p0, p1) == (True, True): if home == self.read_attrs()['home']: home = None if shell == self.read_attrs()['shell']: shell = None if (home, shell) == (None, None): return cmdline = ['/usr/sbin/usermod', ] elif (p0, p1) == (False, True): cmdline = ['/usr/sbin/adduser', '--system', '--disabled-password', ] elif (p0, p1) == (True, False): cmdline = ['/usr/sbin/deluser', ] else: assert False if p1: if home is not None: cmdline.extend(['--home', home]) if self.wanted_attrs['shell'] is not None: cmdline.extend(['--shell', shell]) cmdline.extend(['--', self.id_attrs['name']]) cmd = transition('Command', cmdline=cmdline) rg.add_transition(cmd)
def expand_into(self, rg): loc = self.id_attrs['location'] loc_path = loc.id_attrs['path'] if not loc.wanted_attrs['present']: raise ValueError rails_gem = rg.add_resource(resource('RubyGem', name='rails', version='2.1.2')) rake_pkg = rg.add_resource(resource('AptitudePackage', name='rake')) ruby_pgsql_pkg = rg.add_resource(resource('AptitudePackage', name='libpgsql-ruby')) ssl_pkg = rg.add_resource(resource('AptitudePackage', name='libopenssl-ruby1.8')) pkgs = rg.add_checkpoint( depends=(rails_gem, rake_pkg, ruby_pgsql_pkg, ssl_pkg)) name = self.id_attrs['name'] hostname = self.wanted_attrs['hostname'] cluster = self.wanted_attrs['cluster'] run_user = self.wanted_attrs['run_user'] run_user_name = run_user.id_attrs['name'] # XXX Need to give an ACL from db_maint_user to db_run_user. maint_user = self.wanted_attrs['maint_user'] maint_user_name = maint_user.id_attrs['name'] # Same name means 'local ident sameuser' auth will work. db_run_user = rg.add_resource(resource('PgUser', name=run_user_name, cluster=cluster, )) db_maint_user = rg.add_resource(resource('PgUser', name=maint_user_name, cluster=cluster, )) sv_dir_loc = rg.add_resource(resource('Directory', path=loc_path+'/service', mode='0755', ), depends=(loc, )) sv_dir_serv_loc = rg.add_resource(resource('Directory', path='/etc/service/' + name, mode='0755', )) sv_dir_service = rg.add_resource(resource('DirService', location=sv_dir_serv_loc, target_dir=sv_dir_loc, )) db_conf_tree = {} migs = [] # XXX Leads to conflicts env_ports = {'production': 4334, 'test': 5434, 'development': 6534, } for env in ('production', 'test', 'development', ): db_name = 'rails-%s-%s' % (name, env, ) db_conf_tree[env] = { 'adapter': 'postgresql', 'database': db_name, 'username': maint_user_name, } db = rg.add_resource(resource('PgDatabase', name=db_name, owner=db_maint_user, cluster=cluster, )) # Testing for db:version retcode doesn't work anymore. mig = rg.add_transition(transition('Command', cmdline=['/usr/bin/rake', 'db:migrate'], username=maint_user_name, extra_env={ 'RAILS_ENV': env, }, cwd=loc_path, ), depends=(maint_user, loc, pkgs, db, )) migs.append(mig) sv_loc_path = loc_path + '/service/' + env sv_loc = rg.add_resource(resource('Directory', path=sv_loc_path, mode='0755', ), depends=(sv_dir_loc, )) sv_contents = build_and_render('''#!/bin/sh cd ../.. # Rails messages and backtraces are normally on stderr. exec 2>&1 exec chpst -u {{ maint_user_name }} ./script/server webrick --environment {{ env }} --binding {{ binding_ip }} --port {{ port }} ''', maint_user_name=maint_user_name, env=env, binding_ip='127.0.0.1', port=env_ports[env], ).encode('utf8') sv = rg.add_resource(resource('Service', location=sv_loc, contents=sv_contents, status='down', )) tmp_dirs = rg.add_transition(transition('Command', cmdline=['/usr/bin/rake', 'tmp:create'], username=maint_user_name, cwd=loc_path, ), depends=(maint_user, loc, pkgs, )) db_conf_str = yaml.safe_dump(db_conf_tree, default_flow_style=False) db_conf_file = rg.add_resource(resource('PlainFile', path=loc_path + '/config/database.yml', contents=db_conf_str, mode='0644', ), depends=(loc, )) for mig in migs: rg.add_dependency(db_conf_file, mig) passenger_site = rg.add_resource(resource('PassengerSite', name=name, hostname=hostname, rails_dir=loc, ))
def fp_expand_into(self, rg): code = transition('PythonCode', function=self._realize) code = rg.add_transition(code)
def expand(rg): cluster = rg.add_resource(resource('PgCluster')) rails_sites = rg.add_resource(resource('Directory', path='/var/lib/rails-sites', mode='0755')) redmine = rg.add_resource(resource('Redmine', name='main', path='/var/lib/rails-sites/redmine', hostname='volutes.localdomain', cluster=cluster, ), depends=[rails_sites], ) # Lambdas won't do well in YAML if False: rg.add_transition(transition('PythonCode', function=lambda: sys.stderr.write('Fariboles!\n'))) cmd_tr = rg.add_transition(transition('Command', cmdline=['/bin/echo', 'Chatty command is chatty'])) LOGGER.debug(yaml.dump(cmd_tr)) LOGGER.debug(yaml.dump(yaml.load(yaml.dump(cluster)))) text = build_and_render('Hello {{ name }}!\n', name='Jane Doe') rg.add_resource(resource('PlainFile', path='/tmp/testfile', mode='0644', contents=text.encode('utf8'))) rg.add_resource(resource('AptitudePackage', name='python-networkx')) rg.add_resource(resource('User', name='zorglub', present=False, shell='/bin/true')) u = rg.add_resource(resource('PgUser', name='user-pfuuit', cluster=cluster)) d = rg.add_resource(resource('PgDatabase', owner=u, name='db-pfuuit', cluster=cluster)) dj_dir = rg.add_resource(resource('Directory', path='/tmp/django-queue-service', mode='0755', owner='nobody', group='nogroup')) svn_wc = rg.add_resource(resource('SvnWorkingCopy', location=dj_dir, url='http://django-queue-service.googlecode.com/svn/trunk/')) LOGGER.debug(yaml.dump(svn_wc)) def test_gitosis(pub_file, user_name='git', user_home='/var/git'): with open(pub_file) as f: pub_file_s = f.read() pkg = rg.add_resource(resource('AptitudePackage', name='gitosis')) usr = rg.add_resource(resource('User', name=user_name, home=user_home, shell='/bin/sh')) rg.add_transition(transition('Command', username=user_name, extra_env={'HOME': user_home, }, cmdline=['/usr/bin/gitosis-init', ], cmdline_input=pub_file_s, unless=[ '/usr/bin/test', '-f', user_home+'/.gitosis.conf'], ), depends=(pkg, usr), ) test_gitosis('g2p-moulinex.pub')