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
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
import getpass
|
import getpass
|
||||||
|
import functools
|
||||||
|
|
||||||
SECRET_PATH = '/etc/crans/secrets'
|
SECRET_PATH = '/etc/crans/secrets'
|
||||||
|
|
||||||
|
@ -45,9 +46,13 @@ except AttributeError:
|
||||||
logger.addHandler(handler)
|
logger.addHandler(handler)
|
||||||
|
|
||||||
class SecretNotFound(Exception):
|
class SecretNotFound(Exception):
|
||||||
|
"""Le secret n'a pas été trouvé"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class SecretForbidden(Exception):
|
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
|
pass
|
||||||
|
|
||||||
# Définitions de fonctions renvoyant un secret, si existant, en utilisant
|
# Définitions de fonctions renvoyant un secret, si existant, en utilisant
|
||||||
|
@ -65,9 +70,13 @@ def python_loader(name):
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise SecretForbidden()
|
raise SecretForbidden()
|
||||||
|
|
||||||
def single_file_loader(name):
|
def single_file_loader(name, secret_path=SECRET_PATH, fatal_io=True):
|
||||||
"""Charger depuis un fichier isolé appelé ``name``"""
|
"""Charger depuis un fichier isolé appelé ``name``,
|
||||||
path = os.path.join(SECRET_PATH, 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):
|
if not os.path.isfile(path):
|
||||||
raise SecretNotFound()
|
raise SecretNotFound()
|
||||||
try:
|
try:
|
||||||
|
@ -75,14 +84,10 @@ def single_file_loader(name):
|
||||||
result = source.read().strip()
|
result = source.read().strip()
|
||||||
return result
|
return result
|
||||||
except IOError:
|
except IOError:
|
||||||
raise SecretForbidden()
|
if fatal_io:
|
||||||
|
raise SecretForbidden()
|
||||||
def try_file_loader(name):
|
else:
|
||||||
"""Charge un fichier, mais sans échec si pas de droit de lecture"""
|
raise SecretNotFound()
|
||||||
try:
|
|
||||||
return single_file_loader(name)
|
|
||||||
except SecretForbidden:
|
|
||||||
raise SecretNotFound()
|
|
||||||
|
|
||||||
def get(name):
|
def get(name):
|
||||||
""" Récupère un secret. """
|
""" Récupère un secret. """
|
||||||
|
@ -90,6 +95,11 @@ def get(name):
|
||||||
logger.debug('%s (in %s) asked for %s' % (getpass.getuser(), prog, name))
|
logger.debug('%s (in %s) asked for %s' % (getpass.getuser(), prog, name))
|
||||||
|
|
||||||
loaders = [python_loader, single_file_loader]
|
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
|
notfound_error = None
|
||||||
|
|
||||||
for loader in loaders:
|
for loader in loaders:
|
||||||
|
|
|
@ -20,3 +20,7 @@ export DBG_FREERADIUS=1
|
||||||
|
|
||||||
# Imprime pour de vrai ?
|
# Imprime pour de vrai ?
|
||||||
export DBG_PRINTER=1
|
export DBG_PRINTER=1
|
||||||
|
|
||||||
|
# Un dossier où trouver une version alternative des secrets (fichier par
|
||||||
|
# fichier)
|
||||||
|
export DBG_SECRETS=/etc/crans/dbg_secrets/`whoami`/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue