forked from 0k/0k-charms
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
4.5 KiB
166 lines
4.5 KiB
# -*- mode: shell-script -*-
|
|
|
|
include pretty
|
|
|
|
export DB_NAME="postgres"
|
|
export DB_DATADIR=/var/lib/postgresql/data
|
|
export DB_PASSFILE=/root/.pgpass
|
|
|
|
|
|
is_db_locked() {
|
|
require lsof || apt-get install -y lsof </dev/null || {
|
|
err "Couldn't install command 'lsof'."
|
|
return 1
|
|
}
|
|
|
|
# "$lsof" +D "$host_db_working_dir" || true
|
|
|
|
## We need:
|
|
## 1- to protect against set -e
|
|
## 2- to detect if errorlevel 1 because lsof failed for good reason: permissions error, directory not found
|
|
## 3- to detect if errorlevel 1 because no process found
|
|
|
|
[ -d "$host_db_working_dir" ] || {
|
|
err "Directory '$host_db_working_dir' not found. Might be normal at this stage."
|
|
return 1
|
|
}
|
|
|
|
## We choose to ignore (2), and use stdout emptyness to ensure (3)
|
|
open_files=$(lsof +D "$host_db_working_dir") || true
|
|
|
|
[ "$open_files" ]
|
|
}
|
|
|
|
|
|
_set_db_params() {
|
|
local docker_ip="$1" docker_network="$2"
|
|
|
|
export db_docker_opts="--network $docker_network -e PGHOST=$docker_ip -e PGUSER=postgres"
|
|
export db_cmd_opts=
|
|
|
|
PGHOST="$docker_ip"
|
|
PGUSER="postgres"
|
|
export PGHOST PGUSER
|
|
}
|
|
|
|
|
|
## Must setup a direct connection
|
|
_set_up_connection() {
|
|
|
|
if [ -e "$DB_PASSFILE" ]; then
|
|
POSTGRES_ROOT_PASSWORD=$(cat "$DB_PASSFILE" | cut -f 5 -d :)
|
|
else
|
|
POSTGRES_ROOT_PASSWORD="$(gen_password)"
|
|
fi
|
|
|
|
##
|
|
## Setting up access from host
|
|
##
|
|
|
|
debug docker exec -i "$container_id" psql -U postgres -qAt
|
|
docker exec -i "$container_id" psql -U postgres -qAt \
|
|
< <(echo "ALTER USER postgres WITH ENCRYPTED password '$POSTGRES_ROOT_PASSWORD'") || {
|
|
die "direct PSQL injection failed."
|
|
}
|
|
|
|
sed -ri 's%^host all all 0\.0\.0\.0/0 trust$%host all all 0.0.0.0/0 md5%g' \
|
|
"$SERVICE_DATASTORE/var/lib/postgresql/data/pg_hba.conf" || return 1
|
|
|
|
docker restart "$container_id" || return 1
|
|
|
|
## XXXvlab: this won't help support multiple project running on the
|
|
## same host
|
|
cat <<EOF > "$DB_PASSFILE"
|
|
*:*:*:postgres:$POSTGRES_ROOT_PASSWORD
|
|
EOF
|
|
chmod 600 "$DB_PASSFILE" || return 1
|
|
|
|
}
|
|
|
|
ddb () { dcmd psql -qAt "$@"; }
|
|
|
|
|
|
##
|
|
## Entrypoints
|
|
##
|
|
|
|
|
|
db_drop () {
|
|
local dbname="$1"
|
|
dcmd dropdb --if-exists "$1"
|
|
}
|
|
|
|
db_create () {
|
|
local dbname="$1"
|
|
dcmd createdb "$dbname" || return 1
|
|
info "Database '$dbname' created."
|
|
if [ "$POSTGIS" ]; then
|
|
ddb -d "$dbname" < <(echo "CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology;") || return 1
|
|
dcmd /bin/bash -c "psql -d '$dbname' -f /usr/share/postgresql/*/contrib/postgis-2.1/legacy.sql" || return 1
|
|
info "Installed postgis extensions on database '$dbname'."
|
|
fi
|
|
if [ "$UNACCENT" ]; then
|
|
ddb -d "$dbname" < <(echo "CREATE EXTENSION IF NOT EXISTS unaccent;") || return 1
|
|
info "Installed unaccent extension on database '$dbname'."
|
|
fi
|
|
}
|
|
|
|
|
|
## XXXvlab: if launched first, it'll fail handling correctly the open/close of docker
|
|
db_has_database() {
|
|
local dbname="$1"
|
|
if [ "$(ddb < <(echo "SELECT 1 FROM pg_database WHERE datname = '$dbname'"))" ]; then
|
|
debug "Database $dbname exists."
|
|
return 0
|
|
else
|
|
debug "Database $dbname exists."
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
## XXXvlab: if launched first, it'll fail handling correctly the open/close of docker
|
|
db_has_user() {
|
|
local user="$1" users
|
|
users=$(ddb < <(echo "select u.usename from pg_catalog.pg_user u")) || {
|
|
err "Failed to get user list"
|
|
return 1
|
|
}
|
|
echo "$users" | grep "^${user}$" >/dev/null 2>&1
|
|
}
|
|
|
|
db_create_user() {
|
|
local user="$1" password="$2"
|
|
## Using this instead of pipes is important so that trap works
|
|
ddb < <(echo "CREATE USER $user WITH PASSWORD '$password' CREATEDB NOCREATEROLE;")
|
|
}
|
|
|
|
db_change_password() {
|
|
local user="$1" password="$2"
|
|
## Using this instead of pipes is important so that trap works
|
|
ddb < <(echo "ALTER USER $user WITH PASSWORD '$password';")
|
|
}
|
|
|
|
db_grant_rights () {
|
|
local dbname="$1" user="$2"
|
|
PGM chown "$user" "$dbname"
|
|
}
|
|
|
|
PGM() {
|
|
local src="$1" dst="$2"
|
|
require psql || apt-get install -y postgresql-client </dev/null
|
|
require pgm || {
|
|
(
|
|
cd /opt/apps
|
|
git clone https://github.com/0k/pgm.git
|
|
ln -sf /opt/apps/pgm/bin/* /usr/local/bin/
|
|
apt-get install -y --force-yes pv buffer < /dev/null
|
|
# cd /opt/apps/0k-docker
|
|
# git checkout master
|
|
)
|
|
}
|
|
|
|
ensure_db_docker_running </dev/null || return 1
|
|
|
|
debug pgm "$@"
|
|
pgm "$@"
|
|
}
|