#!/bin/sh # rCTF installation script set -e fg_cyan="\033[36m" bold_fg_white="\033[1;37m" bg_red="\033[41m" reset="\033[0m" error() { # shellcheck disable=SC2059 printf "${bg_red}${bold_fg_white}%s %s${reset}\n" "[-]" "$*" 1>&2 } info() { # shellcheck disable=SC2059 printf "${fg_cyan}%s %s${reset}\n" "[*]" "$*" } get_key() { head -c 32 /dev/urandom | base64 -w 0 } do_install() { info "Installing rCTF..." if [ ! "$(id -u)" = 0 ]; then error "You must run this script as root." exit 1 fi if [ ! -x "$(command -v curl)" ]; then error "curl is not available. You must have curl to install rCTF." exit 1 fi RCTF_INSTALL_PATH="${RCTF_INSTALL_PATH:-"/opt/rctf"}" if [ ! -d "$(dirname "$RCTF_INSTALL_PATH")" ]; then error "The parent of \$RCTF_INSTALL_PATH ($(dirname "$RCTF_INSTALL_PATH")) does not exist." exit 1 fi if [ -d "$RCTF_INSTALL_PATH" ]; then error "rCTF appears to already be installed in ${RCTF_INSTALL_PATH}" info "... If you're trying to start rCTF, run 'docker-compose up -d'." info "... If you're trying to reinstall rCTF, 'rm -rf $RCTF_INSTALL_PATH' then re-run this script." exit 1 fi mkdir "$RCTF_INSTALL_PATH" cd "$RCTF_INSTALL_PATH" info "Installing dependencies..." if [ ! -x "$(command -v docker)" ]; then curl -fsS https://get.docker.com | sh fi if [ ! -x "$(command -v docker-compose)" ]; then curl -fsSLo /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" chmod +x /usr/local/bin/docker-compose fi info "Configuring rCTF..." RCTF_GIT_REF="${RCTF_GIT_REF:-"master"}" mkdir -p conf.d data/rctf-postgres data/rctf-redis printf "%s\n" \ "RCTF_DATABASE_PASSWORD=$(get_key)" \ "RCTF_REDIS_PASSWORD=$(get_key)" \ "RCTF_GIT_REF=$RCTF_GIT_REF" \ > .env printf "%s\n" \ "ctfName: rCTF" \ "meta:" \ " description: 'A description of your CTF'" \ " imageUrl: 'https://example.com'" \ "homeContent: 'A description of your CTF. Markdown supported.'" \ > conf.d/01-ui.yaml printf "%s\n" \ "origin: http://127.0.0.1:8080" \ "divisions:" \ " open: Open" \ "tokenKey: '$(get_key)'" \ "startTime: $(date +%s)000" \ "endTime: $(date -d +1week +%s)000" \ > conf.d/02-ctf.yaml printf "%s\n" \ "database:" \ " sql:" \ " host: postgres" \ " user: rctf" \ " database: rctf" \ " redis:" \ " host: redis" \ " migrate: before" \ > conf.d/03-db.yaml info "Downloading rCTF..." curl -fsSO "https://raw.githubusercontent.com/redpwn/rctf/$RCTF_GIT_REF/docker-compose.yml" docker-compose pull info "Finished installation to ${RCTF_INSTALL_PATH}." printf "Would you like to start rCTF now (y/N)? " read -r result