secrets_new: dossier perso pour ses secrets
This commit is contained in:
parent
176540e3db
commit
8413169d43
2 changed files with 25 additions and 11 deletions
|
@ -29,6 +29,7 @@ import os
|
|||
import logging
|
||||
import logging.handlers
|
||||
import getpass
|
||||
import functools
|
||||
|
||||
SECRET_PATH = '/etc/crans/secrets'
|
||||
|
||||
|
@ -45,9 +46,13 @@ except AttributeError:
|
|||
logger.addHandler(handler)
|
||||
|
||||
class SecretNotFound(Exception):
|
||||
"""Le secret n'a pas été trouvé"""
|
||||
pass
|
||||
|
||||
class SecretForbidden(Exception):
|
||||
"""Un secret a été trouvé mais nous n'avons pas le droit de le lire.
|
||||
Lancer cette exception signifie que tout chargement ultérieur du secret
|
||||
par d'autres moyens est abandonné"""
|
||||
pass
|
||||
|
||||
# Définitions de fonctions renvoyant un secret, si existant, en utilisant
|
||||
|
@ -65,9 +70,13 @@ def python_loader(name):
|
|||
except ImportError:
|
||||
raise SecretForbidden()
|
||||
|
||||
def single_file_loader(name):
|
||||
"""Charger depuis un fichier isolé appelé ``name``"""
|
||||
path = os.path.join(SECRET_PATH, name)
|
||||
def single_file_loader(name, secret_path=SECRET_PATH, fatal_io=True):
|
||||
"""Charger depuis un fichier isolé appelé ``name``,
|
||||
Si ``fatal_io`` est à False, une erreur d'accès au fichier (droits)
|
||||
sera considérée comme un fichier absent, et le mécanisme pourra
|
||||
ainsi continuer avec d'autres loaders.
|
||||
"""
|
||||
path = os.path.join(secret_path, name)
|
||||
if not os.path.isfile(path):
|
||||
raise SecretNotFound()
|
||||
try:
|
||||
|
@ -75,14 +84,10 @@ def single_file_loader(name):
|
|||
result = source.read().strip()
|
||||
return result
|
||||
except IOError:
|
||||
raise SecretForbidden()
|
||||
|
||||
def try_file_loader(name):
|
||||
"""Charge un fichier, mais sans échec si pas de droit de lecture"""
|
||||
try:
|
||||
return single_file_loader(name)
|
||||
except SecretForbidden:
|
||||
raise SecretNotFound()
|
||||
if fatal_io:
|
||||
raise SecretForbidden()
|
||||
else:
|
||||
raise SecretNotFound()
|
||||
|
||||
def get(name):
|
||||
""" Récupère un secret. """
|
||||
|
@ -90,6 +95,11 @@ def get(name):
|
|||
logger.debug('%s (in %s) asked for %s' % (getpass.getuser(), prog, name))
|
||||
|
||||
loaders = [python_loader, single_file_loader]
|
||||
if os.getenv('DBG_SECRETS'):
|
||||
dbg_loader = functools.partial(single_file_loader,
|
||||
secret_path=os.getenv('DBG_SECRETS'),
|
||||
fatal_io=False)
|
||||
loaders.insert(0, dbg_loader)
|
||||
notfound_error = None
|
||||
|
||||
for loader in loaders:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue