mirror of
https://github.com/aljazceru/CTFd.git
synced 2025-12-18 22:44:24 +01:00
ping database with python instead of mysql client (#1862)
* Replaces `mysqladmin ping` with a custom script * Closes #725
This commit is contained in:
@@ -6,7 +6,6 @@ RUN mkdir -p /opt/CTFd /var/log/CTFd /var/uploads
|
|||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends \
|
&& apt-get install -y --no-install-recommends \
|
||||||
build-essential \
|
build-essential \
|
||||||
default-mysql-client \
|
|
||||||
python3-dev \
|
python3-dev \
|
||||||
libffi-dev \
|
libffi-dev \
|
||||||
libssl-dev \
|
libssl-dev \
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ ACCESS_LOG=${ACCESS_LOG:--}
|
|||||||
ERROR_LOG=${ERROR_LOG:--}
|
ERROR_LOG=${ERROR_LOG:--}
|
||||||
WORKER_TEMP_DIR=${WORKER_TEMP_DIR:-/dev/shm}
|
WORKER_TEMP_DIR=${WORKER_TEMP_DIR:-/dev/shm}
|
||||||
SECRET_KEY=${SECRET_KEY:-}
|
SECRET_KEY=${SECRET_KEY:-}
|
||||||
DATABASE_URL=${DATABASE_URL:-}
|
|
||||||
|
|
||||||
# Check that a .ctfd_secret_key file or SECRET_KEY envvar is set
|
# Check that a .ctfd_secret_key file or SECRET_KEY envvar is set
|
||||||
if [ ! -f .ctfd_secret_key ] && [ -z "$SECRET_KEY" ]; then
|
if [ ! -f .ctfd_secret_key ] && [ -z "$SECRET_KEY" ]; then
|
||||||
@@ -19,22 +18,8 @@ if [ ! -f .ctfd_secret_key ] && [ -z "$SECRET_KEY" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check that the database is available
|
# Ensures that the database is available
|
||||||
if [ -n "$DATABASE_URL" ]
|
python ping.py
|
||||||
then
|
|
||||||
url=`echo $DATABASE_URL | awk -F[@//] '{print $4}'`
|
|
||||||
database=`echo $url | awk -F[:] '{print $1}'`
|
|
||||||
port=`echo $url | awk -F[:] '{print $2}'`
|
|
||||||
echo "Waiting for $database:$port to be ready"
|
|
||||||
while ! mysqladmin ping -h "$database" -P "$port" --silent; do
|
|
||||||
# Show some progress
|
|
||||||
echo -n '.';
|
|
||||||
sleep 1;
|
|
||||||
done
|
|
||||||
echo "$database is ready"
|
|
||||||
# Give it another second.
|
|
||||||
sleep 1;
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Initialize database
|
# Initialize database
|
||||||
python manage.py db upgrade
|
python manage.py db upgrade
|
||||||
|
|||||||
34
ping.py
Normal file
34
ping.py
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
"""
|
||||||
|
Script for checking that a database server is available.
|
||||||
|
Essentially a cross-platform, database agnostic mysqladmin.
|
||||||
|
"""
|
||||||
|
import time
|
||||||
|
|
||||||
|
from sqlalchemy import create_engine
|
||||||
|
from sqlalchemy.engine.url import make_url
|
||||||
|
|
||||||
|
from CTFd.config import Config
|
||||||
|
|
||||||
|
url = make_url(Config.DATABASE_URL)
|
||||||
|
|
||||||
|
# Ignore sqlite databases
|
||||||
|
if url.drivername.startswith("sqlite"):
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
# Null out the database so raw_connection doesnt error if it doesnt exist
|
||||||
|
# CTFd will create the database if it doesnt exist
|
||||||
|
url.database = None
|
||||||
|
|
||||||
|
# Wait for the database server to be available
|
||||||
|
engine = create_engine(url)
|
||||||
|
print(f"Waiting for {url} to be ready")
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
engine.raw_connection()
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
print(".", end="", flush=True)
|
||||||
|
time.sleep(1)
|
||||||
|
|
||||||
|
print(f"{url} is ready")
|
||||||
|
time.sleep(1)
|
||||||
Reference in New Issue
Block a user