From 6fb64998cefda4550ac1d26e2fb4827a63ef3d67 Mon Sep 17 00:00:00 2001 From: Lars Eggert <lars@eggert.org> Date: Wed, 13 Oct 2021 11:33:37 +0000 Subject: [PATCH] Version of the new docker setup emailed out for testing on 2021-10-12 - Legacy-Id: 19417 --- docker/Dockerfile | 226 ++++++++++++----------------------------- docker/README.md | 37 +++++++ docker/README.rst | 98 ------------------ docker/build | 39 +++----- docker/devserver | 15 --- docker/docker-init.sh | 228 +++++++++++------------------------------- docker/install-extras | 14 --- docker/mailserver | 13 --- docker/run | 205 ++++--------------------------------- docker/setprompt | 26 ----- docker/setupdb | 114 --------------------- docker/updatedb | 72 ++++--------- 12 files changed, 211 insertions(+), 876 deletions(-) create mode 100644 docker/README.md delete mode 100644 docker/README.rst delete mode 100755 docker/devserver delete mode 100755 docker/install-extras delete mode 100755 docker/mailserver delete mode 100644 docker/setprompt delete mode 100755 docker/setupdb diff --git a/docker/Dockerfile b/docker/Dockerfile index f14cb9196..dc7710f4e 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,185 +1,85 @@ -# -*- shell-mode -*- -# This file is a docker (https://www.docker.com/what-docker) recipe, which can be used to build -# a docker image which is ready to run a datatracker in development mode. +# This is a Dockerfile with everything in it to run the IETF datatracker. # -# It is used to build an image (once you've installed docker) using a command like this (assuming -# suitable replacement of $variables: +# If you make changes to the datatracker that add new dependencies (python +# packages or otherwise), you need to rebuild this image to make them +# available. Do this in the top-level directory of your datatracker source +# tree: # -# $ docker build -t $yourdockerid/datatracker:$version +# docker build --tag dt:latest . # -# To use a pre-built image, assuming we're on OS X and have a checked-out datatracker repository -# at /Users/$login/src/6.8.1.dev0, you would start (again assuming you've installed docker) -# a container from an image, as follows: -# -# $ docker run -ti --name=$containername -v /Users/$login:/home/$login levkowetz/datatracker:$version /bin/bash -# -# This maps your home directory to /home/$login in the container, and starts it running /bin/bash. -# -# In this first version, the docker environment is set up so that tests will run successfully, -# but the database has *not* been loaded with a dump, and supporting files (drafts, charters, etc.) -# have *not* been downloaded. +# You can then execute the datatracker like this (also from the top-level +# datatracker source directory): +# +# docker run -ti -v $(pwd):/root/src dt:latest -FROM dyne/devuan:beowulf -LABEL maintainer="Henrik Levkowetz <henrik@levkowetz.com>" +FROM ubuntu:hirsute +LABEL maintainer="IETF Tools Team <tools-discuss@ietf.org>" # Default django runserver port -EXPOSE 8000 +EXPOSE 8000 -# Run apt-get noninteractive +# Default mysqld/mariadb port +EXPOSE 3306 + +# Install all dependencies that are available as packages ENV DEBIAN_FRONTEND=noninteractive -ENV DEVUAN_FRONTEND=noninteractive - -# Uncomment this to be able to install and run apt-show-versions: -RUN rm -v /etc/apt/apt.conf.d/docker-compress -RUN rm -v /var/lib/apt/lists/*lz4 - -RUN apt-get update --allow-releaseinfo-change -RUN apt-get install -qy apt-transport-https - -# Use backports, updates, and security updates -RUN echo "deb http://deb.devuan.org/merged beowulf main contrib non-free" > /etc/apt/sources.list -RUN echo "deb http://deb.devuan.org/merged beowulf-security main contrib non-free" >> /etc/apt/sources.list -RUN echo "deb http://deb.devuan.org/merged beowulf-updates main contrib non-free" >> /etc/apt/sources.list -RUN echo "deb http://deb.devuan.org/merged beowulf-backports main contrib non-free" >> /etc/apt/sources.list - -# Remove some excludes for the docker image -RUN sed -i -e '/^path-exclude=.*\/groff/d' \ - -e '/^path-exclude=.*\/locale/d' \ - -e '/^path-exclude=.*\/man/d' /etc/dpkg/dpkg.cfg.d/docker-excludes - -# Install needed packages -# -# We're not including graphviz and ghostscript, needed for the 3 document -# dependency graph tests; they would increase the size of the image by about -# 15%, about 100MB. - -# Fetch apt package information, and upgrade to latest package versions - -RUN apt-get update -RUN apt-get -qy upgrade - -# Install the packages we need -RUN apt-get install -qy \ - build-essential \ - bzip2 \ - ca-certificates \ - colordiff \ - gawk \ - gcc \ - ipython \ - jq \ - less \ - libbz2-dev \ - libdb5.3-dev \ - libexpat1-dev \ - libffi-dev \ - libgdbm-dev \ - libjpeg62-turbo-dev \ - liblzma-dev \ - libmagic1 \ - libmariadbclient-dev \ - libncurses5-dev \ - libncursesw5-dev \ - libreadline-dev \ - libsqlite3-dev \ - libssl-dev \ - libsvn1 \ - libxml2-dev \ - libxslt-dev \ - libz-dev \ - libffi-dev \ - locales \ - make \ - man \ - mariadb-client \ - mariadb-server \ - openssh-client \ - patch \ - procps \ - pv \ - rsync \ +RUN apt-get -y update && \ + apt-get -y install --no-install-recommends \ + apache2-utils \ + apt-file \ + apt-utils \ + chromium-driver \ + curl \ + enscript \ + gcc \ + ghostscript \ + git \ + graphviz \ + libmagic-dev \ + libmariadb-dev \ + mariadb-server \ + npm \ + pigz \ + pv \ + python-is-python3 \ + python3-dev \ + python3-pip \ rsyslog \ - subversion \ - sudo \ - uuid-dev \ - vim \ - wget \ - xz-utils\ - zile \ - zlib1g-dev + unzip \ + yang-tools && \ + apt-get -y clean && \ + rm -rf /var/lib/apt/lists/* -# Postgresql packages -RUN apt-get install -qy \ - postgresql-11 \ - postgresql-server-dev-11 +# Install bower +RUN npm install -g bower -# Get the key used to sign the libyang repo -RUN wget -nv http://download.opensuse.org/repositories/home:liberouter/Debian_9.0/Release.key -RUN apt-key add - < Release.key -RUN rm Release.key - -# Add apt source entry for libyang -RUN echo "deb http://download.opensuse.org/repositories/home:/liberouter/Debian_9.0/ /" >> /etc/apt/sources.list.d/libyang.list - -# Update the package defs, and install the desired mysql from the mysql repo -RUN apt-get update -RUN apt-get install -qy libyang1 - -# This is expected to exist by the mysql startup scripts: -#RUN touch /etc/mysql/debian.cnf -# ------------------------------------------------------------------------------ - -# Get rid of installation files we don't need in the image, to reduce size -RUN apt-get clean && rm -rf /var/lib/apt/lists/* - -# Enable some common locales -RUN sed -i -e 's/^. en_US/en_US/' -e 's/^. en_GB/en_GB/' -e 's/^. en_IE/en_IE/' /etc/locale.gen -RUN locale-gen - -# Remove an rsyslog module that we don't need, which also requires extra permissions -RUN sed -i -e '/load="imklog"/d' /etc/rsyslog.conf - -# Set up root password -RUN echo "root:root" | chpasswd - -# MySQL -VOLUME /var/lib/mysql - -# idnits and dependencies +# Install idnits ADD https://tools.ietf.org/tools/idnits/idnits /usr/local/bin/ RUN chmod +rx /usr/local/bin/idnits -# Directory for Mac certs -RUN mkdir /etc/certificates +# Install current datatracker python dependencies +COPY requirements.txt / +RUN pip install -r /requirements.txt -# # Python 3 -# # Comment in if OS does not provide python3.6, which is the current -# # production version -ENV PYVER=3.6.10 -ENV PYREV=3.6 +# Turn off rsyslog kernel logging (doesn't work in Docker) +RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf -WORKDIR /usr/src -RUN wget -q https://www.python.org/ftp/python/$PYVER/Python-$PYVER.tar.xz -RUN tar xJf Python-$PYVER.tar.xz -RUN rm Python-$PYVER.tar.xz -WORKDIR /usr/src/Python-$PYVER/ -RUN ./configure -RUN make -RUN make altinstall -WORKDIR /usr/src -RUN rm -rf /usr/src/Python-$PYVER/ +# Allow access to mariadb over the network +RUN sed -i 's/127.0.0.1/0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf -ENV HOSTNAME="datatracker" +# Turn on mariadb performance_schema +RUN sed -i 's/\[mysqld\]/\[mysqld\]\nperformance_schema=ON/' /etc/mysql/mariadb.conf.d/50-server.cnf -ENV DDIR="/usr/local/share/datatracker" -RUN mkdir -p $DDIR -WORKDIR $DDIR - -COPY requirements.txt ./ -COPY setprompt ./ +# Make the mariadb sys schema available for possible installation +# We would normally use the next line, but that has a bug: +# ADD https://github.com/FromDual/mariadb-sys/archive/master.zip / +# This is the repo that has the PR: +ADD https://github.com/grooverdan/mariadb-sys/archive/refs/heads/master.zip / +RUN unzip /master.zip +# Copy the startup file COPY docker-init.sh /docker-init.sh RUN chmod +x /docker-init.sh -ENTRYPOINT ["/docker-init.sh"] -CMD /bin/bash +WORKDIR /root/src +ENTRYPOINT ["/docker-init.sh"] \ No newline at end of file diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..e30940efa --- /dev/null +++ b/docker/README.md @@ -0,0 +1,37 @@ +# Datatracker Development in Docker + +1. [Set up Docker](https://docs.docker.com/get-started/) on your preferred + platform. + +2. If you have a copy of the datatracker code checked out already, simply `cd` + to the top-level directory. + + If not, check out a datatracker branch as usual. We'll check out `trunk` + below, but you can use any branch: + + svn co https://svn.ietf.org/svn/tools/ietfdb/trunk + cd trunk + +3. **TEMPORARY:** Replace the contents of the `docker` directory with Lars' + files. + +4. **TEMPORARY:** Until Lars' changes have been merged and a docker image is + available for download, you will need to build it locally: + + docker/build -l + + This will take a while, but only needs to be done once. + +5. Use the `docker/run` script to start the datatracker container. You will be + dropped into a shell from which you can start the datatracker and execute + related commands as usual, for example: + + ietf/manage.py runserver 0.0.0.0:8000 + + If you do not already have a copy of the IETF database available in the + `data` directory, one will be downloaded and imported the first time you run + `docker/run`. This will take some time. + + Once the datatracker has started, you should be able to open + [http://localhost:8000](http://localhost:8000) in a browser and see the + landing page. \ No newline at end of file diff --git a/docker/README.rst b/docker/README.rst deleted file mode 100644 index d79777e36..000000000 --- a/docker/README.rst +++ /dev/null @@ -1,98 +0,0 @@ - -============================================================================== - Datatracker Development in a Docker Container (beta) -============================================================================== - - -Intro -===== - -Docker_ is a toolkit which lets you package software together with its -dependencies in lightweight containers, and run it in isolated virtual -environments. - -During and just after IETF-94 I've spent quite a bit of time setting up a -docker image which provides the dependencies needed to run the datatracker, -and it's now available for beta testing. Hopefully this should make it -substantially easier to get started with datatracker development. - -Steps -===== - -1. Set up Docker on your preferred platform. Official installers exist for - many Linux flavours, OS X, Windows and Cloud services. Here's the full `List - of Installation Instructions`_. - - Docker containers require the services of an underlying Linux API, which - means that on OS X and Windows, these have to be provided by a virtual - machine which runs a minimal Linux image. The virtual machine used on - non-Linux platforms is commonly VirtualBox. On Linux kernels with version - 3.8 or later, no virtual machine is needed, as the docker images can be - fully supported with the native kernel services. - - Please follow the Docker installations all the way through to successfully - running the ``hello-world`` example in a terminal window ( ``$ docker run - hello-world``). - - -2. Check out your datatracker branch as usual, in a suitable directory. - We'll assume ``~/src/dt/`` here, and assume you are ``'coder'``:: - - ~/src/dt/ $ svn co https://svn.tools.ietf.org/svn/tools/ietfdb/personal/coder/6.8.2.dev0 - -3. In the checked-out working copy, you'll find a ``docker/`` directory and a - ``data/`` directory at the top level. We're first going to set up a copy of - the MySQL database files under the ``data/`` directory. - - There is a command in the ``docker/`` directory, ``setupdb`` which will do - this for you, or you can do it manually. - - Either run:: - - ~/src/dt/6.8.2.dev0/ $ docker/setupdb - - or do this step-by-step: fetch down a pre-built copy of the datatracker - database, place it in the ``data`` directory, unpack it, and fix - permissions:: - - ~/src/dt/6.8.2.dev0/ $ cd data - ~/src/dt/6.8.2.dev0/data/ $ wget https://www.ietf.org/lib/dt/sprint/ietf_utf8.bin.tar.bz2 - ~/src/dt/6.8.2.dev0/data/ $ tar xjf ietf_utf8.bin.tar.bz2 - ~/src/dt/6.8.2.dev0/data/ $ chmod -R go+rwX mysql - - -4. In the ``docker/`` directory you'll also find a wrapper script named - ``'run'``. We will be using the wrapper to run a pre-built docker image - fetched from the docker hub:: - - ~/src/dt/6.8.2.dev0/ $ docker/run - - This will pull down the latest docker ietf/datatracker-environment image, - start it up with appropriate settings, map the internal ``/var/lib/mysql/`` - directory to the external ``data/mysql/`` directory where we placed the - database, set up a python virtualenv for you, install some dependencies, - and drop you in a bash shell where you can run the datatracker. - -6. You are now ready to run the tests:: - - (virtual) $ ietf/manage.py test --settings=settings_sqlitetest - - and then start the dev server:: - - (virtual) $ ietf/manage.py runserver 0.0.0.0:8000 - - Note the IP address ``0.0.0.0`` used to make the dev server bind to all - addresses. The internal port 8000 has been mapped to port 8000 externally, - too. In order to find the IP address of the VirtualBox, run ``'$ - docker-machine ip'`` *outside* the virtual environment:: - - ~/src/dt/6.8.2.dev0/ $ docker-machine ip - 192.168.59.103 - - ~/src/dt/6.8.2.dev0/ $ open http://192.168.59.103:8000/ - -.. _Docker: https://www.docker.com/ -.. _`List of Installation Instructions`: https://docs.docker.com/v1.8/installation/ -.. _VirtualBox: https://www.virtualbox.org/ - - diff --git a/docker/build b/docker/build index eb3d66f20..2a9c4df63 100755 --- a/docker/build +++ b/docker/build @@ -1,11 +1,11 @@ #!/bin/bash -version=0.10 +version=0.11 program=${0##*/} progdir=${0%/*} if [ "$progdir" = "$program" ]; then progdir="."; fi if [ "$progdir" = "." ]; then progdir="$PWD"; fi -parent=$(dirname $progdir) +parent=$(dirname "$progdir") if [ "$parent" = "." ]; then parent="$PWD"; fi export LANG=C @@ -31,10 +31,10 @@ DESCRIPTION EOF echo -e "OPTIONS" - if [ "$(uname)" = "Linux" ]; then - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' + if [ "$(uname)" = "Linux" ] || [ "$(uname)" = "Darwin" ]; then + grep -E "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" "$0" | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' else - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' + grep -E "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" "$0" | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' fi cat <<EOF @@ -48,7 +48,7 @@ COPYRIGHT Copyright (c) 2016 IETF Trust and the persons identified as authors of the code. All rights reserved. License 'Simplified BSD', as specified in http://opensource.org/licenses/BSD-3-Clause. - + EOF } @@ -59,10 +59,6 @@ function die() { exit 1 } -function note() { - if [ -n "$VERBOSE" ]; then echo -e "$*"; fi -} - # ---------------------------------------------------------------------- function version() { echo -e "$program $version" @@ -77,24 +73,22 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; # Options shortopts=hlt:vV -longopts=help,local,tag=,verbose,version +longopts=help,local,tag=,version # Default values -BRANCH=$(svn log -v ^/tags -l 2 | grep 'A /tags/[1-9]' | awk '{print $2}') -TAG=${BRANCH##*/} +IMAGE=ietf/datatracker-environment +TAG=$(basename "$(svn info "$parent" | grep ^URL | awk '{print $2}')") LOCAL="" if [ "$(uname)" = "Linux" ]; then args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@") if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi eval set -- "$args" - sed="sed -r" else # Darwin, BSDs args=$(getopt -o$shortopts $SV $*) if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi set -- $args - sed="sed -E" fi while true ; do @@ -102,7 +96,6 @@ while true ; do -h| --help) usage; exit;; # Show this help, then exit -l| --local) LOCAL=1;; # Don't upload -t| --tag) TAG=$2; shift;; # Use this docker image tag, instead of the latest svn tags name - -v| --verbose) VERBOSE=1;; # Be more talkative -V| --version) version; exit;; # Show program version, then exit --) shift; break;; *) die "Internal error, inconsistent option specification: '$1'";; @@ -113,14 +106,10 @@ done # ---------------------------------------------------------------------- # The program itself -if [ "$(uname)" == "Linux" ]; then - die "Didn't expect to run this script on Linux -- are you inside docker?" -fi - -docker rmi -f ietf/datatracker-environment:trunk || true -docker build -t ietf/datatracker-environment:$TAG docker/ -docker tag $(docker images -q ietf/datatracker-environment | head -n 1) ietf/datatracker-environment:latest +docker rmi -f $IMAGE:trunk 2>/dev/null || true +docker build --progress plain -t "$IMAGE:$TAG" docker/ +docker tag "$(docker images -q $IMAGE | head -n 1)" $IMAGE:latest if [ -z "$LOCAL" ]; then - docker push ietf/datatracker-environment:latest - docker push ietf/datatracker-environment:$TAG + docker push $IMAGE:latest + docker push "$IMAGE:$TAG" fi \ No newline at end of file diff --git a/docker/devserver b/docker/devserver deleted file mode 100755 index add4534fa..000000000 --- a/docker/devserver +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -version=0.10 -program=${0##*/} -progdir=${0%/*} -if [ "$progdir" = "$program" ]; then progdir="."; fi -if [ "$progdir" = "." ]; then progdir="$PWD"; fi -parent=$(dirname $progdir) -if [ "$parent" = "." ]; then parent="$PWD"; fi - -# ---------------------------------------------------------------------- - -$progdir/run ietf/manage.py runserver 0.0.0.0:8000 - - diff --git a/docker/docker-init.sh b/docker/docker-init.sh index de1c0a651..fdc0003a6 100644 --- a/docker/docker-init.sh +++ b/docker/docker-init.sh @@ -1,195 +1,85 @@ #!/bin/bash -# A little bit of setup -export LANG=en_GB.UTF-8 +MYSQLDIR=/var/lib/mysql -echo "Gathering info ..." -MYSQLDIR="$(mysqld --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')" -if [ ! "$USER" ]; then - echo "Environment variable USER is not set -- will set USER='django'." - USER="django" -fi -if [ ! "$UID" ]; then - echo "Environment variable UID is not set -- will set UID='1000'." - UID="1000" -fi -if [ ! "$GID" ]; then - echo "Environment variable GID is not set -- will set GID='1000'." - GID="1000" -fi -if [ ! "$TAG" ]; then - echo "Environment variable TAG is not set -- will set TAG='datatracker'." - TAG="datatracker" -fi -echo "User $USER ($UID:$GID)" - -echo "Checking if MySQL base data exists ..." -if [ ! -d $MYSQLDIR/mysql ]; then - echo "WARNING: Expected the directory $MYSQLDIR/mysql/ to exist -- have you downloaded and unpacked the IETF binary database tarball?" +if [ ! -d "$MYSQLDIR" ]; then + echo "WARNING: Expected the directory $MYSQLDIR to exist." + exit 1 fi -echo "Setting up the 'mysql' user for database file access ..." -MYSQL_TARGET_GID=$(stat -c "%g" $MYSQLDIR/mysql) -if ! grep -q ":$MYSQL_TARGET_GID:$" /etc/group; then - groupadd -g $MYSQL_TARGET_GID mysqldata -fi -usermod -a -G $MYSQL_TARGET_GID mysql +service rsyslog start -echo "Checking if MySQL is running ..." -if ! /etc/init.d/mysql status; then - echo "Starting mysql ..." - /etc/init.d/mysql start +if [ -z "$(ls -A $MYSQLDIR/mysql 2>/dev/null)" ]; then + echo "WARNING: Database seems to be empty." + mysql_install_db > /dev/null || exit 1 fi -echo "Checking if syslogd is running ..." -if ! /etc/init.d/rsyslog status > /dev/null; then - echo "Starting syslogd ..." - /etc/init.d/rsyslog start +service mariadb start + +if ! service mariadb status; then + echo "ERROR: MySQL isn't running." + grep mysqld /var/log/syslog + exit 1 fi -# Give debian-sys-maint access, to avoid complaints later -mysql mysql <<< "GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '$(awk '/^password/ {print $3; exit}' /etc/mysql/debian.cnf )' WITH GRANT OPTION; FLUSH PRIVILEGES;" - -echo "Checking if the IETF database exists at $MYSQLDIR ..." if [ ! -d $MYSQLDIR/ietf_utf8 ]; then - if [ -z "$DATADIR" ]; then - echo "DATADIR is not set, but the IETF database needs to be set up -- can't continue, exiting the docker init script." - exit 1 - fi - ls -l $MYSQLDIR - - if ! /etc/init.d/mysql status; then - echo "Didn't find the IETF database, but can't set it up either, as MySQL isn't running." - else - echo "Creating database ..." - mysqladmin -u root --default-character-set=utf8 create ietf_utf8 - - echo "Setting up permissions ..." - mysql -u root ietf_utf8 <<< "GRANT ALL PRIVILEGES ON ietf_utf8.* TO django@localhost IDENTIFIED BY 'RkTkDPFnKpko'; FLUSH PRIVILEGES;" - - echo "Fetching database ..." - DUMPDIR=/home/$USER/$DATADIR - wget -N -P $DUMPDIR http://www.ietf.org/lib/dt/sprint/ietf_utf8.sql.gz - - echo "Loading database ..." - gunzip < $DUMPDIR/ietf_utf8.sql.gz \ - | pv --progress --bytes --rate --eta --cursor --size $(gzip --list --quiet $DUMPDIR/ietf_utf8.sql.gz | awk '{ print $2 }') \ - | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \ - | mysql --user=django --password=RkTkDPFnKpko -s -f ietf_utf8 \ - && rm /tmp/ietf_utf8.sql.gz - fi + echo "WARNING: IETF database seems to be missing; populating it from dump." + mysqladmin -u root --default-character-set=utf8 create ietf_utf8 + pushd /mariadb-sys-master || exit + mysql -u root < sys_10.sql + popd || exit + mysql -u root ietf_utf8 <<< "GRANT ALL PRIVILEGES ON *.* TO django@localhost IDENTIFIED BY 'RkTkDPFnKpko'; FLUSH PRIVILEGES;" + /root/src/docker/updatedb fi -if ! grep -q ":$GID:$" /etc/group ; then - echo "Creating group entry for GID '$GID' ..." - groupadd -g "$GID" "$USER" -fi -if ! id -u "$USER" &> /dev/null; then - echo "Creating user '$USER' ..." - useradd -s /bin/bash --groups staff,sudo --uid $UID --gid $GID $USER - echo "$USER:$USER" | chpasswd -fi - -VIRTDIR="/opt/home/$USER/$TAG" -echo "Checking that there's a virtual environment for $TAG ..." -if [ ! -f $VIRTDIR/bin/activate ]; then - echo "Setting up python virtualenv at $VIRTDIR ..." - mkdir -p $VIRTDIR - python3.6 -m venv $VIRTDIR - echo -e " -# This is from $VIRTDIR/bin/activate, to activate the -# datatracker virtual python environment on docker container entry: -" >> /etc/bash.bashrc - cat $VIRTDIR/bin/activate >> /etc/bash.bashrc - cat /usr/local/share/datatracker/setprompt >> /etc/bash.bashrc -else - echo "Using virtual environment at $VIRTDIR" -fi - -echo "Activating the virtual python environment ..." -. $VIRTDIR/bin/activate - - -if ! $VIRTDIR/bin/python -c "import django"; then - echo "Installing requirements ..." - pip install --upgrade pip - reqs=/home/$USER/$CWD/requirements.txt - if [ ! -f $reqs ]; then - echo " Using $reqs" - pip install -r $reqs - else - echo " Didn't find $reqs" - echo " Using /usr/local/share/datatracker/requirements.txt" - pip install -r /usr/local/share/datatracker/requirements.txt - fi -fi - -if [ ! -f /home/$USER/$CWD/ietf/settings_local.py ]; then - echo "Setting up a default settings_local.py ..." - cp /home/$USER/$CWD/docker/settings_local.py /home/$USER/$CWD/ietf/settings_local.py -fi - -for sub in test/id/ test/staging/ test/archive/ test/rfc test/media test/wiki/ietf; do - dir="/home/$USER/$CWD/$sub" - if [ ! -d "$dir" ]; then - echo "Creating dir $dir" - mkdir -p "$dir"; - fi -done - for sub in \ - nomcom_keys/public_keys \ - developers/ietf-ftp \ - developers/ietf-ftp/bofreq \ - developers/ietf-ftp/charter \ - developers/ietf-ftp/conflict-reviews \ - developers/ietf-ftp/internet-drafts \ - developers/ietf-ftp/rfc \ - developers/ietf-ftp/status-changes \ - developers/ietf-ftp/yang/catalogmod \ - developers/ietf-ftp/yang/draftmod \ - developers/ietf-ftp/yang/ianamod \ - developers/ietf-ftp/yang/invalmod \ - developers/ietf-ftp/yang/rfcmod \ - developers/www6s \ - developers/www6s/staging \ - developers/www6s/wg-descriptions \ - developers/www6s/proceedings \ - developers/www6/ \ - developers/www6/iesg \ - developers/www6/iesg/evaluation \ + test/id \ + test/staging \ + test/archive \ + test/rfc \ + test/media \ + test/wiki/ietf \ + data/nomcom_keys/public_keys \ + data/developers/ietf-ftp \ + data/developers/ietf-ftp/bofreq \ + data/developers/ietf-ftp/charter \ + data/developers/ietf-ftp/conflict-reviews \ + data/developers/ietf-ftp/internet-drafts \ + data/developers/ietf-ftp/rfc \ + data/developers/ietf-ftp/status-changes \ + data/developers/ietf-ftp/yang/catalogmod \ + data/developers/ietf-ftp/yang/draftmod \ + data/developers/ietf-ftp/yang/ianamod \ + data/developers/ietf-ftp/yang/invalmod \ + data/developers/ietf-ftp/yang/rfcmod \ + data/developers/www6s \ + data/developers/www6s/staging \ + data/developers/www6s/wg-descriptions \ + data/developers/www6s/proceedings \ + data/developers/www6/ \ + data/developers/www6/iesg \ + data/developers/www6/iesg/evaluation \ ; do - dir="/home/$USER/$CWD/data/$sub" + dir="/root/src/$sub" if [ ! -d "$dir" ]; then - echo "Creating dir $dir" + echo "Creating dir $dir" mkdir -p "$dir"; - chown "$USER" "$dir" fi done -if [ ! -f "/home/$USER/$CWD/test/data/draft-aliases" ]; then - echo "Generating draft aliases ..." - ietf/bin/generate-draft-aliases } +if [ ! -f /root/src/ietf/settings_local.py ]; then + echo "Setting up a default settings_local.py ..." + cp /root/src/docker/settings_local.py /root/src/ietf/settings_local.py fi -if [ ! -f "/home/$USER/$CWD/test/data/group-aliases" ]; then - echo "Generating group aliases ..." - ietf/bin/generate-wg-aliases } -fi +python -m smtpd -n -c DebuggingServer localhost:2025 & +echo -chown -R $USER /opt/home/$USER -chmod -R g+w /usr/local/lib/ # so we can patch libs if needed - -cd "/home/$USER/$CWD" || cd "/home/$USER/" - -echo "Done!" -if ! echo "$LANG" | grep "UTF-8"; then - echo "" - echo "Make sure you export LANG=en_GB.UTF-8 (or another UTF-8 locale) in your .bashrc" +if [ -z "$*" ]; then + bash else - echo "LANG=$LANG" + bash -c "$*" fi -HOME=/opt/home/$USER - -su -p $USER +service mariadb stop +service rsyslog stop \ No newline at end of file diff --git a/docker/install-extras b/docker/install-extras deleted file mode 100755 index 6c8e700dc..000000000 --- a/docker/install-extras +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -export DEBIAN_FRONTEND=noninteractive -sudo su - -c "apt-get update \ - && apt-get install -qy \ - apt-file \ - apt-show-versions \ - graphviz \ - ghostscript \ - apache2-utils \ - chromium-driver \ - enscript \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/*" diff --git a/docker/mailserver b/docker/mailserver deleted file mode 100755 index b4d8af9e7..000000000 --- a/docker/mailserver +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -version=0.10 -program=${0##*/} -progdir=${0%/*} -if [ "$progdir" = "$program" ]; then progdir="."; fi -if [ "$progdir" = "." ]; then progdir="$PWD"; fi -parent=$(dirname $progdir) -if [ "$parent" = "." ]; then parent="$PWD"; fi - -# ---------------------------------------------------------------------- - -$progdir/run python -m smtpd -n -c DebuggingServer localhost:2025 diff --git a/docker/run b/docker/run index 96d92dfec..a24993598 100755 --- a/docker/run +++ b/docker/run @@ -1,13 +1,13 @@ #!/bin/bash -version=0.10 +version=0.20 program=${0##*/} progdir=${0%/*} if [ "$progdir" = "$program" ]; then progdir="."; fi if [ "$progdir" = "." ]; then progdir="$PWD"; fi -parent=$(dirname $progdir) +parent=$(dirname "$progdir") if [ "$parent" = "." ]; then parent="$PWD"; fi -if [[ $(uname) =~ CYGWIN.* ]]; then parent=$(echo $parent | sed -e 's/^\/cygdrive\/\(.\)/\1:/'); fi +if [[ $(uname) =~ CYGWIN.* ]]; then parent=$(echo "$parent" | sed -e 's/^\/cygdrive\/\(.\)/\1:/'); fi # ---------------------------------------------------------------------- function usage() { @@ -30,10 +30,10 @@ DESCRIPTION EOF echo -e "OPTIONS" - if [ "$(uname)" = "Linux" ]; then - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' + if [ "$(uname)" = "Linux" ] || [ "$(uname)" = "Darwin" ]; then + grep -E "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" "$0" | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' else - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' + grep -E "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" "$0" | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' fi cat <<EOF @@ -47,7 +47,7 @@ COPYRIGHT Copyright (c) 2015 IETF Trust and the persons identified as authors of the code. All rights reserved. License 'Simplified BSD', as specified in http://opensource.org/licenses/BSD-3-Clause. - + EOF } @@ -58,10 +58,6 @@ function die() { exit 1 } -function note() { - if [ -n "$VERBOSE" ]; then echo -e "$*"; fi -} - # ---------------------------------------------------------------------- function version() { echo -e "$program $version" @@ -75,48 +71,32 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; # Option parsing # Options -shortopts=dhi:m:Mp:r:t:vVu:cC -longopts=download-data,help,ietfdb-url=,mysqldata=,no-mysqldir,port=,docker-repo=,tag=,verbose,version,user=,cached,no-cached +shortopts=hp:vVcC +longopts=help,port=,version,cached,no-cached # Default values MYSQLDIR=$parent/data/mysql -FILEDIR=$parent/../data/ PORT=8000 REPO="ietf/datatracker-environment" -DBURL=https://www.ietf.org/lib/dt/sprint/ietf_utf8.bin.tar.bz2 -WHO=$(whoami) -CACHED='' +CACHED=':cached' if [ "$(uname)" = "Linux" ]; then args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@") if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi eval set -- "$args" - sed="sed -r" else # Darwin, BSDs args=$(getopt -o$shortopts $SV $*) if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi set -- $args - sed="sed -E" - if [ "$(uname)" = "Darwin" ]; then - CACHED=':cached' - fi fi while true ; do case "$1" in -c| --cached) CACHED=':cached';; # Use cached disk access to reduce system load - -C| --no-cached) CACHED='';; # Use fully synchronized disk access - -d| --download-data) DOWNLOAD=1;; # Download and set up the database files + -C| --no-cached) CACHED=':consistent';; # Use fully synchronized disk access -h| --help) usage; exit;; # Show this help, then exit - -f| --filedir) FILEDIR=$2; shift;; # Set the desired location of drafts, charters etc. - -i| --ietfdb-url) DBURL=$2; shift;; # Use an alternative database tarball URL - -m| --mysqldir) MYSQLDIR=$2; shift;; # Set the desired location of MySQL's database files -p| --port) PORT=$2; shift;; # Bind the container's port 8000 to external port PORT - -r| --docker-repo) REPO=$2; shift;; # Use the given docker repository, instead of the default - -t| --tag) TAG=$2; shift;; # Use this docker image tag, instead of the svn branch name - -u| --user) WHO=$2; shift;; # Run the container as the specified user - -v| --verbose) VERBOSE=1;; # Be more talkative -V| --version) version; exit;; # Show program version, then exit --) shift; break;; *) die "Internal error, inconsistent option specification: '$1'";; @@ -125,163 +105,14 @@ while true ; do done if [ -z "$TAG" ]; then - TAG=$(basename $(svn info $parent | grep ^URL | awk '{print $2}')) + TAG=$(basename "$(svn info "$parent" | grep ^URL | awk '{print $2}')") fi # ---------------------------------------------------------------------- -# The program itself -[ -f /proc/1/cgroups ] && grep 'docker' /proc/1/cgroups && die "It looks like you're inside docker already ..." - -if [ "$(uname)" = "Darwin" ]; then - APP="/Applications/Docker.app" - CMD="open -a" -elif [ "$(uname)" = "Linux" ]; then - echo "Running on Linux." -elif [[ $(uname) =~ CYGWIN.* ]]; then - echo "Running under Cygwin." - CMD="echo" - MYSQLDIR=$(echo $MYSQLDIR | sed -e 's/^\/cygdrive\/\(.\)/\1:/') - WHO=$(echo $WHO | sed -e 's/^.*\\//' | tr -d \\r) - DRIVE=$(echo $USERPROFILE | sed -e 's/\(.\).*/\1/' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefdhijklmnopqartuvwxyz/') - HOME=$DRIVE$(echo $USERPROFILE | sed -e 's/\\/\//g' -e's/.\(.*\)/\1/') - echo "Using home dir $HOME" - PWD=$(echo $PWD | sed -e 's/^\/cygdrive\/\(.\)/\1:/') - if [ "${PWD#$HOME}" = "$PWD" ]; then - die "You must work inside your home directory ($HOME)" - fi - CGWPARENT=$(echo $parent | sed -e 's/^\(.\)\:/\/cygdrive\/\1/') - ICSFILES=$(/usr/bin/find $CGWPARENT/vzic/zoneinfo/ -name '*.ics' -print) - for ICSFILE in $ICSFILES - do - LINK=$(head -n1 $ICSFILE | sed -e '/link .*/!d' -e 's/link \(.*\)/\1/') - if [ "$LINK" ]; then - WDIR=$(dirname $ICSFILE) - echo "Replacing $(basename $ICSFILE) with $LINK" - cp -f $WDIR/$LINK $ICSFILE - fi - done -else - die "This script does not have support for your architecture ($(uname)); sorry :-(" -fi - -WHOUID=$(id -u $WHO) -WHOGID=$(id -g $WHO) - -if [ "$(uname)" = "Linux" ]; then - echo "Not trying to start a virtual docker machine on Linux" -elif [[ $(uname) =~ CYGWIN.* ]]; then - if ! docker info 1> /dev/null 2>&1; then - echo -e "The docker VM doesn't seem to be running; docker info gave:\n $info" - die "Don't know how to start docker when running under Cygwin" - fi - TAG=$(echo $TAG | tr -d \\r) - URL="http://localhost:$PORT/" -elif [ -e "$APP" ]; then - info=$(docker info 2>&1 || true) - if ! docker info 1> /dev/null 2>&1; then - echo -e "The docker VM doesn't seem to be running; docker info gave:\n $info" - echo "Will attempt to start docker by doing '\$ $CMD $APP':" - $CMD $APP - declare -i count - printf "Waiting for docker engine .." - while true; do - printf "." - sleep 2 - if docker info >/dev/null 2>&1; then break; fi - count=$(( $count + 1)) - if [ $count -gt 10 ]; then - die "No contact with docker engine; bailing out." - fi - done - fi - URL="http://localhost:$PORT/" -else - if [ $($machine status default | tr "A-Z" "a-z" ) != "running" ]; then - echo "The docker VM doesn't seem to be running; will attempt to start it by doing '\$ $machine start':" - $machine start || die "Failed taking up the Docker VM" - fi - - if [ -f "$machine" ]; then - if [ $($machine status default | tr "A-Z" "a-z") = "running" ]; then - tmpfile=$(mktemp docker.run.XXXXXXXX) - if $machine env 2>/dev/null | grep DOCKER_ > $tmpfile; then - mv $tmpfile ~/.docker-info - elif printenv | grep DOCKER_ > $tmpfile; then - mv $tmpfile ~/.docker-info - else - rm $tmpfile - die "Failed setting the appropriate DOCKER_* environment variables." - fi - . ~/.docker-info - else - rm -f ~/.docker-info - fi - ip=$($machine ip) - URL="http://$ip:$PORT/" - fi -fi - -image=$(docker ps | grep "$REPO:$TAG" | awk '{ print $1 }') -if [ "$image" ]; then - if [ "$*" ]; then - echo "Running 'cd ~/${parent#$HOME/}; $*'" - docker exec -u "$WHO" -t $image bash -i -c "cd; cd \"${parent#$HOME/}\"; $*" - else - docker exec -u "$WHO" -ti $image bash -i - fi -else - echo "" - echo "Starting a docker container for '$TAG'." - - if [ -n "$DOWNLOAD" ]; then - ( - cd "$(dirname $MYSQLDIR)" - wget -N "$DBURL" && tar xjf ietf_utf8.bin.tar.bz2 && chmod -R go+rwX mysql - ) - [ -d "$MYSQLDIR" ] || die "The download seems to have failed; still no $MYSQLDIR. Giving up." - else - [ -d "$MYSQLDIR" ] || die "Expected $MYSQLDIR to exist, but it\ndidn't. Use '$program -d' to download and unpack the database." - fi - - if ! docker images "$REPO" | grep -q "$TAG"; then - echo "Fetching docker image '$REPO:$TAG'" - if ! docker pull "$REPO:$TAG"; then - docker pull "$REPO:latest" || die "Failed to pull down the '$REPO:latest' docker image" - id=$(docker images "$REPO" | grep latest | awk '{print $3}') - echo "Tagging $REPO:latest as $REPO:$TAG for use as environment for this branch." - docker tag $id "$REPO:$TAG" - fi - fi - - echo -e "\nThe web interface for 'runserver' should appear on $URL\n" - echo -e "User $WHO ($WHOUID:$WHOGID)" - if [ -z "$MYSQLDIR" ]; then - docker run -ti -p $PORT:8000 -v "$HOME:/home/$WHO$CACHED" \ - -e USER="$WHO" -e DATADIR="${parent#$HOME/}/data" -e CWD="${PWD#$HOME/}" \ - -e TAG="$TAG" -e FILEDIR=${FILEDIR#$HOME} -e UID="$WHOUID" -e GID="$WHOGID" \ - "$REPO:$TAG" "$@" - else - docker run -ti -p $PORT:8000 -v "$HOME:/home/$WHO$CACHED" \ - -v "$MYSQLDIR:/var/lib/mysql" -e USER="$WHO" \ - -e DATADIR="${parent#$HOME/}/data" -e CWD="${PWD#$HOME/}" -e TAG="$TAG" \ - -e FILEDIR=${FILEDIR#$HOME} -e UID="$WHOUID" -e GID="$WHOGID" \ - "$REPO:$TAG" "$@" - fi - - echo "" - echo "Committing changes in the container to an image:" - image=$( docker images -q $REPO:$TAG) - latest=$(docker ps -lq -f "ancestor=$image") - docker commit $latest $REPO:$TAG - - echo "" - echo "Cleaning up containers and images" - docker rm $latest - DANGLING=$( docker images -f dangling=true -q ) - if [ -n "$DANGLING" ]; then - echo "Dangling images: $DANGLING" - docker rmi -f $DANGLING - fi - -fi +echo "Starting a docker container for '$REPO:$TAG'." +mkdir -p "$MYSQLDIR" +docker run -ti -p "$PORT":8000 -p 33306:3306 \ + -v "$parent:/root/src$CACHED" \ + -v "$MYSQLDIR:/var/lib/mysql:delegated" \ + "$REPO:$TAG" "$@" \ No newline at end of file diff --git a/docker/setprompt b/docker/setprompt deleted file mode 100644 index 62ce46000..000000000 --- a/docker/setprompt +++ /dev/null @@ -1,26 +0,0 @@ - -# set a fancy prompt -PS_TIME="\A " - -if [ "$(whoami)" = "root" ]; then - PS_COLOUR='\[\033[1;31m\]' - PS_END="\[\033[m\]" -else - PS_COLOUR="\[\033[1;34m\]" - PS_END="\[\033[m\]" -fi - -if [ "$TERM" = xterm ]; then - PS_XTERM="\[\033]0;\]\h:\w\007" -else - PS_XTERM="" -fi -COLOUR_RED='\[\033[1;31m\]' -COLOUR_BLK='\[\033[1;30m\]' -if [ "$SHLVL" -gt 1 ]; then - PS_SHLVL="$(eval "printf '>%.0s' {2..$SHLVL}") " -else - PS_SHLVL="" -fi - -PS1="$PS_XTERM\n$COLOUR_RED$PS_SHLVL$PS_COLOUR$PS_TIME$COLOUR_RED$PS_COLOUR${VIRTUAL_ENV:+$COLOUR_RED($(basename $VIRTUAL_ENV))$PS_COLOUR }\w\n\u @ $COLOUR_BLK\h$PS_COLOUR \\$ $PS_END" diff --git a/docker/setupdb b/docker/setupdb deleted file mode 100755 index 9d517d044..000000000 --- a/docker/setupdb +++ /dev/null @@ -1,114 +0,0 @@ -#!/bin/bash - -version=0.10 -program=${0##*/} -progdir=${0%/*} -if [ "$progdir" = "$program" ]; then progdir="."; fi -if [ "$progdir" = "." ]; then progdir="$PWD"; fi -parent=$(dirname $progdir) -if [ "$parent" = "." ]; then parent="$PWD"; fi - -# ---------------------------------------------------------------------- -function usage() { - cat <<EOF -NAME - $program - Set up a local copy of the IETF database MySQL files - -SYNOPSIS - $program [OPTIONS] ARGS - -DESCRIPTION - - This script downloads a prebuilt copy of the IETF database MySQL - files, ready for mapping into the /var/lib/mysql/ directory of the - ietf/database-environment Docker image. - -EOF - echo -e "OPTIONS" - if [ "$(uname)" = "Linux" ]; then - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' - else - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' - fi - cat <<EOF - -FILES - -AUTHOR - Written by Henrik Levkowetz, <henrik@levkowetz.com> - -COPYRIGHT - - Copyright (c) 2015 IETF Trust and the persons identified as authors of - the code. All rights reserved. License 'Simplified BSD', as specified - in http://opensource.org/licenses/BSD-3-Clause. - -EOF - -} - -# ---------------------------------------------------------------------- -function die() { - echo -e "\n$program: error: $*" >&2 - exit 1 -} - -function note() { - if [ -n "$VERBOSE" ]; then echo -e "$*"; fi -} - -# ---------------------------------------------------------------------- -function version() { - echo -e "$program $version" -} - -# ---------------------------------------------------------------------- -trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR - - -# ---------------------------------------------------------------------- -# Option parsing - -# Options -shortopts=hvV -longopts=help,verbose,version - -if [ "$(uname)" = "Linux" ]; then - args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@") - if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi - eval set -- "$args" - sed="sed -r" -else - # Darwin, BSDs - args=$(getopt -o$shortopts $SV $*) - if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi - set -- $args - sed="sed -E" -fi - -while true ; do - case "$1" in - -h| --help) usage; exit;; # Show this help, then exit - -v| --verbose) VERBOSE=1;; # Be more talkative - -V| --version) version; exit;; # Show program version, then exit - --) shift; break;; - *) die "Internal error, inconsistent option specification: '$1'";; - esac - shift -done - -# ---------------------------------------------------------------------- -# The program itself - -[ -n "$MYSQLDIR" ] || MYSQLDIR=$parent/data/mysql -[ -n "$URL" ] || URL=rsync.ietf.org::dev.db/ietf_utf8.bin.tar.bz2 - -cd $(dirname $MYSQLDIR) -echo "Downloading a MySQL database image ..." -set $(rsync --version | head -n1 | awk '{print $3}' | tr '.' ' ') -maj=$1; min=$2; fix=$3 -if [ "$maj" -ge "3" -a "$min" -ge "1" ]; then - rsync --info=progress2 $URL ./ && echo -e "\nUnpacking database ..." && tar xjf ietf_utf8.bin.tar.bz2 && echo "Fixing permissions ..." && chmod -R go+rwX mysql -else - rsync -v $URL ./ && echo -e "\nUnpacking database ..." && tar xjf ietf_utf8.bin.tar.bz2 && echo "Fixing permissions ..." && chmod -R go+rwX mysql -fi diff --git a/docker/updatedb b/docker/updatedb index 595f3f73d..b1fda05b5 100755 --- a/docker/updatedb +++ b/docker/updatedb @@ -1,12 +1,12 @@ #!/bin/bash # -*- indent-with-tabs: 1 -*- -version=0.10 +version=0.20 program=${0##*/} progdir=${0%/*} if [ "$progdir" = "$program" ]; then progdir="."; fi if [ "$progdir" = "." ]; then progdir="$PWD"; fi -parent=$(dirname $progdir) +parent=$(dirname "$progdir") if [ "$parent" = "." ]; then parent="$PWD"; fi # ---------------------------------------------------------------------- @@ -26,9 +26,9 @@ DESCRIPTION EOF echo -e "OPTIONS" if [ "$(uname)" = "Linux" ]; then - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' + grep -E "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" "$0" | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/' else - egrep "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' + grep -E "^[ ]+[-][A-Za-z| -]+\*?\)[ ]+[A-Za-z].+#" "$0" | sed 's/\|.*\$2[^#]*#/ /'| sed -E 's/\|.*\)[^#]*#/ /' fi cat <<EOF @@ -42,21 +42,17 @@ COPYRIGHT Copyright (c) 2015 IETF Trust and the persons identified as authors of the code. All rights reserved. License 'Simplified BSD', as specified in http://opensource.org/licenses/BSD-3-Clause. - + EOF } # ---------------------------------------------------------------------- function die() { - echo -e "\n$program: error: $*" >&2 + echo -e "\n$program: error: $*" >&2 exit 1 } -function note() { - if [ -n "$VERBOSE" ]; then echo -e "$*"; fi -} - # ---------------------------------------------------------------------- function version() { echo -e "$program $version" @@ -71,24 +67,21 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; # Options shortopts=DLZhqvV -longopts=no-download,no-load,no-zap,help,quiet,verbose,version +longopts=no-download,no-load,no-zap,help,version LOAD=1 DOWNLOAD=1 DROP=1 -QUIET="" if [ "$(uname)" = "Linux" ]; then args=$(getopt -o "$shortopts" --long "$longopts" -n "$program" -- $SV "$@") if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi eval set -- "$args" - sed="sed -r" else # Darwin, BSDs args=$(getopt -o$shortopts $SV $*) if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi set -- $args - sed="sed -E" fi while true ; do @@ -97,8 +90,6 @@ while true ; do -L| --no-load) LOAD=""; ;; # Don't load the database -Z| --no-zap) DROP="";; # Don't drop new tables -h| --help) usage; exit;; # Show this help, then exit - -q| --quiet) QUIET="-q";; # Don't show progress - -v| --verbose) VERBOSE=1;; # Be more talkative -V| --version) version; exit;; # Show program version, then exit --) shift; break;; *) die "Internal error, inconsistent option specification: '$1'";; @@ -109,50 +100,27 @@ done # ---------------------------------------------------------------------- # The program itself -echo "Gathering info ..." -MYSQLDIR="$(/usr/sbin/mysqld --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')" -MYSQLDIR=${MYSQLDIR%/} DATADIR=$parent/data -# echo "Checking if MySQL base data exists ..." -# if [ ! -d $MYSQLDIR/mysql ]; then -# die "Expected the directory $MYSQLDIR/mysql/ to exist -- have you downloaded and unpacked the IETF binary database tarball?" -# fi - - -# echo "Checking if the IETF database exists at $MYSQLDIR ..." -# if [ ! -d $MYSQLDIR/ietf_utf8 ]; then -# echo "Creating database ..." -# mysqladmin -u root --default-character-set=utf8 create ietf_utf8 -# -# echo "Setting up permissions ..." -# mysql -u root ietf_utf8 <<< "GRANT ALL PRIVILEGES ON ietf_utf8.* TO django@localhost IDENTIFIED BY 'RkTkDPFnKpko'; FLUSH PRIVILEGES;" -# fi - +DUMP=ietf_utf8.sql.gz if [ "$DOWNLOAD" ]; then - echo "Fetching database dump ..." - wget $QUIET -N -P $DATADIR https://www.ietf.org/lib/dt/sprint/ietf_utf8.sql.gz || die "No new data, quitting." + echo "Fetching database dump..." + rsync --info=progress2 rsync.ietf.org::dev.db/$DUMP "$DATADIR" fi if [ "$LOAD" ]; then - echo "Loading database ..." - if [ -z "$QUIET" ]; then - gunzip < $DATADIR/ietf_utf8.sql.gz \ - | pv --progress --bytes --rate --eta --size $(gzip --list --quiet $DATADIR/ietf_utf8.sql.gz | awk '{ print $2 }') \ - | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \ - | $parent/ietf/manage.py dbshell - else - gunzip < $DATADIR/ietf_utf8.sql.gz \ - | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \ - | $parent/ietf/manage.py dbshell - fi - + echo "Loading database..." + SIZE=$(pigz --list "$DATADIR/$DUMP" | tail -n 1 | awk '{ print $2 }') + pigz -d < "$DATADIR/$DUMP" \ + | pv --progress --bytes --rate --eta --size "$SIZE" \ + | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \ + | "$parent/ietf/manage.py" dbshell fi if [ "$DROP" ]; then - echo "Dropping tables not in the dump (so migrations can succeed) ..." - diff <(zcat $DATADIR/ietf_utf8.sql.gz | grep '^DROP TABLE IF EXISTS' | tr -d '`;' | awk '{ print $5 }') \ - <($parent/ietf/manage.py dbshell <<< 'show tables;' | tail -n +2) \ + echo "Dropping tables not in the dump (so migrations can succeed)..." + diff <(pigz -d -c "$DATADIR/$DUMP" | grep '^DROP TABLE IF EXISTS' | tr -d '`;' | awk '{ print $5 }') \ + <("$parent/ietf/manage.py" dbshell <<< 'show tables;' | tail -n +2) \ | grep '^>' | awk '{print "drop table if exists", $2, ";";}' \ - | tee >(cat >&2) | $parent/ietf/manage.py dbshell + | tee >(cat >&2) | "$parent/ietf/manage.py" dbshell fi \ No newline at end of file