#!/bin/bash set -e cecho() { local code="\033[" case "$1" in black | bk) color="${code}0;30m";; red | r) color="${code}1;31m";; green | g) color="${code}1;32m";; yellow | y) color="${code}1;33m";; blue | b) color="${code}1;34m";; purple | p) color="${code}1;35m";; cyan | c) color="${code}1;36m";; gray | gr) color="${code}0;37m";; *) local text="$1" esac [ -z "$text" ] && local text="$color$2${code}0m" echo -e "$text" } do_install_instance() { NGINX_PORT=${NGINX_PORT-80} NGINX_AVAILABLE_PATH='/etc/nginx/sites-available' NGINX_ENABLE_PATH='/etc/nginx/sites-enabled' UWSGI_AVAILABLE_PATH='/etc/uwsgi/apps-available' UWSGI_ENABLE_PATH='/etc/uwsgi/apps-enabled' PG_VERSION=9.4 POSTGIS_VERSION=2.3.1 cat >&2 <<-'EOF' ******************************************************************************* ++++++ Ishtar instance installation script ++++++ ******************************************************************************* EOF # check user user="$(id -un 2>/dev/null || true)" sh_c='sh -c' if [ "$user" != 'root' ]; then if command_exists sudo; then sh_c='sudo -E sh -c' elif command_exists su; then sh_c='su -c' else cecho r " Error: this installer needs the ability to run commands as root." cecho r " We are unable to find either "sudo" or "su" available to make this happen." exit 1 fi fi export LANG=fr_FR.UTF-8 if [ "$(locale 2>&1 >/dev/null|wc -l)" != 0 ]; then cecho r "Unable to set LANG=$LANG properly" cecho "Try: 'dpkg-reconfigure locales' or install the 'locales-all' package" exit 1 fi if [ ! -z '$CONFIG_PATH' ]; then CONFIG_PATH="/etc/ishtar/" fi if [ ! -f $CONFIG_PATH/config ]; then echo ""; cecho r ""$CONFIG_PATH" is not a valid config file." echo "Have you properly install Ishtar sources?" echo "Run ishtar-install before this script."; echo ""; exit 1; fi source $CONFIG_PATH/config cd $ISHTAR_PATH INSTANCES_FILE=$CONFIG_PATH/instances if [ ! -f $INSTANCES_FILE ]; then touch $INSTANCES_FILE fi if [ -z '$INSTANCE' ]; then if [ -d "$INSTANCE" ]; then cecho "Sorry, $INSTANCE already exists." echo "Give another code name." exit 1 fi else INSTANCE='' cat >&2 <<-'EOF' ------------------------------------------------------------------------------- You should select a code name for this instance. This code name should have only lower alphanumeric characters, with no spaces, no accents and should not begin with an alphabetical character. The only special character allowed is "_". EOF while [ "$INSTANCE" == '' ] do read -p "* Which instance code name? [my_ishtar_instance] " choice if [ -z "$choice" ]; then INSTANCE='my_ishtar_instance' else INSTANCE=$choice fi if [ -d "$INSTANCE" ]; then echo "Sorry, $INSTANCE already exists. Give another name." INSTANCE='' fi done fi if [ ! -z '$URL' ]; then URL='' cat >&2 <<-'EOF' ------------------------------------------------------------------------------- You should select an url to join your instance. Only a full domain is accepted. Don't forget to set up your DNS to point this url name to this server. Only put the url not the protocol part (no http://). For instance: ishtar.mydomain.org EOF while [ "$URL" == '' ] do read -p "* Which url? " choice URL=$choice done fi DEST=$ISHTAR_PATH cat >&2 <<-'EOF' ------------------------------------------------------------------------------- EOF echo "Preparing ishtar instance: $INSTANCE under $DEST" echo "" # register instance echo "$INSTANCE" >> $INSTANCES_FILE mkdir -p /var/log/django chown root:www-data /var/log/django touch "/var/log/django/ishtar-$INSTANCE.log" chown root:www-data "/var/log/django/ishtar-$INSTANCE.log" chmod g+w "/var/log/django/ishtar-$INSTANCE.log" echo " * duplicate example_project into our instance" # Duplicate example_project into our instance: cd $ISHTAR_PATH cp -ra example_project $INSTANCE rm $INSTANCE/settings.py ln -s $DEST/example_project/settings.py $DEST/$INSTANCE/settings.py # Permissions: mkdir -p -m 755 "$INSTANCE/media" mkdir -p -m 755 "$INSTANCE/media/imported" mkdir -p -m 755 "$INSTANCE/media/upload" chown -R www-data:www-data "$INSTANCE/media" # Preparing DB: DB_HOST=${ISHTAR_DB-127.0.0.1} DB_PORT=${ISHTAR_DB_PORT-5432} DB_PASSWORD=${DB_PASSWORD-''} DB_NAME="ishtar-$INSTANCE" # Generate a password on the fly if none was specified: if [ -z "$DB_PASSWORD" ]; then DB_PASSWORD=$(apg -a 0 -M ncl -n 1 -x 10 -m 10) fi export PG_VERSION DB_HOST DB_PORT DB_PASSWORD DB_NAME POSTGIS_VERSION su postgres <<'EOF' echo " * Checking template_postgis" if ! psql -l | grep -qs template_postgis; then echo " - not present, creating" createdb -E UTF8 template_postgis psql -d postgres -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis'" psql -q -d template_postgis -f /usr/share/postgresql/$PG_VERSION/extensions/postgis--$POSTGIS_VERSION.sql psql -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;" psql -d template_postgis -c "GRANT ALL ON geography_columns TO PUBLIC;" psql -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;" else echo " - already present" fi echo " * Checking database $DB_NAME" if ! psql -l | grep -qs "$DB_NAME"; then echo " - not present, creating" createuser --echo --adduser --createdb --encrypted $DB_NAME psql --command "ALTER USER \""$DB_NAME"\" with password '"$DB_PASSWORD"';" createdb -T template_postgis --echo --owner $DB_NAME --encoding UNICODE $DB_NAME psql -d $DB_NAME -c "CREATE EXTENSION postgis;" else echo " - already present" fi EOF ### LOCAL SETTINGS echo " * creating config files" # Set some variables to avoid changing sed calls too much compared to # the initial install/install.sh script: INSTALL_PATH=$DEST INSTALL_PREFIX=$DEST APP_DIR="$DEST/$INSTANCE" DATE=`date +%F` SECRET_KEY=$(apg -a 0 -M ncl -n 1 -x 10 -m 40) PORT_FILE=$CONFIG_PATH/last_uswgi_port if [ -f $PORT_FILE ]; then UWSGI_PORT=`cat $PORT_FILE` UWSGI_PORT=`expr $UWSGI_PORT + 1` else UWSGI_PORT=8889 fi echo $UWSGI_PORT > $PORT_FILE ### local_settings.py sed -s "s|#APP_NAME#|$INSTANCE|g;\ s|#INSTALL_PATH#|$INSTALL_PATH|g;\ s|#DB_HOST#|$DB_HOST|g;\ s|#DB_NAME#|$DB_NAME|g;\ s|#DB_PORT#|$DB_PORT|g;\ s|#DB_PASSWORD#|$DB_PASSWORD|g;\ s|#URL#|$URL|g;\ s|#APP_DIR#|$APP_DIR|g;\ s|#SECRET_KEY#|$SECRET_KEY|g;" \ "install/local_settings.py.sample" > \ "$INSTANCE/local_settings.py" if [ -f $CONFIG_PATH"extra_settings.py" ]; then cat $CONFIG_PATH"extra_settings.py" >> "$INSTANCE/local_settings.py" fi ### UWSGI sed -s "s|#APP_NAME#|$INSTANCE|g;\ s|#INSTALL_PREFIX#|$INSTALL_PREFIX|g;\ s|#URL#|$URL|g;\ s|#UWSGI_PORT#|$UWSGI_PORT|g;" \ "install/uwsgi.ini.template" > \ "$INSTANCE/uwsgi.ini" ln -sf "$DEST/$INSTANCE/uwsgi.ini" \ "$UWSGI_AVAILABLE_PATH/ishtar-$INSTANCE.ini" ln -sf "$UWSGI_AVAILABLE_PATH/ishtar-$INSTANCE.ini" \ "$UWSGI_ENABLE_PATH/ishtar-$INSTANCE.ini" ### NGINX sed -s "s|#APP_NAME#|$INSTANCE|g;\ s|#UWSGI_PORT#|$UWSGI_PORT|g;\ s|#NGINX_PORT#|$NGINX_PORT|g;\ s|#INSTALL_PATH#|$INSTALL_PATH|g;\ s|#URL#|$URL|g;" \ "install/nginx.conf.template" > \ "$INSTANCE/nginx.conf" ln -sf "$DEST/$INSTANCE/nginx.conf" \ "$NGINX_AVAILABLE_PATH/ishtar-$INSTANCE.conf" ln -sf "$NGINX_AVAILABLE_PATH/ishtar-$INSTANCE.conf" \ "$NGINX_ENABLE_PATH/ishtar-$INSTANCE.conf" echo " * collect static data" cd $INSTANCE ./manage.py collectstatic --noinput > /dev/null cd - # only language available LOCALE=fr echo " * compile translations" for d in archaeological_* ishtar_common; do cd $d ../$INSTANCE/manage.py compilemessages -l $LOCALE cd - done ### DB feeding cd $INSTANCE echo " * db feeding" echo " - migrations" ./manage.py migrate echo " - loading fixtures" FIXTURES="$DEST/fixtures/initial_data-auth-fr.json $DEST/ishtar_common/fixtures/initial_data-fr.json $DEST/ishtar_common/fixtures/initial_importtypes-fr.json $DEST/archaeological_operations/fixtures/initial_data-fr.json $DEST/archaeological_context_records/fixtures/initial_data-fr.json $DEST/archaeological_files/fixtures/initial_data-fr.json $DEST/archaeological_finds/fixtures/initial_data-fr.json $DEST/archaeological_warehouse/fixtures/initial_data-fr.json" for data in $FIXTURES; do echo $data; ./manage.py loaddata $data; done echo " - create superuser" ./manage.py createsuperuser echo " - post install script" cd .. python install/post_install_script.py cat >&2 <<-'EOF' ------------------------------------------------------------------------------- EOF cecho g " Your instance has been configured." cecho g " * instance name: "$INSTANCE cecho g " * url: "$URL cat >&2 <<-'EOF' You should restart uwsgi and nginx: systemctl restart uwsgi nginx And then enjoy ishtar! EOF } do_install_instance