diff --git a/install.sh b/install.sh index f28751c3..c65b9963 100644 --- a/install.sh +++ b/install.sh @@ -111,10 +111,12 @@ gen_random_string() { } install_postgres_local() { - local pg_user="xui" - local pg_db="xui" - local pg_pass + local pg_user pg_pass + pg_user=$(gen_random_string 8) pg_pass=$(gen_random_string 24) + local pg_db="xui" + local pg_host="127.0.0.1" + local pg_port="5432" case "${release}" in ubuntu | debian | armbian) @@ -170,20 +172,34 @@ install_postgres_local() { sleep 1 done - # Idempotent role/db creation. + # Idempotent role/db creation. Identifiers are double-quoted because a + # random username may start with a digit, which Postgres rejects unquoted. sudo -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='${pg_user}'" 2> /dev/null \ | grep -q 1 \ - || sudo -u postgres psql -c "CREATE USER ${pg_user} WITH PASSWORD '${pg_pass}';" >&2 || return 1 + || sudo -u postgres psql -c "CREATE USER \"${pg_user}\" WITH PASSWORD '${pg_pass}';" >&2 || return 1 sudo -u postgres psql -tAc "SELECT 1 FROM pg_database WHERE datname='${pg_db}'" 2> /dev/null \ | grep -q 1 \ - || sudo -u postgres psql -c "CREATE DATABASE ${pg_db} OWNER ${pg_user};" >&2 || return 1 + || sudo -u postgres psql -c "CREATE DATABASE \"${pg_db}\" OWNER \"${pg_user}\";" >&2 || return 1 - sudo -u postgres psql -c "ALTER USER ${pg_user} WITH PASSWORD '${pg_pass}';" >&2 || return 1 + sudo -u postgres psql -c "ALTER USER \"${pg_user}\" WITH PASSWORD '${pg_pass}';" >&2 || return 1 local pg_pass_enc pg_pass_enc=$(printf '%s' "${pg_pass}" | sed -e 's/%/%25/g' -e 's/:/%3A/g' -e 's/@/%40/g' -e 's|/|%2F|g' -e 's/?/%3F/g' -e 's/#/%23/g') - echo "postgres://${pg_user}:${pg_pass_enc}@127.0.0.1:5432/${pg_db}?sslmode=disable" + + if [[ -n "${PG_CRED_FILE:-}" ]]; then + umask 077 + cat > "${PG_CRED_FILE}" <