repo-cloner/dockerbin/wizzard

214 lines
5.0 KiB
Plaintext
Raw Normal View History

2018-02-09 11:49:16 +01:00
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
2018-02-23 11:28:45 +01:00
# if started as root
if [ $UID -eq 0 ]
then
chown executor:executor /data
su executor -c wizzard
exit $?
fi
2018-02-23 10:38:47 +01:00
dir_prefix=cloner
2018-02-09 11:49:16 +01:00
function die(){
echo $@ 1>&2
exit 1
}
function checkProjectName(){
# check, if volume does not exist yet
name=$1
# should not be empty
[ -n "$read_project_name" ] || die "Empty project name is not allowed"
2018-02-23 10:38:47 +01:00
if [ -d /data/$dir_prefix-$name ]
2018-02-09 11:49:16 +01:00
then
die "Target volume for project '$name' exists - please try again!"
fi
}
function createConfigFile(){
# creates config file, writes it to $1 location
loc=$1
# vars
local tmpl_name=$read_project_name
local tmpl_url=$read_url
local tmpl_interval=$read_interval
local tmpl_submodules=$read_submodules
if [ $read_submodule_limit = "N" ]
then
local tmpl_submodules_depth_enabled='# '
local tmpl_submodules_depth=50000
else
local tmpl_submodules_depth_enabled=''
local tmpl_submodules_depth=$read_submodule_limit
fi
cat > $loc <<-EOF
# cloner.cfg
# main config
# created at $(date +"%Y-%m-%d %X")
# main url - url of main repo - just to clone
cloner_repo_url=$tmpl_url
# project name (names of volumes are derrived from this
cloner_project_name=$tmpl_name
# cloner interval (in minutes, default=0 - run always)
cloner_interval=$tmpl_interval
# do you need submodules support? (1/0)
cloner_submodules=$tmpl_submodules
# max depth of submodule scan (default = unlimited, uncomment to use)
${tmpl_submodules_depth_enabled}cloner_submodule_depth=$tmpl_submodules_depth
EOF
}
function createDetectorConfig(){
# $1 - file
local cfgFile=$1
mkdir -p $(dirname $cfgFile)
if [ $read_detector -eq 1 ]
then
cat > $cfgFile <<-EOF
# this file is config for detector
# now, it is empty - to disable detector, just delete it!
EOF
fi
}
2018-02-09 11:49:16 +01:00
function generateSSHKey(){
# generates ssh key with $1 path and $2 description
local keyfile=$1/id_rsa
local description=$2
echo "Creating SSH deployment key.."
ssh-keygen -f $keyfile -b 4096 -C "$description" -N ""
echo
echo "Public key is:"
echo "-----------------------------------------------------"
cat $keyfile.pub
echo "-----------------------------------------------------"
echo -n "Please make sure that key is set up at your git hosting and press enter.."
read
}
function reuseSSHKey(){
# pastes ssh key to file $1 with vim
local keyfile=$1
local scratch=$(mktemp)
echo "# Please paste private ssh key here and save this file" > $scratch
vim $scratch
sed -e 's/#.*$//' $scratch > $keyfile
rm $scratch
echo "Checking key..."
2018-02-23 11:28:45 +01:00
chmod 0700 $keyfile
2018-02-23 10:38:47 +01:00
ssh-keygen -y -f $keyfile -P "" || true # will fail in the end, so script will continue and clean up the mess
2018-02-09 11:49:16 +01:00
}
# start reading vars
echo -n "Enter project name: "
read read_project_name
checkProjectName "$read_project_name"
# repository URL
echo -n "Enter git repository URL: "
read read_url
[ -n "$read_url" ] || die "Empty url is not allowed!"
# check interval
echo -n "Enter check interval in minutes [5]: "
read read_interval
[ -n "$read_interval" ] || read_interval=5
[[ "$read_interval" =~ ^[0-9]+$ ]] || echo "Entered interval is not number. Try again.."
# submodule use
echo -n "Mirror including submodules? [Y/n]"
read read_submodules
[ -n "$read_submodules" ] || read_submodules=Y
[[ "$read_submodules" =~ ^[Yy]$ ]] && read_submodules=1 || read_submodules=0
# submodule limit
if [ $read_submodules -eq 1 ]
then
echo -n "Limit for submodule discovery [<number>/N]: "
read read_submodule_limit
[ -n "$read_submodule_limit" ] || read_submodule_limit=N
if ! [[ "$read_submodule_limit" =~ ^[Nn]$ ]]
then
[[ "$read_submodule_limit" =~ ^[0-9]+$ ]] || die "Submodule limit must be n,N or number!"
fi
else
read_submodule_limit=N
fi
# determine CI?
echo -n "Do you want to enable CI support? (detector) [Y/n]"
read read_detector
[ -n "$read_detector" ] || read_detector=Y
if ! [[ "$read_detector" =~ ^[Yy]$ ]]
then
read_detector=0
else
read_detector=1
fi
2018-02-23 10:38:47 +01:00
root=/data/$dir_prefix-$read_project_name
2018-02-09 11:49:16 +01:00
# start generating config
2018-02-23 10:38:47 +01:00
mkdir -p $root/config
createConfigFile $root/config/cloner.cfg
2018-02-09 11:49:16 +01:00
# use ssh config?
echo -n "Would you like to use SSH auth? ([C]reate new key/[U]se existing key/[N]o) [C/u/n]: "
read read_ssh
[ -n "$read_ssh" ] || read_ssh=C
[[ "$read_ssh" =~ ^[CcUuNn]$ ]] || die "Invalid SSH key option, script is exiting now.."
# ssh resolutions?
# create dir if needed
2018-02-23 10:38:47 +01:00
[[ "$read_ssh" =~ ^[nN]$ ]] || mkdir -p $root/config/auth/ssh
2018-02-09 11:49:16 +01:00
# generate new key
if [[ "$read_ssh" =~ ^[Cc]$ ]]
then
# create key
2018-02-23 10:38:47 +01:00
generateSSHKey $root/config/auth/ssh "cloner-deploy-key-$read_project_name"
2018-02-09 11:49:16 +01:00
fi
# use existing key
if [[ "$read_ssh" =~ ^[Uu]$ ]]
then
# load key
2018-02-23 10:38:47 +01:00
reuseSSHKey $root/config/auth/ssh/id_rsa
2018-02-09 11:49:16 +01:00
fi
2018-02-09 11:49:16 +01:00
echo "First run - initialization of repos..."
2018-02-23 10:38:47 +01:00
if ! env BASE=$root run-checker
2018-02-09 11:49:16 +01:00
then
2018-02-23 10:38:47 +01:00
echo -n "First run failed - remove directory? [Y/n]"
2018-02-09 11:49:16 +01:00
read read_cleanup
[ -n "$read_cleanup" ] || read_cleanup=Y
if [[ "$read_cleanup" =~ ^[Yy]$ ]]
then
2018-02-23 10:38:47 +01:00
rm -Rf $root
2018-02-09 11:49:16 +01:00
fi
else
createDetectorConfig $root/config/detector.cfg
2018-02-09 11:49:16 +01:00
echo "Setup has finished!"
2018-02-23 10:38:47 +01:00
touch $root/.enabled
2018-02-09 11:49:16 +01:00
fi