"""
PostgreSQL users and databases
==============================
"""
from fabric.api import cd, hide, run, settings
from fabtools.files import is_file
from fabtools.postgres import (
create_database,
create_user,
database_exists,
user_exists,
)
from fabtools.system import UnsupportedFamily, distrib_family
from fabtools.require.service import started, restarted
from fabtools.require.system import locale as require_locale
def _service_name(version=None):
if is_file('/etc/init.d/postgresql'):
return 'postgresql'
if version and is_file('/etc/init.d/postgresql-%s' % version):
return 'postgresql-%s' % version
with cd('/etc/init.d'):
with settings(hide('running', 'stdout')):
return run('ls postgresql-*').splitlines()[0]
[docs]def server(version=None):
"""
Require a PostgreSQL server to be installed and running.
::
from fabtools import require
require.postgres.server()
"""
family = distrib_family()
if family == 'debian':
_server_debian(version)
else:
raise UnsupportedFamily(supported=['debian'])
def _server_debian(version):
from fabtools.require.deb import package as require_deb_package
if version:
pkg_name = 'postgresql-%s' % version
else:
pkg_name = 'postgresql'
require_deb_package(pkg_name)
started(_service_name(version))
[docs]def user(name, password, superuser=False, createdb=False,
createrole=False, inherit=True, login=True, connection_limit=None,
encrypted_password=False):
"""
Require the existence of a PostgreSQL user.
The password and options provided will only be applied when creating
a new user (existing users will *not* be modified).
::
from fabtools import require
require.postgres.user('dbuser', password='somerandomstring')
require.postgres.user('dbuser2', password='s3cr3t',
createdb=True, create_role=True, connection_limit=20)
"""
if not user_exists(name):
create_user(name, password, superuser, createdb, createrole, inherit,
login, connection_limit, encrypted_password)
[docs]def database(name, owner, template='template0', encoding='UTF8',
locale='en_US.UTF-8'):
"""
Require a PostgreSQL database.
::
from fabtools import require
require.postgres.database('myapp', owner='dbuser')
"""
if not database_exists(name):
if locale not in run('locale -a').split():
require_locale(locale)
restarted(_service_name())
create_database(name, owner, template=template, encoding=encoding,
locale=locale)