2014-05-08 16:59:35 +00:00
#!/bin/bash
set -u
bold=$(tput bold)
normal=$(tput sgr0)
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 2> /dev/null); then
echo -e "\nErr. orchestra not installed.\n" >&2
exit 1
fi
PATH=$(echo "import orchestra, os; print os.path.dirname(os.path.realpath(orchestra.__file__))" | python)
echo $PATH
}
export -f get_orchestra_dir
function print_install_requirements_help () {
2014-09-24 20:09:41 +00:00
cat <<- EOF
2014-05-08 16:59:35 +00:00
${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
ORCHESTRA_PATH=$(get_orchestra_dir)
APT="python-pip \
python-psycopg2 \
postgresql \
rabbitmq-server \
python-dev \
bind9utils \
2014-07-29 14:37:25 +00:00
python-cracklib \
2014-10-04 14:19:29 +00:00
libz-dev \
2014-07-29 14:37:25 +00:00
libxml2-dev \
2014-08-29 12:45:27 +00:00
libxslt1-dev \
wkhtmltopdf \
2014-10-07 13:08:59 +00:00
xvfb \
python-mysqldb"
2014-05-08 16:59:35 +00:00
2014-09-03 13:56:02 +00:00
PIP="django==1.7 \
2014-07-18 15:32:27 +00:00
django-celery-email==1.0.4 \
2014-05-08 16:59:35 +00:00
django-fluent-dashboard==0.3.5 \
https://bitbucket.org/izi/django-admin-tools/get/a0abfffd76a0.zip \
IPy==0.81 \
django-extensions==1.1.1 \
django-transaction-signals==1.0.0 \
2014-07-08 15:19:15 +00:00
django-celery==3.1.10 \
2014-09-08 14:23:06 +00:00
celery==3.1.13 \
2014-10-04 14:19:29 +00:00
kombu==3.0.23 \
billiard==3.3.0.18 \
2014-05-08 16:59:35 +00:00
Markdown==2.4 \
2014-07-08 15:19:15 +00:00
djangorestframework==2.3.14 \
2014-10-04 13:23:04 +00:00
paramiko==1.15.1 \
2014-10-04 14:19:29 +00:00
ecdsa==0.11 \
2014-05-08 16:59:35 +00:00
Pygments==1.6 \
django-filter==0.7 \
2014-07-23 16:24:56 +00:00
passlib==1.6.2 \
2014-07-29 14:37:25 +00:00
jsonfield==0.9.22 \
2014-09-02 15:48:07 +00:00
lxml==3.3.5 \
2014-10-04 14:19:29 +00:00
python-dateutil==2.2 \
django-iban==0.3.0"
2014-05-08 16:59:35 +00:00
if $testing; then
APT="${APT} \
2014-10-04 21:29:05 +00:00
iceweasel \
dnsutils"
2014-05-08 16:59:35 +00:00
PIP="${PIP} \
selenium \
2014-09-24 20:09:41 +00:00
xvfbwrapper \
2014-10-03 14:02:11 +00:00
freezegun \
2014-10-03 17:37:36 +00:00
coverage \
2014-10-04 17:40:13 +00:00
orchestra-orm==dev \
django-debug-toolbar==1.2.1 \
django-nose==1.2 \
sqlparse"
2014-05-08 16:59:35 +00:00
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
2014-10-04 21:29:05 +00:00
run pip install $PIP --allow-external orchestra-orm --allow-unverified orchestra-orm
2014-05-08 16:59:35 +00:00
2014-10-04 21:29:05 +00:00
# Install ca certificates
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
2014-05-08 16:59:35 +00:00
# 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
2014-10-04 21:29:05 +00:00
# Patch passlib
IMPORT="from django.contrib.auth.hashers import mask_hash, _"
COLLECTIONS="from collections import OrderedDict"
sed -i "s/${IMPORT}, SortedDict/${IMPORT}\n ${COLLECTIONS}/" \
/usr/local/lib/python2.7/dist-packages/passlib/ext/django/utils.py
sed -i "s/SortedDict/OrderedDict/g" \
/usr/local/lib/python2.7/dist-packages/passlib/ext/django/utils.py
2014-10-04 21:31:00 +00:00
# Patch dateutil
sed -i "s/elif not isinstance(dt2, datetime.datetime):/else:/" \
/usr/local/lib/python2.7/dist-packages/dateutil/relativedelta.py
sed -i "s/if not type(dt1) == type(dt2): #isinstance(dt1, type(dt2)):/if not isinstance(dt2, type(dt1)):/" \
/usr/local/lib/python2.7/dist-packages/dateutil/relativedelta.py
2014-05-08 16:59:35 +00:00
}
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
function print_install_certificate_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin install_certificate${normal} - Installs a valid all-purpose self signed certificate that is valid for the next ten years
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
2014-09-24 20:09:41 +00:00
2014-05-08 16:59:35 +00:00
function install_certificate () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
run openssl req -new -x509 -days 3650 -nodes -newkey rsa:4096 -out /etc/ssl/certs/mailserver.pem -keyout /etc/ssl/private/mailserver.pem
run chmod go= /etc/ssl/private/mailserver.pem
}
export -f install_certificate
function print_uninstall_certificate_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin uninstall_certificate${normal} - Remove self signed certificate
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function uninstall_certificate () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
run rm -f /etc/ssl/private/mailserver.pem
}
export -f uninstall_certificate
function print_install_postfix_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin install_postfix${normal} - Installs postfix server and its dependencies (dovecot, amavis, spamassassin and clamav) using apt-get. Also it generates a valid all-purpose certificate self signed that is valid for the next ten years.
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function install_postfix () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
2014-09-24 20:09:41 +00:00
2014-05-08 16:59:35 +00:00
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
ORCHESTRA_PATH=$(get_orchestra_dir)
APT="postfix postfix-pgsql \
swaks \
dovecot-core dovecot-pop3d dovecot-imapd dovecot-antispam \
dovecot-pgsql dovecot-sieve dovecot-managesieved dovecot-solr \
amavisd-new spamassassin \
clamav-freshclam clamav-base clamav clamav-daemon clamav-testfiles \
"
run apt-get update
export DEBIAN_FRONTEND=noninteractive
run apt-get install -y $APT
unset $DEBIAN_FRONTEND;
run /usr/bin/freshclam
run apt-get --purge remove 'exim4*' -y
if [ ! -f /etc/ssl/private/mailserver.pem ]; then
install_certificate
fi;
}
export -f install_postfix
2014-09-24 20:09:41 +00:00
2014-05-08 16:59:35 +00:00
function print_uninstall_postfix_help () {
cat <<- EOF
${bold}NAME${normal}
${bold}orchetsra-admin uninstall_postfix${normal} - Uninstalls postfix server and its dependencies (dovecot, amavis, spamassassin and clamav) using dpkg and remove self signed certificate
${bold}OPTIONS${normal}
${bold}-h, --help${normal}
Displays this help text
EOF
}
function uninstall_postfix () {
opts=$(getopt -o h -l help -- "$@") || exit 1
set -- $opts
while [ $# -gt 0 ]; do
case $1 in
-h|--help) print_deploy_help; exit 0 ;;
(--) shift; break;;
(-*) echo "$0: Err. - unrecognized option $1" 1>&2; exit 1;;
(*) break;;
esac
shift
done
unset OPTIND
unset opt
check_root
ORCHESTRA_PATH=$(get_orchestra_dir)
APT="postfix postfix-pgsql \
swaks \
dovecot-core dovecot-pop3d dovecot-imapd dovecot-antispam \
dovecot-pgsql dovecot-sieve dovecot-managesieved dovecot-solr \
amavisd-new spamassassin \
clamav-freshclam clamav-base clamav clamav-daemon libclamav6 clamav-testfiles \
"
run dpkg -P --force-depends $APT
run apt-get update
run apt-get -f install -y
if [ -d /var/run/amavis ]; then
run rm -rf /var/run/amavis
fi;
if [ -d /var/lib/clamav ]; then
run rm -rf /var/lib/clamav
fi;
if [ -f /etc/ssl/private/mailserver.pem ]; then
uninstall_certificate
fi;
}
export -f uninstall_postfix
[ $# -lt 1 ] && print_help
$1 "${@}"