summaryrefslogtreecommitdiffstats
path: root/puppet-host-package
blob: 1914dc3c4354bf1d1068b808799bacb37af4dc65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/bin/env python
"""Create a host package for bootstrapping a puppet client."""

import os
import glob
import optparse
import puppethost

usage = '%prog [options] hostname [hostname ...]'
parser = optparse.OptionParser(usage=usage)
parser.defaults = puppethost.defaults
parser.add_option('-a', '--all', dest='allcerts', action='store_true',
                  help='Create packages for all signed certificates')
parser.add_option('-d', '--domain', dest='domain',
                  help='Domain append to non fqdn hostnames [%default]')
parser.add_option('-f', '--force', dest='force', action='store_true',
                  help='Overwrite existing certs, tarballs, and/or packages')
parser.add_option('--force-cert', dest='force_cert', action='store_true',
                  help='Overwrite existing certs')
parser.add_option('--force-tarball', dest='force_tarball', action='store_true',
                  help='Overwrite existing tarballs')
parser.add_option('--force-package', dest='force_package', action='store_true',
                  help='Overwrite existing packages')
parser.add_option('-r', '--rpmdir', dest='rpmdir', metavar='dir',
                  help='Directory where packages are stored [%default]')
parser.add_option('--release', dest='release', metavar='num',
                  help='Package release number [%default]')
parser.add_option('-s', '--ssldir', dest='ssldir', metavar='dir',
                  help='Directory where ssl certs are stored [%default]')
# FIXME improve the help string
parser.add_option('-S', '--dest-ssldir', dest='destssldir', metavar='dir',
                  help='Directory where ssl certs are packaged')
parser.add_option('-t', '--template', dest='template', metavar='file',
                  help='RPM spec file template [%default]')
opts, args = parser.parse_args()

if opts.force:
    opts.force_cert = True
    opts.force_tarball = True
    opts.force_package = True

opts.rpmdir = os.path.abspath(opts.rpmdir)
opts.ssldir = os.path.abspath(opts.ssldir)
if not opts.destssldir:
    opts.destssldir = opts.ssldir

if opts.allcerts:
    args = []
    for cert in glob.glob('%s/ca/signed/*.pem' % opts.ssldir):
        basename = os.path.basename(cert)
        # we need the private key as well as the cert
        if os.path.exists('%s/private_keys/%s' % (opts.ssldir, basename)):
            args.append(os.path.splitext(basename)[0])
    args.sort()

if not args:
    raise SystemExit(parser.print_usage())

for d in [opts.rpmdir, opts.ssldir]:
    if not os.path.isdir(d):
        raise SystemExit('%s does not exist (or is not a directory)' % d)

if not os.path.isfile(opts.template):
    raise SystemExit('Template file (%s) does not exist' % opts.template)

for hostname in args:
    client = puppethost.PuppetHost(hostname, opts.__dict__)

    cert = client.files['cert']

    if not os.path.exists(cert) or opts.force_cert:
        try: client.gencert()
        except puppethost.PuppetHostError, error:
            print error
            continue

    try: client.package()
    except Exception, error:
        print error
        continue