Source code for s1crets.core
from __future__ import absolute_import
import importlib
DOCSTRINGS = {
'provider': 'provider (str): Secret provider (aws.sm|aws.ps)',
'path': 'path (str): path for the given secret',
'keypath': 'keypath (list): the key path for looking into a JSON secret'}
class DictQuery(dict):
def get(self, keys, default=None):
val = None
for key in keys:
if val:
if isinstance(val, list):
val = [v.get(key, default) if v else None for v in val]
else:
try:
val = val.get(key, default)
except AttributeError:
return default
else:
val = dict.get(self, key, default)
if val == default:
break
return val
def _get_provider(provider, **params):
m = importlib.import_module(name='.{}'.format(provider),
package='s1crets.providers')
return m.SecretProvider(**params)
def docstring_parameter(sub):
def dec(obj):
obj.__doc__ = obj.__doc__.format(**sub)
return obj
return dec
[docs]@docstring_parameter(DOCSTRINGS)
def get(provider='aws.sm', path=None, keypath=None, retry=3, timeout=5):
"""Get a secret from the given `provider`
Args:
{provider}
{path}
{keypath}
Returns:
secret: The returned secret, can be string, bytes or in case of JSON, a dictionary
"""
p = _get_provider(provider, retry=retry, timeout=timeout)
return p.get(path, keypath=keypath)
[docs]@docstring_parameter(DOCSTRINGS)
def path_exists(provider='aws.sm', path=None, keypath=None, retry=3, timeout=5):
"""Check whether the path exists in the secrets provider
Args:
{provider}
{path}
{keypath}
Returns:
secret: The returned secret, can be string, bytes or in case of JSON, a dictionary
"""
p = _get_provider(provider, retry=retry, timeout=timeout)
return p.path_exists(path, keypath=keypath)
[docs]@docstring_parameter(DOCSTRINGS)
def get_by_path(provider='aws.sm', path=None, retry=3, timeout=5):
"""Returns all secrets beneath a path (if the provider supports it)
Args:
{provider}
{path}
Returns:
secrets (list): List of returned secrets
"""
p = _get_provider(provider, retry=retry, timeout=timeout)
return p.get_by_path(path)
[docs]@docstring_parameter(DOCSTRINGS)
def update(provider='aws.sm', path=None, value=None, retry=3, timeout=5):
"""Updates secret with given value
Args:
{provider}
{path}
value (string, bytes): the value to be stored
Returns:
None
"""
p = _get_provider(provider, retry=retry, timeout=timeout)
return p.update(path, value)