Source code for fact.credentials
from functools import lru_cache
from configparser import SafeConfigParser
from getpass import getpass
from simplecrypt import decrypt
from io import StringIO
from pkg_resources import resource_stream
from sqlalchemy import create_engine
import socket
import os
__all__ = ['get_credentials', 'create_factdb_engine']
@lru_cache(1)
[docs]def get_credentials():
'''
Get a SafeConfigParser instance with FACT credentials
On the first call, you will be prompted for the FACT password
The folling credentials are stored:
- telegram
- token
- database
- user
- password
- host
- database
- twilio
- sid
- auth_token
- number
use get_credentials().get(group, element) to retrieve elements
'''
if 'FACT_PASSWORD' in os.environ:
passwd = os.environ['FACT_PASSWORD']
else:
passwd = getpass('Please enter the current, universal FACT password: ')
with resource_stream('fact', 'credentials/credentials.encrypted') as f:
decrypted = decrypt(passwd, f.read()).decode('utf-8')
config = SafeConfigParser()
config.readfp(StringIO(decrypted))
return config
[docs]def create_factdb_engine(database=None):
'''
returns a sqlalchemy.Engine pointing to the factdata database
The different hostname on isdc machines is handled correctly.
'''
spec = 'mysql+pymysql://{user}:{password}@{host}/{database}'
creds = get_credentials()
config = dict(creds['database'])
if socket.gethostname().startswith('isdc'):
config['host'] = 'lp-fact'
if database is not None:
config['database'] = database
return create_engine(spec.format(**config))