summaryrefslogtreecommitdiffstats
path: root/roles/batcave/files/sync-openshift-keys.py
blob: 007be415ea89c073aa9e118433ffc98f04a34b36 (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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/python
# Copyright 2012  Patrick Uiterwijk <puiterwijk@fedoraproject.org>
# This file has been released as LGPLv3+, see COPYING for the complete license
import sys
import string
import ConfigParser
from argparse import ArgumentParser
from fedora.client import AccountSystem
from oshift_mod import Openshift
from getpass import getpass
import os

os.environ['OPENSHIFT_REST_API'] = '1.5'

def get_keys(host,user,passwd):
    os = Openshift(host=host,user=user,passwd=passwd)
    (resp, content) = os.keys_list()
    if resp != 200:
        print('ERROR! Result: %(resp)s' % {'resp': resp})
        sys.exit(1)
    return os.rest.response.json()['data']

def add_key(host,user,passwd,key_name,key_type,key_contents, verbose=False):
    if verbose:
        print('Adding key %(keyname)s' % {'keyname': key_name})
    os = Openshift(host=host,user=user,passwd=passwd)
    (resp, content) = os.key_add(name=key_name, type=key_type, key_str=key_contents)
    # 200 = ok, 201 = created, 422 = error in key format
    # The latest one is an error, but shouldn't break adding the rest of the keys
    if resp != 200 and resp != 201 and resp != 422:
        print('ERROR! Result: %(resp)s' % {'resp': resp})
        sys.exit(2)
    if verbose:
        print('Done')
    return os.rest.response.json()['data']

def remove_key(host,user,passwd,key_name, verbose=False):
    if verbose:
        print('Removing key %(keyname)s' % {'keyname': key_name})
    os = Openshift(host=host,user=user,passwd=passwd)
    (resp, content) = os.key_delete(key_name)
    if resp != 200:
        print 'ERROR! Result: %(resp)s' % {'resp': resp}
        sys.exit(3)
    if verbose:
        print('Done')
    return os.rest.response.json()['data']

def get_users_to_have_access(fas, groups):
    all_users = set()
    for group in groups:
        new_users = fas.group_members(group)
        for new_user in new_users:
            all_users.add(new_user['username'])
    return all_users

def get_users_ssh_keys(fas, users):
    keys = {}
    user_data = fas.user_data()
    for userid in user_data.keys():
        if user_data[userid]['username'] in users:
            if user_data[userid]['ssh_key']:
                contents = user_data[userid]['ssh_key']
                if contents.split(' ') > 1:
                    key_type = contents.split(' ')[0]
                    key_contents = contents.split(' ')[1]
                    keys[user_data[userid]['username']] = {'type': key_type, 
                                                       'contents': key_contents,
                                                       'username': user_data[userid]['username']}
    return keys

def get_keys_to_remove(keys_in_openshift, keys_in_fas):
    keys_to_remove = set()
    for key in keys_in_openshift:
        keys_to_remove.add(key['name'])
        for key_in_fas in keys_in_fas:
            if keys_in_fas[key_in_fas]['contents'] == key['content']:
                keys_to_remove.remove(key['name'])
    return keys_to_remove

def get_keys_to_add(keys_in_openshift, keys_in_fas):
    usernames_to_add = set()
    for username in keys_in_fas:
        usernames_to_add.add(username)
        for key in keys_in_openshift:
            if key['content'] == keys_in_fas[username]['contents']:
                usernames_to_add.remove(username)
    keys_to_add = []
    for username in usernames_to_add:
        keys_to_add.append(keys_in_fas[username])
    return keys_to_add

def remove_keys(openshift_host, openshift_user, openshift_pass, to_remove, verbose=False):
    if verbose:
        print('Removing the following keys:')
        print(to_remove)
    for key in to_remove:
        remove_key(openshift_host, openshift_user, openshift_pass, key, verbose=verbose)
    if verbose:
        print('Done')

def add_keys(openshift_host, openshift_user, openshift_pass, to_add, prefix, verbose=False):
    if verbose:
        print('Adding the following keys:')
        print(to_add)
    for key in to_add:
        add_key(openshift_host, openshift_user, openshift_pass, '%(prefix)s%(username)s' % {'prefix': prefix, 'username': key['username']}, key['type'], key['contents'], verbose=verbose)
    if verbose:
        print('Done')

if __name__ == '__main__':
    parser = ArgumentParser()
    parser.add_argument('-config_file', help='The configuration file to use', default='/etc/sync-openshift-keys.conf')
    parser.add_argument('--verbose', '-v', help='Make the script more verbose', action='store_true')
    args = parser.parse_args()
    config = ConfigParser.ConfigParser()
    config.read(args.config_file)
    fas = AccountSystem(config.get('fas', 'url'), username=config.get('fas', 'user'), password=config.get('fas', 'pass'))
    fas.insecure = True
    if args.verbose:
        print('Getting users...')
    users = get_users_to_have_access(fas, string.split(config.get('general', 'groups'), ','))
    if args.verbose:
        print('Done: %s' % users)
        print('Getting keys in FAS...')
    keys_fas = get_users_ssh_keys(fas, users)
    if args.verbose:
        print('Done: %s')
        print('Getting keys in Openshift...')
    keys_openshift = get_keys(config.get('openshift', 'host'), config.get('openshift', 'user'), config.get('openshift', 'pass'))
    if args.verbose:
        print('Done')
        print('Getting keys to remove...')
    keys_to_remove = get_keys_to_remove(keys_openshift, keys_fas)
    if args.verbose:
        print('Done')
        print('Getting keys to add...')
    keys_to_add = get_keys_to_add(keys_openshift, keys_fas)
    if args.verbose:
        print('Done')
    remove_keys(config.get('openshift', 'host'), config.get('openshift', 'user'), config.get('openshift', 'pass'), keys_to_remove, verbose=args.verbose)
    add_keys(config.get('openshift', 'host'), config.get('openshift', 'user'), config.get('openshift', 'pass'), keys_to_add, config.get('general', 'keyname_prefix'), verbose=args.verbose)