~curtin-dev/curtin/trunk

« back to all changes in this revision

Viewing changes to tools/ssh-keys-list

  • Committer: Scott Moser
  • Date: 2017-12-20 17:33:03 UTC
  • Revision ID: smoser@ubuntu.com-20171220173303-29gha5qb8wpqrd40
README: Mention move of revision control to git.

curtin development has moved its revision control to git.
It is available at
  https://code.launchpad.net/curtin

Clone with
  git clone https://git.launchpad.net/curtin
or
  git clone git+ssh://git.launchpad.net/curtin

For more information see
  http://curtin.readthedocs.io/en/latest/topics/development.html

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python3
2
 
import argparse
3
 
import subprocess
4
 
import os.path
5
 
import sys
6
 
import json
7
 
VALID_MODES = (
8
 
    # one key per line
9
 
    'dump',
10
 
    # suitable for use in cloud-config
11
 
    'cloud-config',
12
 
    # suitable for use in cloud-localds meta-data
13
 
    'meta-data',
14
 
    # simple json list of strings keys
15
 
    'json'
16
 
)
17
 
 
18
 
 
19
 
def jdump(data):
20
 
    return json.dumps(data, indent=2, sort_keys=True, separators=(',', ': '))
21
 
 
22
 
 
23
 
def read_pubkeys():
24
 
    keys = []
25
 
    try:
26
 
        out = subprocess.check_output(['ssh-add', '-L'],
27
 
                                      stderr=subprocess.STDOUT)
28
 
        if isinstance(out, bytes):
29
 
            out = out.decode()
30
 
        keys += out.splitlines()
31
 
    except Exception:
32
 
        pass
33
 
 
34
 
    ssh_dir = os.path.expanduser('~' + os.path.sep + '.ssh')
35
 
    keyfiles = ['id_ecdsa.pub', 'id_ed25519.pub', 'id_rsa.pub']
36
 
    for f in [os.path.join(ssh_dir, f) for f in keyfiles]:
37
 
        if os.path.isfile(f):
38
 
            with open(f, "r") as fp:
39
 
                keys += fp.read().splitlines()
40
 
 
41
 
    return list(set(keys))
42
 
 
43
 
 
44
 
def format_pubkeys(mode, keys):
45
 
    if mode not in VALID_MODES:
46
 
        raise ValueError("unknown mode '%s'. Expected one of: %s" %
47
 
                         (mode, ' '.join(VALID_MODES)))
48
 
    if mode == 'dump':
49
 
        if len(keys) != 0:
50
 
            data = '\n'.join(keys) + "\n"
51
 
    elif mode == "cloud-config" or mode == "meta-data":
52
 
        data = ""
53
 
        if mode == "cloud-config":
54
 
            data = "#cloud-config\n"
55
 
            name = 'ssh_authorized_keys'
56
 
        else:
57
 
            name = 'public-keys'
58
 
        data += name + ": " + jdump(keys) + "\n"
59
 
    elif mode == "json":
60
 
        return jdump(keys) + "\n"
61
 
    return data
62
 
 
63
 
 
64
 
def main():
65
 
    parser = argparse.ArgumentParser(
66
 
        description='Dump users public ssh keys in a variety of formats')
67
 
    parser.add_argument('mode', nargs='?', help='output mode',
68
 
                        choices=VALID_MODES, default='dump')
69
 
    args = parser.parse_args()
70
 
    sys.stdout.write(format_pubkeys(args.mode, read_pubkeys()))
71
 
 
72
 
 
73
 
if __name__ == '__main__':
74
 
    sys.exit(main())