From 571d4093e07e62b0c3a240a1229227bbbe095a2f Mon Sep 17 00:00:00 2001 From: yuuki <> Date: Thu, 5 Oct 2023 14:47:38 +0000 Subject: [PATCH] merge from modify/main --- .dockerignore | 2 + .gitignore | 56 +++++++++++++ Dockerfile | 6 ++ app.py | 4 + requirements.txt | 27 ++++--- templates/index.html | 2 +- wait-for-it.sh | 182 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 264 insertions(+), 15 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 wait-for-it.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3d99671 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/.git +/server diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..24a7c5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,56 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +.vscode +*.pyc + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +public/songs +public/api +taiko.db +version.json +public/index.html +#config.py +public/assets/song_skins +.venv +public/src/js/plugin +.hidden diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..f8494db --- /dev/null +++ b/Dockerfile @@ -0,0 +1,6 @@ +FROM python:latest +COPY . /app +WORKDIR /app +RUN find wheels -name '*.whl' -print0 | xargs -0 pip install +RUN sed -i 's/\r$//' wait-for-it.sh +CMD ["./wait-for-it.sh","-t","300","mongo:27017","--","python","app.py","34801","-b","0.0.0.0"] diff --git a/app.py b/app.py index 84564b9..76ac0c9 100644 --- a/app.py +++ b/app.py @@ -747,5 +747,9 @@ if __name__ == '__main__': def send_assets(path): return send_from_directory('public/assets', path) + @app.route(basedir + 'songs/') + def send_songs(path): + return send_from_directory('public/songs', path) + app.run(host=args.bind_address, port=args.port, debug=args.debug) diff --git a/requirements.txt b/requirements.txt index 19ea100..fcdd102 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,14 +1,13 @@ -bcrypt==3.2.0 -ffmpy==0.2.3 -Flask==2.0.3 -Flask-Caching==1.9.0 -Flask-Session==0.3.2 -Flask-WTF==0.14.3 -gunicorn==20.0.4 -jsonschema==3.2.0 -pymongo==3.11.2 -redis==3.5.3 -requests==2.25.1 -websockets==9.1 -Werkzeug==2.0.0 -jinja2==3.0.3 +bcrypt==4.0.1 +ffmpy==0.3.1 +Flask==3.0.0 +git+https://github.com/alanhamlett/flask-caching.git#egg=Flask-Caching +Flask-Session==0.5.0 +Flask-WTF==1.2.1 +gunicorn==21.2.0 +jsonschema==4.19.1 +pymongo==4.5.0 +redis==5.0.1 +requests==2.31.0 +Werkzeug==3.0.0 +Jinja2==3.1.2 diff --git a/templates/index.html b/templates/index.html index 995dabe..3780542 100644 --- a/templates/index.html +++ b/templates/index.html @@ -28,7 +28,7 @@ {% if version.version and version.commit_short and version.commit %} taiko-web ver.{{version.version}} ({{version.commit_short}}) {% else %} - taiko-web v2 + taiko-web vRAINBOW++ {% endif %} diff --git a/wait-for-it.sh b/wait-for-it.sh new file mode 100644 index 0000000..d990e0d --- /dev/null +++ b/wait-for-it.sh @@ -0,0 +1,182 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +WAITFORIT_cmdname=${0##*/} + +echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + else + echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout" + fi + WAITFORIT_start_ts=$(date +%s) + while : + do + if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then + nc -z $WAITFORIT_HOST $WAITFORIT_PORT + WAITFORIT_result=$? + else + (echo -n > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1 + WAITFORIT_result=$? + fi + if [[ $WAITFORIT_result -eq 0 ]]; then + WAITFORIT_end_ts=$(date +%s) + echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds" + break + fi + sleep 1 + done + return $WAITFORIT_result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $WAITFORIT_QUIET -eq 1 ]]; then + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + else + timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT & + fi + WAITFORIT_PID=$! + trap "kill -INT -$WAITFORIT_PID" INT + wait $WAITFORIT_PID + WAITFORIT_RESULT=$? + if [[ $WAITFORIT_RESULT -ne 0 ]]; then + echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT" + fi + return $WAITFORIT_RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + WAITFORIT_hostport=(${1//:/ }) + WAITFORIT_HOST=${WAITFORIT_hostport[0]} + WAITFORIT_PORT=${WAITFORIT_hostport[1]} + shift 1 + ;; + --child) + WAITFORIT_CHILD=1 + shift 1 + ;; + -q | --quiet) + WAITFORIT_QUIET=1 + shift 1 + ;; + -s | --strict) + WAITFORIT_STRICT=1 + shift 1 + ;; + -h) + WAITFORIT_HOST="$2" + if [[ $WAITFORIT_HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + WAITFORIT_HOST="${1#*=}" + shift 1 + ;; + -p) + WAITFORIT_PORT="$2" + if [[ $WAITFORIT_PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + WAITFORIT_PORT="${1#*=}" + shift 1 + ;; + -t) + WAITFORIT_TIMEOUT="$2" + if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + WAITFORIT_TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + WAITFORIT_CLI=("$@") + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15} +WAITFORIT_STRICT=${WAITFORIT_STRICT:-0} +WAITFORIT_CHILD=${WAITFORIT_CHILD:-0} +WAITFORIT_QUIET=${WAITFORIT_QUIET:-0} + +# Check to see if timeout is from busybox? +WAITFORIT_TIMEOUT_PATH=$(type -p timeout) +WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH) + +WAITFORIT_BUSYTIMEFLAG="" +if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then + WAITFORIT_ISBUSY=1 + # Check if busybox timeout uses -t flag + # (recent Alpine versions don't support -t anymore) + if timeout &>/dev/stdout | grep -q -e '-t '; then + WAITFORIT_BUSYTIMEFLAG="-t" + fi +else + WAITFORIT_ISBUSY=0 +fi + +if [[ $WAITFORIT_CHILD -gt 0 ]]; then + wait_for + WAITFORIT_RESULT=$? + exit $WAITFORIT_RESULT +else + if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then + wait_for_wrapper + WAITFORIT_RESULT=$? + else + wait_for + WAITFORIT_RESULT=$? + fi +fi + +if [[ $WAITFORIT_CLI != "" ]]; then + if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then + echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess" + exit $WAITFORIT_RESULT + fi + exec "${WAITFORIT_CLI[@]}" +else + exit $WAITFORIT_RESULT +fi