From 02b38d019dee85b74dbfaf3b354775a5080a6725 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Thu, 19 Oct 2023 20:43:28 +0200 Subject: [PATCH] Add option to create database dump from sql script Loosely copied from the domjudge-scripts repo. This does remove the prefix question as just exiting and letting the user reword less restrictive. --- Makefile | 1 + configure.ac | 3 +++ paths.mk.in | 4 +++- sql/dj_setup_database.in | 40 ++++++++++++++++++++++++++++++++++++---- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 051fce0c95..55841a0f1b 100644 --- a/Makefile +++ b/Makefile @@ -210,6 +210,7 @@ inplace-conf-common: dist --with-domserver_tmpdir=$(CURDIR)/output/tmp \ --with-judgehost_tmpdir=$(CURDIR)/output/tmp \ --with-judgehost_judgedir=$(CURDIR)/output/judgings \ + --with-domserver_databasedumpdir=$(CURDIR)/output/db-dumps \ --with-baseurl='http://localhost/domjudge/' \ CFLAGS='$(MAINT_CXFLAGS) -std=c11' \ CXXFLAGS='$(MAINT_CXFLAGS) -std=c++11' \ diff --git a/configure.ac b/configure.ac index bc5b0676f9..858b6c5a86 100644 --- a/configure.ac +++ b/configure.ac @@ -172,6 +172,7 @@ if test "x$FHS_ENABLED" = xyes ; then AC_SUBST(domserver_rundir, $localstatedir/run/${PACKAGE_TARNAME}) AC_SUBST(domserver_tmpdir, /tmp) AC_SUBST(domserver_exampleprobdir, $datadir/${PACKAGE_TARNAME}/example_problems) + AC_SUBST(domserver_databasedumpdir, $localstatedir/lib/${PACKAGE_TARNAME}/db-dumps) fi if test "x$JUDGEHOST_BUILD_ENABLED" = xyes; then @@ -224,6 +225,7 @@ AX_PATH(domserver_logdir, [$domserver_root/log]) AX_PATH(domserver_rundir, [$domserver_root/run]) AX_PATH(domserver_tmpdir, [$domserver_root/tmp]) AX_PATH(domserver_exampleprobdir, [$domserver_root/example_problems]) +AX_PATH(domserver_databasedumpdir, [$domserver_root/db-dumps]) fi if test "x$JUDGEHOST_BUILD_ENABLED" = xyes; then AX_WITH_COMMENT(6,[ ]) @@ -386,6 +388,7 @@ echo " - sql..............: AX_VAR_EXPAND($domserver_sqldir)" echo " - tmp..............: AX_VAR_EXPAND($domserver_tmpdir)" echo " - webapp...........: AX_VAR_EXPAND($domserver_webappdir)" echo " - example_problems.: AX_VAR_EXPAND($domserver_exampleprobdir)" +echo " - database_dumps...: AX_VAR_EXPAND($domserver_databasedumpdir)" fi if test "x$JUDGEHOST_BUILD_ENABLED" = xyes; then echo "" diff --git a/paths.mk.in b/paths.mk.in index de132ed9cb..c0e9d4fead 100644 --- a/paths.mk.in +++ b/paths.mk.in @@ -91,6 +91,7 @@ domserver_logdir = @domserver_logdir@ domserver_rundir = @domserver_rundir@ domserver_tmpdir = @domserver_tmpdir@ domserver_exampleprobdir = @domserver_exampleprobdir@ +domserver_databasedumpdir = @domserver_databasedumpdir@ PHPVERSION = @PHPVERSION@ judgehost_bindir = @judgehost_bindir@ @@ -114,7 +115,7 @@ domserver_dirs = $(domserver_bindir) $(domserver_etcdir) \ $(domserver_libdir) $(domserver_libvendordir) \ $(domserver_logdir) $(domserver_rundir) \ $(addprefix $(domserver_webappdir)/public/images/,affiliations countries teams) \ - $(domserver_exampleprobdir) + $(domserver_exampleprobdir) $(domserver_databasedumpdir) judgehost_dirs = $(judgehost_bindir) $(judgehost_etcdir) $(judgehost_libdir) \ $(judgehost_libjudgedir) $(judgehost_logdir) \ @@ -142,6 +143,7 @@ define substconfigvars -e 's,@domserver_rundir[@],@domserver_rundir@,g' \ -e 's,@domserver_tmpdir[@],@domserver_tmpdir@,g' \ -e 's,@domserver_exampleprobdir[@],@domserver_exampleprobdir@,g' \ + -e 's,@domserver_databasedumpdir[@],@domserver_databasedumpdir@,g' \ -e 's,@judgehost_bindir[@],@judgehost_bindir@,g' \ -e 's,@judgehost_etcdir[@],@judgehost_etcdir@,g' \ -e 's,@judgehost_libdir[@],@judgehost_libdir@,g' \ diff --git a/sql/dj_setup_database.in b/sql/dj_setup_database.in index b04f62e7d0..eff258a028 100755 --- a/sql/dj_setup_database.in +++ b/sql/dj_setup_database.in @@ -10,6 +10,7 @@ BINDIR="@domserver_bindir@" ETCDIR="@domserver_etcdir@" WEBAPPDIR="@domserver_webappdir@" EXAMPLEPROBDIR="@domserver_exampleprobdir@" +DATABASEDUMPDIR="@domserver_databasedumpdir@" PASSWDFILE="$ETCDIR/dbpasswords.secret" @@ -22,7 +23,7 @@ verbose() usage() { cat < +Usage: $0 [option]... [argument] Commands: status check database installation status @@ -34,6 +35,7 @@ Commands: install-examples install examples only install-loadtest configure for load testing. WARNING: CREATES A LOT OF EXTRA ITEMS! upgrade upgrade MySQL database schema to current version + dump [filename] backup the current database to file (without .sql.gz suffix) Options: -u connect to MySQL with DB admin @@ -48,8 +50,7 @@ not have to pass any of the options above. EOF } -# Wrapper around mysql command to allow setting options, user, etc. -mysql() +mysql_options() { local user pass @@ -68,7 +69,13 @@ mysql() fi [ -z "$USE_SOCKET" ] && port="-P$DBPORT" - command mysql $user ${pass:+"$pass"} -h "$DBHOST" ${port:+"$port"} --silent --skip-column-names "$@" + echo $user ${pass:+"$pass"} -h "$DBHOST" ${port:+"$port"} +} + +# Wrapper around mysql command to allow setting options, user, etc. +mysql() +{ + command mysql $(mysql_options) --silent --skip-column-names "$@" } # Quick shell hack to get a key from an INI file. @@ -234,6 +241,10 @@ install_examples() ( cd "$EXAMPLEPROBDIR" && yes y | "$BINDIR"/import-contest ) } +create_database_dump () { + sudo mysqldump $(mysql_options) --opt --skip-lock-tables domjudge | pv | gzip > "$DATABASEDUMPDIR/${1}.sql.gz" +} + ### Script starts here ### # Parse command-line options: @@ -354,6 +365,27 @@ upgrade) verbose "DOMjudge database upgrade completed." ;; +dump) + read_dbpasswords + DUMPNAME="$2" + if [ -z "$DUMPNAME" ]; then + usage + exit 1 + fi + + if [ -f "${DATABASEDUMPDIR}/${DUMPNAME}.sql.gz" ]; then + while true; do + read -p "Overwrite existing database dump (y/N)? " yn + case $yn in + [Yy]* ) break ;; + ''|[Nn]* ) exit 0;; + esac + done + fi + create_database_dump $DUMPNAME + exit 0 + ;; + *) echo "Error: Unknown subcommand '$1'" usage