92 lines
3.0 KiB
Bash
92 lines
3.0 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
|
||
|
|
waitForPostgresAvailability() {
|
||
|
|
if [ -z "$PG_DB_HOST" ]; then
|
||
|
|
tlog "PostgreSQL host name is empty. Check env variables. Error. Exiting java setup"
|
||
|
|
exit 2
|
||
|
|
else
|
||
|
|
|
||
|
|
MAX_RETRIES=50
|
||
|
|
RETRYSECONDS=10
|
||
|
|
retry_count=0
|
||
|
|
while true; do
|
||
|
|
su postgres -c "pg_isready -h '${PG_DB_HOST}' -p '${PG_DB_PORT}'"
|
||
|
|
status=$?
|
||
|
|
|
||
|
|
case $status in
|
||
|
|
0)
|
||
|
|
tlog "PostgreSQL host '$PG_DB_HOST' is ready."
|
||
|
|
break
|
||
|
|
;;
|
||
|
|
1)
|
||
|
|
tlog "PostgreSQL host '$PG_DB_HOST' is rejecting connections e.g. due to being in recovery mode or not accepting connections eg. connections maxed out."
|
||
|
|
;;
|
||
|
|
2)
|
||
|
|
tlog "PostgreSQL host '$PG_DB_HOST' is not responding or running."
|
||
|
|
;;
|
||
|
|
3)
|
||
|
|
tlog "The connection check failed e.g. due to network issues or incorrect parameters."
|
||
|
|
;;
|
||
|
|
*)
|
||
|
|
tlog "pg_isready exited with unexpected status code: $status"
|
||
|
|
break
|
||
|
|
;;
|
||
|
|
esac
|
||
|
|
|
||
|
|
retry_count=$((retry_count + 1))
|
||
|
|
if [ $retry_count -le $MAX_RETRIES ]; then
|
||
|
|
tlog "PostgreSQL connection failed. Retrying attempt $retry_count/$MAX_RETRIES in $RETRYSECONDS seconds..."
|
||
|
|
sleep $RETRYSECONDS
|
||
|
|
else
|
||
|
|
tlog "Exceeded maximum retry attempts ($MAX_RETRIES). Exiting."
|
||
|
|
# use exit code 2 to indicate that the script failed to connect to postgres and supervisor conf is set not to restart the program for 2.
|
||
|
|
exit 2
|
||
|
|
fi
|
||
|
|
|
||
|
|
done
|
||
|
|
fi
|
||
|
|
}
|
||
|
|
|
||
|
|
# for PostgreSQL, we use APPSMITH_DB_URL=postgresql://username:password@postgresserver:5432/dbname
|
||
|
|
# Args:
|
||
|
|
# conn_string (string): PostgreSQL connection string
|
||
|
|
# Returns:
|
||
|
|
# None
|
||
|
|
# Example:
|
||
|
|
# postgres syntax
|
||
|
|
# "postgresql://user:password@localhost:5432/appsmith"
|
||
|
|
# "postgresql://user:password@localhost/appsmith"
|
||
|
|
# "postgresql://user@localhost:5432/appsmith"
|
||
|
|
# "postgresql://user@localhost/appsmith"
|
||
|
|
extract_postgres_db_params() {
|
||
|
|
local conn_string=$1
|
||
|
|
|
||
|
|
# Use node to parse the URI and extract components
|
||
|
|
IFS=' ' read -r USER PASSWORD HOST PORT DB <<<"$(node -e "
|
||
|
|
const connectionString = process.argv[1];
|
||
|
|
const pgUri = connectionString.startsWith(\"postgresql://\")
|
||
|
|
? connectionString
|
||
|
|
: 'http://' + connectionString; //Prepend a fake scheme for URL parsing
|
||
|
|
const url = require('url');
|
||
|
|
const parsedUrl = new url.URL(pgUri);
|
||
|
|
|
||
|
|
// Extract the pathname and remove the leading '/'
|
||
|
|
const db = parsedUrl.pathname.substring(1);
|
||
|
|
|
||
|
|
// Default the port to 5432 if it's empty
|
||
|
|
const port = parsedUrl.port || '5432';
|
||
|
|
|
||
|
|
console.log(\`\${parsedUrl.username || '-'} \${parsedUrl.password || '-'} \${parsedUrl.hostname} \${port} \${db}\`);
|
||
|
|
" "$conn_string")"
|
||
|
|
|
||
|
|
# Now, set the environment variables
|
||
|
|
export PG_DB_USER="$USER"
|
||
|
|
export PG_DB_PASSWORD="$PASSWORD"
|
||
|
|
export PG_DB_HOST="$HOST"
|
||
|
|
export PG_DB_PORT="$PORT"
|
||
|
|
export PG_DB_NAME="$DB"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Example usage of the functions
|
||
|
|
# waitForPostgresAvailability
|
||
|
|
# extract_postgres_db_params "postgresql://user:password@localhost:5432/dbname"
|