django-orchestra/orchestra/bin/orchestra-admin

292 lines
8.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 \
postgresql \
rabbitmq-server \
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 \
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
# TODO remove
# Some versions of rabbitmq-server will not start automatically by default unless ...
sed -i "s/# Default-Start:.*/# Default-Start: 2 3 4 5/" /etc/init.d/rabbitmq-server
sed -i "s/# Default-Stop:.*/# Default-Stop: 0 1 6/" /etc/init.d/rabbitmq-server
run update-rc.d rabbitmq-server defaults
# Patch passlib
# TODO discover locaion by importing it
IMPORT="from django.contrib.auth.hashers import mask_hash, _"
COLLECTIONS="from collections import OrderedDict"
ls /usr/local/lib/python*/dist-packages/passlib/ext/django/utils.py \
| xargs sed -i "s/${IMPORT}, SortedDict/${IMPORT}\n ${COLLECTIONS}/"
ls /usr/local/lib/python*/dist-packages/passlib/ext/django/utils.py \
| xargs sed -i "s/SortedDict/OrderedDict/g"
}
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 "${@}"