# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. @template def keyfile(desc, help=None, callback=lambda x: x): help = help or ('Use the secret key contained in the given keyfile ' 'for %s requests' % desc) name = desc.lower().replace(' ', '-') no_key = callback('no-%s-key' % name) option('--with-%s-keyfile' % name, nargs=1, help=help) @depends('--with-%s-keyfile' % name) @checking('for the %s key' % desc, lambda x: x and x is not no_key) @imports(_from='__builtin__', _import='open') @imports(_from='__builtin__', _import='IOError') def keyfile(value): if value: try: with open(value[0]) as fh: result = fh.read().strip() if result: return callback(result) raise FatalCheckError("'%s' is empty." % value[0]) except IOError as e: raise FatalCheckError("'%s': %s." % (value[0], e.strerror)) return no_key return keyfile @template def simple_keyfile(desc): value = keyfile(desc) set_config('MOZ_%s_KEY' % desc.upper().replace(' ', '_'), value) @template def id_and_secret_keyfile(desc): def id_and_secret(value): if value.startswith('no-') and value.endswith('-key'): id = value[:-3] + 'clientid' secret = value elif ' ' in value: id, secret = value.split(' ', 1) else: raise FatalCheckError('%s key file has an invalid format.' % desc) return namespace( id=id, secret=secret, ) content = keyfile(desc, help='Use the client id and secret key contained ' 'in the given keyfile for %s requests' % desc, callback=id_and_secret) name = desc.upper().replace(' ', '_') set_config('MOZ_%s_CLIENTID' % name, delayed_getattr(content, 'id')) set_config('MOZ_%s_KEY' % name, delayed_getattr(content, 'secret'))