282 lines
7.7 KiB
Bash
Executable file
282 lines
7.7 KiB
Bash
Executable file
#!/bin/bash
|
||
|
||
set -u
|
||
set -e
|
||
|
||
bold=$(tput bold)
|
||
normal=$(tput sgr0)
|
||
|
||
|
||
PYTHON_BIN='python3'
|
||
|
||
function help () {
|
||
if [[ $# -gt 1 ]]; then
|
||
CMD="print_${2}_help"
|
||
$CMD
|
||
else
|
||
print_help
|
||
fi
|
||
}
|
||
|
||
|
||
function print_help () {
|
||
cat <<- EOF
|
||
|
||
${bold}NAME${normal}
|
||
${bold}orchestra-admin${normal} - Orchetsra administration script
|
||
|
||
${bold}OPTIONS${normal}
|
||
${bold}install_requirements${normal}
|
||
Installs Orchestra requirements using apt-get and pip
|
||
|
||
${bold}install_postfix${normal}
|
||
Installs postfix packages including dovecot, amavis, spamassassin and clamav
|
||
|
||
${bold}uninstall_postfix${normal}
|
||
Uninstall postfix packages including dovecot, amavis, spamassassin and clamav
|
||
|
||
${bold}install_certificate${normal}
|
||
Installs a valid all-purpose self signed certificate that is valid for the next ten years
|
||
|
||
${bold}uninstall_certificate${normal}
|
||
Uninstall certificate
|
||
|
||
${bold}startproject${normal}
|
||
Creates a new Django-orchestra instance
|
||
|
||
${bold}help${normal}
|
||
Displays this help text or related help page as argument
|
||
for example:
|
||
${bold}orchestra-admin help startproject${normal}
|
||
|
||
EOF
|
||
}
|
||
# in
|
||
|
||
|
||
show () {
|
||
echo " ${bold}\$ ${@}${normal}"
|
||
}
|
||
export -f show
|
||
|
||
|
||
run () {
|
||
show "${@}"
|
||
"${@}"
|
||
}
|
||
export -f run
|
||
|
||
|
||
check_root () {
|
||
[ $(whoami) != 'root' ] && { echo -e "\nErr. This should be run as root\n" >&2; exit 1; }
|
||
}
|
||
export -f check_root
|
||
|
||
|
||
get_orchestra_dir () {
|
||
if ! $(echo "import orchestra" | $PYTHON_BIN 2> /dev/null); then
|
||
echo -e "\norchestra not installed.\n" >&2
|
||
exit 1
|
||
fi
|
||
PATH=$(echo "import orchestra, os; print(os.path.dirname(os.path.realpath(orchestra.__file__)))" | $PYTHON_BIN)
|
||
echo $PATH
|
||
}
|
||
export -f get_orchestra_dir
|
||
|
||
|
||
function print_install_requirements_help () {
|
||
cat <<- EOF
|
||
|
||
${bold}NAME${normal}
|
||
${bold}orchetsra-admin install_requirements${normal} - Installs all Orchestra requirements using apt-get and pip
|
||
|
||
${bold}OPTIONS${normal}
|
||
${bold}-t, --testing${normal}
|
||
Install Orchestra normal requirements plus those needed for running functional tests
|
||
|
||
${bold}-h, --help${normal}
|
||
Displays this help text
|
||
|
||
EOF
|
||
}
|
||
|
||
|
||
function install_requirements () {
|
||
opts=$(getopt -o h,t -l help,testing -- "$@") || exit 1
|
||
set -- $opts
|
||
testing=false
|
||
|
||
while [ $# -gt 0 ]; do
|
||
case $1 in
|
||
-h|--help) print_deploy_help; exit 0 ;;
|
||
-t|--testing) testing=true; shift ;;
|
||
(--) shift; break;;
|
||
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
|
||
(*) break;;
|
||
esac
|
||
shift
|
||
done
|
||
unset OPTIND
|
||
unset opt
|
||
|
||
check_root || true
|
||
ORCHESTRA_PATH=$(get_orchestra_dir) || true
|
||
|
||
# TODO reduce this list to 0
|
||
# include /usr/sbin/named-checkzone
|
||
# wkhtmltopdf -> reportlab
|
||
# remove rabbit, postgres
|
||
# uwsgi –py-autoreload for devel
|
||
APT="python3 \
|
||
python3-pip \
|
||
python3-psycopg2 \
|
||
python3-lxml \
|
||
python3-dev \
|
||
bind9utils \
|
||
python3-cracklib \
|
||
libz-dev \
|
||
wkhtmltopdf \
|
||
xvfb \
|
||
ca-certificates \
|
||
gettext"
|
||
|
||
# TODO remove celery deps, django 1.8.1, glic3rinu fork, celery email
|
||
PIP="django==1.8.1 \
|
||
django-celery-email==1.0.4 \
|
||
https://github.com/glic3rinu/django-fluent-dashboard/archive/master.zip \
|
||
https://bitbucket.org/izi/django-admin-tools/get/a0abfffd76a0.zip \
|
||
IPy==0.81 \
|
||
django-extensions==1.5.2 \
|
||
django-transaction-signals==1.0.0 \
|
||
django-celery==3.1.16 \
|
||
celery==3.1.16 \
|
||
kombu==3.0.23 \
|
||
billiard==3.3.0.18 \
|
||
Markdown==2.4 \
|
||
djangorestframework==3.1.1 \
|
||
paramiko==1.15.1 \
|
||
ecdsa==0.11 \
|
||
Pygments==1.6 \
|
||
django-filter==0.9.2 \
|
||
passlib==1.6.2 \
|
||
jsonfield==0.9.22 \
|
||
python-dateutil==2.4.2 \
|
||
django-iban==0.3.0 \
|
||
requests \
|
||
phonenumbers \
|
||
django-countries \
|
||
django-localflavor \
|
||
pip==6.0.8"
|
||
|
||
if $testing; then
|
||
APT="${APT} \
|
||
iceweasel \
|
||
dnsutils"
|
||
PIP="${PIP} \
|
||
selenium \
|
||
xvfbwrapper \
|
||
freezegun \
|
||
coverage \
|
||
flake8 \
|
||
django-debug-toolbar==1.3.0 \
|
||
https://github.com/django-nose/django-nose/archive/master.zip \
|
||
sqlparse \
|
||
pyinotify \
|
||
PyMySQL"
|
||
fi
|
||
|
||
# Make sure locales are in place before installing postgres
|
||
if [[ $({ perl --help > /dev/null; } 2>&1|grep 'locale failed') ]]; then
|
||
run sed -i "s/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" /etc/locale.gen
|
||
run locale-gen
|
||
update-locale LANG=en_US.UTF-8
|
||
fi
|
||
|
||
run apt-get update
|
||
run apt-get install -y $APT
|
||
|
||
# Install ca certificates before executing pip install
|
||
if [[ ! -e /usr/local/share/ca-certificates/cacert.org ]]; then
|
||
mkdir -p /usr/local/share/ca-certificates/cacert.org
|
||
wget -P /usr/local/share/ca-certificates/cacert.org \
|
||
http://www.cacert.org/certs/root.crt \
|
||
http://www.cacert.org/certs/class3.crt
|
||
update-ca-certificates
|
||
fi
|
||
|
||
run pip3 install $PIP
|
||
|
||
# Patch passlib
|
||
IMPORT="from django.contrib.auth.hashers import mask_hash, _"
|
||
COLLECTIONS="from collections import OrderedDict"
|
||
PASSLIB_PATH=$(python3 -c "from passlib.ext.django import utils; print(utils.__file__)")
|
||
sed -i "s/${IMPORT}, SortedDict/${IMPORT}\n ${COLLECTIONS}/" $PASSLIB_PATH
|
||
sed -i "s/SortedDict/OrderedDict/g" $PASSLIB_PATH
|
||
}
|
||
export -f install_requirements
|
||
|
||
|
||
print_startproject_help () {
|
||
cat <<- EOF
|
||
|
||
${bold}NAME${normal}
|
||
${bold}orchestra-admin startproject${normal} - Create a new Django-Orchestra instance
|
||
|
||
${bold}SYNOPSIS${normal}
|
||
Options: [ -h ]
|
||
|
||
${bold}OPTIONS${normal}
|
||
${bold}-h, --help${normal}
|
||
This help message
|
||
|
||
${bold}EXAMPLES${normal}
|
||
orchestra-admin startproject controlpanel
|
||
|
||
EOF
|
||
}
|
||
|
||
|
||
function startproject () {
|
||
local PROJECT_NAME="$2"; shift
|
||
|
||
opts=$(getopt -o h -l help -- "$@") || exit 1
|
||
set -- $opts
|
||
|
||
set -- $opts
|
||
while [ $# -gt 0 ]; do
|
||
case $1 in
|
||
-h|--help) print_startproject_help; exit 0 ;;
|
||
(--) shift; break;;
|
||
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
|
||
(*) break;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
unset OPTIND
|
||
unset opt
|
||
|
||
[ $(whoami) == 'root' ] && { echo -e "\nYou don't want to run this as root\n" >&2; exit 1; }
|
||
ORCHESTRA_PATH=$(get_orchestra_dir) || { echo "Error getting orchestra dir"; exit 1; }
|
||
if [[ ! -e $PROJECT_NAME/manage.py ]]; then
|
||
run django-admin.py startproject $PROJECT_NAME --template="${ORCHESTRA_PATH}/conf/project_template"
|
||
# This is a workaround for this issue https://github.com/pypa/pip/issues/317
|
||
run chmod +x $PROJECT_NAME/manage.py
|
||
# End of workaround ###
|
||
else
|
||
echo "Not cloning: $PROJECT_NAME already exists."
|
||
fi
|
||
# Install bash autocompletition for django commands
|
||
if [[ ! $(grep 'source $HOME/.django_bash_completion.sh' ~/.bashrc &> /dev/null) ]]; then
|
||
# run wget https://raw.github.com/django/django/master/extras/django_bash_completion \
|
||
# --no-check-certificate -O ~/.django_bash_completion.sh
|
||
cp ${ORCHESTRA_PATH}/bin/django_bash_completion.sh ~/.django_bash_completion.sh
|
||
echo 'source $HOME/.django_bash_completion.sh' >> ~/.bashrc
|
||
fi
|
||
}
|
||
export -f startproject
|
||
|
||
|
||
[ $# -lt 1 ] && print_help
|
||
$1 "${@}"
|