| #!/bin/bash |
| # |
| # lib/databases/postgresql |
| # Functions to control the configuration and operation of the **PostgreSQL** database backend |
| |
| # Dependencies: |
| # |
| # - DATABASE_{HOST,USER,PASSWORD} must be defined |
| |
| # Save trace setting |
| _XTRACE_PG=$(set +o | grep xtrace) |
| set +o xtrace |
| |
| |
| MAX_DB_CONNECTIONS=${MAX_DB_CONNECTIONS:-200} |
| INSTALL_DATABASE_SERVER_PACKAGES=$(trueorfalse True INSTALL_DATABASE_SERVER_PACKAGES) |
| |
| register_database postgresql |
| |
| |
| # Functions |
| # --------- |
| |
| function get_database_type_postgresql { |
| echo postgresql |
| } |
| |
| # Get rid of everything enough to cleanly change database backends |
| function cleanup_database_postgresql { |
| stop_service postgresql |
| if is_ubuntu; then |
| # Get ruthless with mysql |
| apt_get purge -y postgresql* |
| return |
| elif is_fedora; then |
| uninstall_package postgresql-server |
| else |
| return |
| fi |
| } |
| |
| function recreate_database_postgresql { |
| local db=$1 |
| # Avoid unsightly error when calling dropdb when the database doesn't exist |
| psql -h$DATABASE_HOST -U$DATABASE_USER -dtemplate1 -c "DROP DATABASE IF EXISTS $db" |
| createdb -h $DATABASE_HOST -U$DATABASE_USER -l C -T template0 -E utf8 $db |
| } |
| |
| function _exit_pg_init { |
| sudo cat /var/lib/pgsql/initdb_postgresql.log |
| } |
| |
| function configure_database_postgresql { |
| local pg_conf pg_dir pg_hba check_role version |
| echo_summary "Configuring and starting PostgreSQL" |
| if is_fedora; then |
| pg_hba=/var/lib/pgsql/data/pg_hba.conf |
| pg_conf=/var/lib/pgsql/data/postgresql.conf |
| if ! sudo [ -e $pg_hba ]; then |
| trap _exit_pg_init EXIT |
| sudo postgresql-setup initdb |
| trap - EXIT |
| fi |
| elif is_ubuntu; then |
| version=`psql --version | cut -d ' ' -f3 | cut -d. -f1-2` |
| if vercmp $version '>=' 9.3; then |
| if [ -z "`pg_lsclusters -h`" ]; then |
| echo 'No PostgreSQL clusters exist; will create one' |
| sudo pg_createcluster $version main --start |
| fi |
| fi |
| pg_dir=`find /etc/postgresql -name pg_hba.conf|xargs dirname` |
| pg_hba=$pg_dir/pg_hba.conf |
| pg_conf=$pg_dir/postgresql.conf |
| else |
| exit_distro_not_supported "postgresql configuration" |
| fi |
| # Listen on all addresses |
| sudo sed -i "/listen_addresses/s/.*/listen_addresses = '*'/" $pg_conf |
| # Set max_connections |
| sudo sed -i "/max_connections/s/.*/max_connections = $MAX_DB_CONNECTIONS/" $pg_conf |
| # Do password auth from all IPv4 clients |
| sudo sed -i "/^host/s/all\s\+127.0.0.1\/32\s\+ident/$DATABASE_USER\t0.0.0.0\/0\tpassword/" $pg_hba |
| # Do password auth for all IPv6 clients |
| sudo sed -i "/^host/s/all\s\+::1\/128\s\+ident/$DATABASE_USER\t::0\/0\tpassword/" $pg_hba |
| restart_service postgresql |
| |
| # Create the role if it's not here or else alter it. |
| check_role=$(sudo -u root sudo -u postgres -i psql -t -c "SELECT 'HERE' from pg_roles where rolname='$DATABASE_USER'") |
| if [[ ${check_role} == *HERE ]];then |
| sudo -u root sudo -u postgres -i psql -c "ALTER ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" |
| else |
| sudo -u root sudo -u postgres -i psql -c "CREATE ROLE $DATABASE_USER WITH SUPERUSER LOGIN PASSWORD '$DATABASE_PASSWORD'" |
| fi |
| } |
| |
| function install_database_postgresql { |
| echo_summary "Installing postgresql" |
| local pgpass=$HOME/.pgpass |
| if [[ ! -e $pgpass ]]; then |
| cat <<EOF > $pgpass |
| *:*:*:$DATABASE_USER:$DATABASE_PASSWORD |
| EOF |
| chmod 0600 $pgpass |
| else |
| sed -i "s/:root:\w\+/:root:$DATABASE_PASSWORD/" $pgpass |
| fi |
| if [[ "$INSTALL_DATABASE_SERVER_PACKAGES" == "True" ]]; then |
| if is_ubuntu; then |
| install_package postgresql |
| elif is_fedora; then |
| install_package postgresql-server |
| if is_fedora; then |
| sudo systemctl enable postgresql |
| fi |
| else |
| exit_distro_not_supported "postgresql installation" |
| fi |
| fi |
| } |
| |
| function install_database_python_postgresql { |
| # Install Python client module |
| pip_install_gr psycopg2 |
| ADDITIONAL_VENV_PACKAGES+=",psycopg2" |
| } |
| |
| function database_connection_url_postgresql { |
| local db=$1 |
| echo "$BASE_SQL_CONN/$db?client_encoding=utf8" |
| } |
| |
| |
| # Restore xtrace |
| $_XTRACE_PG |
| |
| # Local variables: |
| # mode: shell-script |
| # End: |