Beispiel #1
0
 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)
Beispiel #2
0
  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, ))
Beispiel #3
0
 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],
     )
Beispiel #4
0
 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'],
         ]))
Beispiel #5
0
  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)
Beispiel #6
0
 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])
Beispiel #7
0
 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])
Beispiel #8
0
  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],
      )
Beispiel #9
0
  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, ))
Beispiel #10
0
  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),
      )
Beispiel #11
0
  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)
Beispiel #12
0
  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,
        ))
Beispiel #13
0
 def fp_expand_into(self, rg):
   code = transition('PythonCode', function=self._realize)
   code = rg.add_transition(code)
Beispiel #14
0
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')