#!/usr/bin/env python3 """ =head1 NAME keystone_stats - monitor status of Keystone =head1 CONFIGURATION Needs following minimal configuration in plugin-conf.d/keystone: [keystone_*] user keystone =head1 AUTHORS Copyright 2012 - Mehdi Abaakouk =head1 MAGIC MARKERS #%# capabilities=autoconf #%# family=auto =cut """ import sys import traceback try: from keystone.common import utils from keystone import config from keystone import exception from keystone import identity except ImportError: successful_import = False else: successful_import = True stats = ['users', 'tenants'] def print_config(): print('graph_title Keystone Stats') print('graph_vlabel count') print('graph_args --base 1000 --lower-limit 0') print('graph_category auth') print('graph_scale no') print('graph_info This graph shows stats about keystone: ' + (', ').join(stats)) for field in stats: print('%s_enabled.label enabled %s' % (field, field)) print('%s_enabled.draw LINE2' % field) print('%s_enabled.info %s enabled' % (field, field)) print('%s_total.label total %s' % (field, field)) print('%s_total.draw LINE2' % field) print('%s_total.info %s total' % (field, field)) def get_status(): enabled = {} total = {} for k in stats: enabled[k] = 0 total[k] = 0 identity_api = identity.Manager() for user in identity_api.list_users(None): total['users'] += 1 if user['enabled']: enabled['users'] += 1 # Ldap and pam driver don't support get_all_tenants() # kvs and sql implement get_tenants() instead of get_all_tenants() # Whoo: None of backend implements the correct function tenants = [] for api_func in ['get_all_tenants', 'get_tenants']: try: tenants = getattr(identity_api, api_func)(None) except (exception.NotImplemented, NotImplementedError): pass for tenant in tenants: total['tenants'] += 1 if tenant['enabled']: enabled['tenants'] += 1 return {'enabled': enabled, 'total': total} def print_values(): stats = get_status() for state in stats.keys(): for (field, value) in stats[state].items(): print("%s_%s.value %s" % (field, state, value)) def load_conf(): config.CONF(config_files=[utils.find_config('keystone.conf')]) if __name__ == '__main__': if len(sys.argv) > 1: if sys.argv[1] == "config": print_config() elif sys.argv[1] == "autoconf": if not successful_import: print('no (failed import keystone module)') sys.exit(0) try: load_conf() identity.Manager() except Exception: print('no (failed to connect keystone backend: %s' % traceback.format_exc()) sys.exit(0) print('yes') elif successful_import: load_conf() print_values()