#!/bin/bash # # mksite-helper v0.2: common functions for mksite scripts # feedback: rhatto at riseup.net | gpl # # This is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software # Foundation; either version 2 of the License, or any later version. # # This software is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with # this program; if not, write to the Free Software Foundation, Inc., 59 Temple # Place - Suite 330, Boston, MA 02111-1307, USA # # # conventions: every function name prefixed with mksite_ # uppercase for global variables, lower for local ones # TMP="/tmp" MKSITE_BASE="/etc/mksite" MKSITE_CONF="$MKSITE_BASE/mksite.conf" function mksite_safe_exit { # # description: remove the lockfile and exit # usage: mksite_safe_exit # depends on: $LOCKFILE # if [ "$LOCK" != "0" ] && [ -f "$LOCKFILE" ]; then rm $LOCKFILE fi exit $1 } function mksite_create_tmpfile { # # description: create a file with sane permissions # usage: mksite_create_tmpfile # touch $1 && chmod 600 $1 if [ ! -f "$1" ]; then echo $MESSAGE_ERROR_TMP_FILE return 1 fi } function mksite_eval_param { # # eval parameters from a config file # usage: mksite_eval_param # if [ ! -f "$1" ]; then echo $MESSAGE_CONFIG_NOT_FOUND return 1 elif [ -z "$2" ]; then echo $MESSAGE_EVAL_PARAM_MISSING return 1 fi echo `grep -e "^$2=" $1 | cut -d = -f 2 | sed -e 's/"//g' -e "s/'//g" | cut -d "#" -f 1` } function mksite_eval_config { # # evaluates mksite.conf # usage: mksite_eval_config # if [ ! -f "$MKSITE_CONF" ]; then echo $MESSAGE_CONFIG_NOT_FOUND mksite_safe_exit 1 fi # main settings LANG="`mksite_eval_param $MKSITE_CONF LANG`" if [ -z "$LANG" ]; then LANG="en" fi PROJECT="`mksite_eval_param $MKSITE_CONF PROJECT`" if [ -z "$PROJECT" ]; then echo $MESSAGE_CONFIG_ERROR PROJECT $MESSAGE_NOT_SET mksite_safe_exit 1 fi DOMAIN="`mksite_eval_param $MKSITE_CONF DOMAIN`" if [ -z "$DOMAIN" ]; then echo $MESSAGE_CONFIG_ERROR DOMAIN $MESSAGE_NOT_SET mksite_safe_exit 1 fi MAILING_LIST="`mksite_eval_param $MKSITE_CONF MAILING_LIST`" if [ -z "$MAILING_LIST" ]; then echo $MESSAGE_CONFIG_ERROR MAILING_LIST $MESSAGE_NOT_SET mksite_safe_exit 1 fi IP="`mksite_eval_param $MKSITE_CONF IP`" if [ -z "$IP" ]; then echo $MESSAGE_CONFIG_ERROR IP $MESSAGE_NOT_SET mksite_safe_exit 1 fi STATS="`mksite_eval_param $MKSITE_CONF STATS`" if [ -z "$STATS" ]; then echo $MESSAGE_CONFIG_ERROR STATS $MESSAGE_NOT_SET mksite_safe_exit 1 fi HOME="`mksite_eval_param $MKSITE_CONF HOME`" if [ -z "$HOME" ]; then echo $MESSAGE_CONFIG_ERROR HOME $MESSAGE_NOT_SET mksite_safe_exit 1 fi RESERVED_PROJECT_NAMES="`mksite_eval_param $MKSITE_CONF RESERVED_PROJECT_NAMES`" USER_SIMPLEPKG="`mksite_eval_param $MKSITE_CONF USE_SIMPLEPKG`" AUTO_GEN_PASSWORDS="`mksite_eval_param $MKSITE_CONF AUTO_GEN_PASSWORDS`" if [ -z "$AUTO_GEN_PASSWORDS" ]; then AUTO_GEN_PASSWORDS="1" fi # apache settings APACHE_USER="`mksite_eval_param $MKSITE_CONF APACHE_USER`" if [ -z "$APACHE_USER" ]; then echo $MESSAGE_CONFIG_ERROR APACHE_USER $MESSAGE_NOT_SET mksite_safe_exit 1 fi APACHE_GROUP="`mksite_eval_param $MKSITE_CONF APACHE_GROUP`" if [ -z "$APACHE_GROUP" ]; then echo $MESSAGE_CONFIG_ERROR APACHE_GROUP $MESSAGE_NOT_SET mksite_safe_exit 1 fi VHOST_DIR="`mksite_eval_param $MKSITE_CONF VHOST_DIR`" if [ -z "$VHOST_DIR" ]; then echo $MESSAGE_CONFIG_ERROR VHOST_DIR $MESSAGE_NOT_SET mksite_safe_exit 1 fi APACHE_CONFIGTEST="`mksite_eval_param $MKSITE_CONF APACHE_CONFIGTEST`" if [ -z "$APACHE_CONFIGTEST" ]; then echo $MESSAGE_CONFIG_ERROR APACHE_CONFIGTEST $MESSAGE_NOT_SET mksite_safe_exit 1 fi APACHE_RESTART="`mksite_eval_param $MKSITE_CONF APACHE_RESTART`" if [ -z "$APACHE_RESTART" ]; then echo $MESSAGE_CONFIG_ERROR APACHE_RESTART $MESSAGE_NOT_SET mksite_safe_exit 1 fi # database settings DB_HOST="`mksite_eval_param $MKSITE_CONF DB_HOST`" if [ -z "$DB_HOST" ]; then echo $MESSAGE_CONFIG_ERROR DB_HOST $MESSAGE_NOT_SET mksite_safe_exit 1 fi DB_SUPERUSER="`mksite_eval_param $MKSITE_CONF DB_SUPERUSER`" if [ -z "$DB_SUPERUSER" ]; then DB_SUPERUSER="root" fi # DB_PREFIX can be empty DB_PREFIX="`mksite_eval_param $MKSITE_CONF DB_PREFIX`" DB_USER_WITH_DB_PREFIX="`mksite_eval_param $MKSITE_CONF DB_USER_WITH_DB_PREFIX`" if [ -z "$DB_USER_WITH_DB_PREFIX" ]; then DB_USER_WITH_DB_PREFIX="0" fi # mksite config GROUP="`mksite_eval_param $MKSITE_CONF GROUP`" if [ -z "$GROUP" ]; then echo $MESSAGE_CONFIG_ERROR GROUP $MESSAGE_NOT_SET mksite_safe_exit 1 fi SHELL="`mksite_eval_param $MKSITE_CONF SHELL`" if [ -z "$SHELL" ]; then echo $MESSAGE_CONFIG_ERROR SHELL $MESSAGE_NOT_SET mksite_safe_exit 1 fi PORTAL="`mksite_eval_param $MKSITE_CONF PORTAL`" if [ -z "$PORTAL" ]; then echo $MESSAGE_CONFIG_ERROR PORTAL $MESSAGE_NOT_SET mksite_safe_exit 1 fi PROJECT_DOMAIN="`mksite_eval_param $MKSITE_CONF PROJECT_DOMAIN`" if [ -z "$PROJECT_DOMAIN" ]; then echo $MESSAGE_CONFIG_ERROR PROJECT_DOMAIN $MESSAGE_NOT_SET mksite_safe_exit 1 fi SFTP_PORT="`mksite_eval_param $MKSITE_CONF SFTP_PORT`" if [ -z "$SFTP_PORT" ]; then echo $MESSAGE_CONFIG_ERROR SFTP_PORT $MESSAGE_NOT_SET mksite_safe_exit 1 fi # mksite-proxy-sync INSTANCES_BASE_DIR="`mksite_eval_param $MKSITE_CONF INSTANCES_BASE_DIR`" VHOST_PROXY_RELOAD="`mksite_eval_param $MKSITE_CONF VHOST_PROXY_RELOAD`" # wiki config MKWIKI="`mksite_eval_param $MKSITE_CONF MKWIKI`" if [ -z "$MKWIKI" ]; then MKWIKI="mkpmwiki" fi MKSITE_CONFIG_EVALUATED="yes" } function mksite_eval_site_config { # # usage: mksite_eval_site_config # # sample config file # # DOMAIN="projeto.org" # domínio principal do projeto (sitio.projeto.org) # SERVER_ALIAS="www.opa com alternativo.net" # nomes alternativos para o domínio do site # CONTACT="email@contato.net" # email de contato com o grupo hospedado # SITE="html" # pasta onde o sítio html é acessível # DOCROOT="drupal" # qual site será usado como página principal # DATABASES="prefixo_sitio prefixo_sitio1" # bancos de dados em uso # ALIAS="/pasta:/home/sitio/site/projeto" # mapeia http://sitio.projeto.org/pasta para a pasta projeto/ # DRUPAL="drupal:4.6.6 drupal1:4.7 # nome das instalações de drupal # WIKI="wiki wiki1" # nome das instalações de wiki # MOIN="moin moin1" # nome das instalações de moin local domain var_global var_global="DOMAIN SERVER_ALIAS CONTACT SITE DOCROOT DATABASES" domain="`mksite_eval_param $1 DOMAIN`" if [ -z "$domain" ]; then DOMAIN="`mksite_eval_param $MKSITE_CONF DOMAIN`" if [ -z "$DOMAIN" ]; then echo $MESSAGE_CONFIG_ERROR DOMAIN $MESSAGE_NOT_SET mksite_safe_exit 1 fi else DOMAIN="$domain" fi SERVER_ALIAS="`mksite_eval_param $1 SERVER_ALIAS`" CONTACT="`mksite_eval_param $1 CONTACT`" SITE="`mksite_eval_param $1 SITE`" DOCROOT="`mksite_eval_param $1 DOCROOT`" DATABASES="`mksite_eval_param $1 DATABASES`" SITE_CONFIG_EVALUATED="yes" } function mksite_gen_vhost { # # usage: mksite_gen_vhost # var_global="SITE DOMAIN DOCROOT SERVER_ALIAS" var_local="docroot plugin plugin_name plugin_type plugin_instance_dir instances instance" var_local="$var_local instance_version tmpfile alias_def alias_orig alias_dest plugin_conf plugin_vhost" unset $var_local local $var_local if [ ! -f "$1" ]; then echo $MESSAGE_CONFIG_NOT_FOUND return 1 elif [ -z "$VHOST_DIR" ]; then echo $MESSAGE_VHOST_DIR_NOT_DEFINED return 1 elif [ ! -d "$VHOST_DIR" ]; then mkdir -p $VHOST_DIR fi USER="`basename $1`" tmpfile="$TMP/$USER-vhost.tmp" mksite_create_tmpfile $tmpfile if [ "$MKSITE_CONFIG_EVALUATED" != "yes" ]; then mksite_eval_config fi if [ "$SITE_CONFIG_EVALUATED" != "yes" ]; then mksite_eval_site_config $1 fi # begin the virtual host definition echo "# begin vhost for $USER" > $tmpfile echo "" >> $tmpfile echo " ServerName $USER.$DOMAIN" >> $tmpfile if [ ! -z "$SERVER_ALIAS" ]; then echo " ServerAlias $SERVER_ALIAS" >> $tmpfile fi echo "" >> $tmpfile # add a block definition for each installed app for plugin in `ls $MKSITE_BASE/defaults/plugins/*conf | sed -e 's/.conf$//'`; do plugin="`basename $plugin`" if [ -f "$MKSITE_BASE/plugins/$plugin.conf" ]; then plugin_conf="$MKSITE_BASE/plugins/$plugin.conf" else plugin_conf="$MKSITE_BASE/defaults/plugins/$plugin.conf" fi if [ -f "$MKSITE_BASE/plugins/$plugin.vhost" ]; then plugin_vhost="$MKSITE_BASE/plugins/$plugin.vhost" else plugin_vhost="$MKSITE_BASE/defaults/plugins/$plugin.vhost" fi source $plugin_conf plugin_name="`echo $plugin | tr '[:lower:]' '[:upper:]'`" plugin_type="$PLUGIN_TYPE" instances="`mksite_eval_param $1 $plugin_name`" if [ ! -z "$instances" ]; then echo " # begin $plugin config" >> $tmpfile unset PLUGIN_VHOST PLUGIN_DOCROOT PLUGIN_NO_DOCROOT source $plugin_vhost for instance in $instances; do # adjust $PLUGIN_DIR according $PLUGIN_DIR_TYPE and instance version # PLUGIN_DIR_TYPE is version or symlink: PLUGIN_DIR should be changed to $PLUGIN_DIR-$instance_version if [ ! -z "$PLUGIN_VERSION" ]; then PLUGIN_DIR="`mksite_eval_param $plugin_conf PLUGIN_DIR`" instance_version="`echo $instance | cut -d : -f 2`" instance="`echo $instance | cut -d : -f 1`" if [ "$PLUGIN_DIR_TYPE" != "none" ]; then PLUGIN_DIR="$PLUGIN_DIR-$instance_version" fi fi if [ ! -d "$PLUGIN_DIR" ]; then echo $MESSAGE_WARNING $PLUGIN_DIR: $MESSAGE_FOLDER_NOT_EXIST fi if [ "$instance" == "$plugin" ]; then plugin_instance_dir="$PLUGIN_DIR/$USER" else plugin_instance_dir="$PLUGIN_DIR/$USER/$instance" fi if [ "$DOCROOT" == "$instance" ]; then docroot="found" if [ ! -z "$PLUGIN_DOCROOT" ]; then echo "${PLUGIN_DOCROOT[@]}" | sed -e "s/\[\[$plugin-dir\]\]/`echo $PLUGIN_DIR | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin-instance-dir\]\]/`echo $plugin_instance_dir | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin\]\]/$instance/g" >> $tmpfile fi else if [ ! -z "$PLUGIN_NO_DOCROOT" ]; then echo "${PLUGIN_NO_DOCROOT[@]}" | sed -e "s/\[\[$plugin-dir\]\]/`echo $PLUGIN_DIR | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin-instance-dir\]\]/`echo $plugin_instance_dir | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin\]\]/$instance/g" >> $tmpfile fi fi if [ "$plugin_type" == "local" ]; then if [ ! -z "$PLUGIN_VHOST" ]; then echo "${PLUGIN_VHOST[@]}" | sed -e "s/\[\[$plugin-dir\]\]/`echo $PLUGIN_DIR | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin-instance-dir\]\]/`echo $plugin_instance_dir | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin\]\]/$instance/g" >> $tmpfile fi fi done if [ "$plugin_type" == "global" ]; then if [ ! -z "$PLUGIN_VHOST" ]; then echo "${PLUGIN_VHOST[@]}" | sed -e "s/\[\[$plugin-dir\]\]/`echo $PLUGIN_DIR | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin-instance-dir\]\]/`echo $plugin_instance_dir | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin\]\]/$instance/g" >> $tmpfile fi fi echo " # end $plugin config" >> $tmpfile echo "" >> $tmpfile unset PLUGIN_TYPE PLUGIN_DIR PLUGIN_DIR_TYPE PLUGIN_VERSION elif [ "$plugin" == "site" ]; then unset PLUGIN_VHOST PLUGIN_DOCROOT PLUGIN_NO_DOCROOT source $plugin_conf source $plugin_vhost echo " # begin site config" >> $tmpfile instance="site" ; plugin="site" ; plugin_dir="$PLUGIN_DIR" echo "${PLUGIN_VHOST[@]}" | sed -e "s/\[\[$plugin-dir\]\]/`echo $PLUGIN_DIR | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin-instance-dir\]\]/`echo $plugin_instance_dir | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin\]\]/$instance/g" >> $tmpfile echo " # end site config" >> $tmpfile echo "" >> $tmpfile unset PLUGIN_TYPE PLUGIN_DIR PLUGIN_DIR_TYPE PLUGIN_VERSION fi done # in case a docroot wasnt found if [ "$docroot" != "found" ]; then if [ ! -d "$HOME/$USER/site" ]; then echo $MESSAGE_WARNING $HOME/$USER/site: $MESSAGE_FOLDER_NOT_EXIST fi unset PLUGIN_VHOST PLUGIN_DOCROOT PLUGIN_NO_DOCROOT source $plugin_conf source $plugin_vhost instance="site" ; plugin="site" echo "${PLUGIN_DOCROOT[@]}" | sed -e "s/\[\[$plugin-dir\]\]/`echo $PLUGIN_DIR | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin-instance-dir\]\]/`echo $plugin_instance_dir | sed -e 's/\//\\\\\//g'`/" \ -e "s/\[\[$plugin\]\]/\/$instance/" >> $tmpfile echo "" >> $tmpfile fi # alias block if grep -qe "^ALIAS=" $1; then echo " # begin alias config" >> $tmpfile for alias_def in `mksite_eval_param $1 ALIAS`; do unset alias_orig alias_dest alias_orig="`echo $alias_def | cut -d : -f 1`" alias_dest="`echo $alias_def | cut -d : -f 2`" if [ ! -z "$alias_orig" ] && [ ! -z "$alias_dest" ]; then echo " Alias $alias_orig $alias_dest" >> $tmpfile else echo $MESSAGE_ERROR $MESSAGE_ALIAS_ERROR fi done echo " # end alias config" >> $tmpfile fi # end virtual host definition echo "" >> $tmpfile echo "# end vhost for $USER" >> $tmpfile mv $tmpfile $VHOST_DIR/$USER if [ ! -f "$VHOST_DIR/$USER" ]; then echo $MESSAGE_ERROR_CREATING_VHOST $USER fi unset $var_local unset var_local var_global } function mksite_gen_proxy_vhost { # # usage: gen_proxy_vhost # var_global="SITE DOMAIN SERVER_ALIAS" var_local="tmpfile" unset $var_local local $var_local USER="`basename $1`" if [ -f "$MKSITE_BASE/plugins/proxy.conf" ]; then source $MKSITE_BASE/plugins/proxy.conf else echo $MESSAGE_CONFIG_NOT_FOUND $MKSITE_BASE/plugins/proxy.conf return 1 fi if [ ! -f "$1" ]; then echo $MESSAGE_CONFIG_NOT_FOUND return 1 elif [ -z "$PROXY_VHOST_DIR" ]; then echo $MESSAGE_PROXY_VHOST_DIR_UNDEFINED return 1 fi if [ ! -d "$PROXY_VHOST_DIR" ]; then mkdir -p $PROXY_VHOST_DIR fi tmpfile="$TMP/$USER-proxy_vhost.tmp" touch $tmpfile && chmod 600 $tmpfile if [ ! -f "$tmpfile" ]; then echo $MESSAGE_ERROR_TMP_FILE $tmpfile return 1 fi if [ "$MKSITE_CONFIG_EVALUATED" != "yes" ]; then mksite_eval_config fi if [ "$SITE_CONFIG_EVALUATED" != "yes" ]; then mksite_eval_site_config $1 fi # begin the virtual host definition echo "# begin vhost for $site" > $tmpfile echo "" >> $tmpfile echo " ServerName $USER.$DOMAIN" >> $tmpfile if [ ! -z "$SERVER_ALIAS" ]; then echo " ServerAlias $SERVER_ALIAS" >> $tmpfile fi # add the custom proxy setting if [ -f "$MKSITE_BASE/plugins/proxy.conf" ]; then source $MKSITE_BASE/plugins/proxy.conf else source $MKSITE_BASE/defaults/plugins/proxy.conf fi if [ -f "$MKSITE_BASE/plugins/proxy.vhost" ]; then source $MKSITE_BASE/plugins/proxy.vhost else source $MKSITE_BASE/defaults/plugins/proxy.vhost fi echo "${VHOST_PROXY[@]}" >> $tmpfile # end virtual host definition echo "" >> $tmpfile echo "# end vhost for $USER" >> $tmpfile mv $tmpfile $PROXY_VHOST_DIR/$USER if [ ! -f "$PROXY_VHOST_DIR/$USER" ]; then echo $MESSAGE_ERROR_CREATING_PROXY_VHOST fi unset $var_local unset var_local var_global } function mksite_check_site_config { if [ -f "$MKSITE_BASE/sites/$USER" ]; then CONFIG_EXIST="1" fi } function mksite_check_site_folder { if [ -d "$HOME/$USER/site" ]; then FOLDER_EXIST="1" fi } function mksite_check_site_group { if ! grep -qe "^$USER:" /etc/group; then groupadd $USER fi } function mksite_check_user { if grep -qe "^$USER:" /etc/passwd; then USER_EXIST="1" fi } function mksite_regen_apache { if [ "$NORELOAD" == "0" ]; then if $APACHE_CONFIGTEST 2>& 1 | grep -q "Syntax OK"; then $APACHE_RESTART if [ "$?" != "0" ]; then echo $MESSAGE_ERROR_RESTARTING_APACHE fi else echo $MESSAGE_ERROR_CONFIGURING_APACHE fi fi } function mksite_check_vhost_exist { if [ -f "$VHOST_DIR/$USER" ]; then if sed -n "/begin vhost for $USER *$/,/end vhost for $USER *$/p" $VHOST_DIR/$USER | grep -q $USER; then VHOST_EXIST="1" elif grep -q $USER.$DOMAIN $VHOST_DIR/$USER; then # virtual host exists but not correctly delimited VHOST_EXIST="2" fi else VHOST_EXIST="0" fi } function mksite_check_proxy_vhost_exist { if [ -f "$PROXY_VHOST_DIR/$USER" ]; then if sed -n "/begin vhost for $USER *$/,/end vhost for $URL *$/p" $PROXY_VHOST_DIR/$USER | grep -q $USER; then PROXY_VHOST_EXIST="1" elif grep -q $USER.$DOMAIN $PROXT_VHOST_DIR/$USER; then # virtual host exists but not correctly delimited PROXY_VHOST_EXIST="2" fi else PROXY_VHOST_EXIST="0" fi } function mksite_write_config_file { # # write just the default site config parameters (not plugin related or aliases) # usage: mksite_write_config_file # local tmpfile tmpfile="$TMP/$USER-conf.tmp" if [ ! -z "$DOCROOT" ]; then if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^DOCROOT/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "DOCROOT=\"$DOCROOT\"" >> $MKSITE_BASE/sites/$USER else # erro return 1 fi if [ ! -z "$CONTACT" ]; then if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^CONTACT/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "CONTACT=\"$CONTACT\"" >> $MKSITE_BASE/sites/$USER else # erro return 1 fi if [ ! -z "$DOMAIN" ]; then if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^DOMAIN/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "DOMAIN=\"$DOMAIN\"" >> $MKSITE_BASE/sites/$USER fi if [ ! -z "$SERVER_ALIAS" ]; then if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^SERVER_ALIAS/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "SERVER_ALIAS=\"$SERVER_ALIAS\"" >> $MKSITE_BASE/sites/$USER fi if [ ! -z "$SITE" ]; then if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^SITE/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "SITE=\"$SITE\"" >> $MKSITE_BASE/sites/$USER else if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^SITE/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "SITE=\"site\"" >> $MKSITE_BASE/sites/$USER fi if [ ! -z "$DATABASES" ]; then if [ -f "$MKSITE_BASE/sites/$USER" ]; then mksite_create_tmpfile $tmpfile sed '/^DATABASES/d' $MKSITE_BASE/sites/$USER > $tmpfile mv $tmpfile $MKSITE_BASE/sites/$USER fi echo "DATABASES=\"$DATABASES\"" >> $MKSITE_BASE/sites/$USER fi if [ -f "$tmpfile" ]; then rm $tmpfile fi } function mksite_message_site_created { if [ -f "$MKSITE_BASE/newsite.msg" ]; then source $MKSITE_BASE/newsite.msg elif [ -f "$MKSITE_BASE/defaults/newsite.msg" ]; then source $MKSITE_BASE/defaults/newsite.msg fi } function mksite_clean_databases_array { # limpa array DATABASES para que contenha # +apenas bancos de dados existentes local database existing_databases if [ ! -z "$DATABASES" ]; then if [ -z "$EXISTING_DATABASES" ]; then mksite_get_mysql_dbs fi for database in $DATABASES; do if echo $EXISTING_DATABASES | grep -q $database; then existing_databases="$existing_databases $database" fi done DATABASES="`echo $existing_databases | sed -e 's/ / /g'`" fi } function mksite_next_available_db_name { local found n mksite_get_mysql_dbs mksite_get_mysql_users mksite_clean_databases_array # limit initital DBNAME to 50 chars if [ -z "$DB_PREFIX" ]; then DBNAME="`echo "$DB_PREFIX"_"$USER" | sed -e 's/\(^.\{50\}\).*/\1/'`" else DBNAME="`echo $USER | sed -e 's/\(^.\{50\}\).*/\1/'`" fi # limit initital DBUSER to 14 chars if [ ! -z "$DB_PREFIX" ]; then if [ "`echo $DB_USER_WITH_DB_PREFIX | tr '[:lower:]' '[:upper:]'`" == "YES" ] || [ "`echo $DB_USER_WITH_DB_PREFIX`" == "1" ]; then DBUSER="`echo "$DB_PREFIX"_"$USER" | sed -e 's/\(^.\{14\}\).*/\1/'`" else DBUSER="`echo $USER | sed -e 's/\(^.\{14\}\).*/\1/'`" fi else DBUSER="`echo $USER | sed -e 's/\(^.\{14\}\).*/\1/'`" fi if echo $EXISTING_DATABASES | grep -q $DBNAME; then found="0" ; n="0" while [ "$found" != "1" ]; do if ! echo $EXISTING_DATABASES | grep -q $DBNAME$n; then found="1" break fi ((++n)) done DBNAME="$DBNAME$n" fi if echo $EXISTING_DATABASE_USERS | grep -q $DBUSER; then found="0" ; n="0" while [ "$found" != "1" ]; do if ! echo $EXISTING_DATABASE_USERS | grep -q $DBUSER$n; then found="1" break fi ((++n)) done DBUSER="$USER$n" fi } function mksite_create_mycnf { # create a temporary .mycnf local mycnf mycnf="$1" if [ -z "$1" ]; then echo $MESSAGE_MISSING_ARGUMENTS mksite_create_mycnf mksite_safe_exit 1 fi if [ -z "$MYSQL_PASSWD" ]; then mksite_ask_db_passwd fi if [ -f $mycnf ]; then rm -f $mycnf if [ -f $cnf ]; then echo $MESSAGE_ERROR_TMP_SCRIPT mksite_safe_exit 1 fi fi touch $mycnf && chmod 700 $mycnf cat > $mycnf << EOF [mysql] host=$DB_HOST user=$DB_SUPERUSER password="$MYSQL_PASSWD" EOF } function mksite_get_mysql_users { local mycnf mycnf="$TMP/my-`date +%s`-.cnf" mksite_create_mycnf $mycnf EXISTING_DATABASE_USERS="`echo 'select user from user;' | mysql --defaults-extra-file=$mycnf -p mysql | sed -e '1d'`" if [ "$?" != "0" ]; then echo "$MESSAGE_ERROR_MYSQL select user from user;" rm -f $mycnf mksite_safe_exit 1 fi rm -f $mycnf } function mksite_get_mysql_dbs { local mycnf mycnf="$TMP/my-`date +%s`-.cnf" mksite_create_mycnf $mycnf EXISTING_DATABASES="`echo 'show databases;' | mysql --defaults-extra-file=$mycnf -p | sed -e '1d'`" if [ "$?" != "0" ]; then echo "$MESSAGE_ERROR_MYSQL show databases;" rm -f $mycnf mksite_safe_exit 1 fi rm -f $mycnf } function mksite_ask_passwd { if [ "`echo $AUTO_GEN_PASSWORDS | tr '[:lower:]' '[:upper:]'`" == "YES" ] || [ "`echo $AUTO_GEN_PASSWORDS`" == "1" ]; then PASSWD="`mksite_gen_passwd 10 15`" else passwd="0" echo $MESSAGE_CHOOSE_SAME_PASSWD while [ "$passwd" == "0" ]; do read -resp "$MESSAGE_ASK_PASSWD " PASSWD echo " " read -resp "$MESSAGE_ASK_RETYPE " PASSWD_TEMP echo " " if [ "$PASSWD" != "$PASSWD_TEMP" ]; then echo $MESSAGE_PASSWD_DONT_MATCH else passwd="1" unset PASSWD_TEMP fi done fi } function mksite_ask_db_passwd { read -resp "$MESSAGE_ASK_DB_PASS " MYSQL_PASSWD } function mksite_create_database { if [ -z "$MYSQL_PASSWD" ]; then mksite_ask_db_passwd fi # TODO: use mksite_create_mycnf? expect -nN -- << EOF log_user 0 spawn mysqladmin -u $DB_SUPERUSER -h $DB_HOST -p create $1 expect "Enter password:" send "$MYSQL_PASSWD\r" expect { "error:" { exit 1 } } EOF if [ "$?" != "0" ]; then echo $MESSAGE_ERROR_CREATE_DATABASE $1: $MESSAGE_ERROR_PASSWD, \ $CONF $MESSAGE_WRONG_PARAMETERS $MESSAGE_PERHAPS_DB_EXISTS mksite_safe_exit 1 else echo $MESSAGE_DB_CREATED fi } function mksite_grant_database { if [ -z "$MYSQL_PASSWD" ]; then mksite_ask_db_passwd fi if [ -z "$PASSWD" ]; then mksite_ask_passwd fi while [ "$PASSWD" == "$MYSQL_PASSWD" ]; do echo $MESSAGE_PASSWD_MYSQL_PASSWD mksite_ask_passwd done # TODO: use mksite_create_mycnf? expect -nN -- << EOF log_user 0 spawn mysql -u $DB_SUPERUSER -h $DB_HOST -p expect "Enter password:" send "$MYSQL_PASSWD\r" expect { "ERROR" { exit 1 } "mysql>" { send "GRANT ALL PRIVILEGES ON $1.* To $2 IDENTIFIED BY \'$PASSWD\';\r" expect { "mysql>" { send "flush privileges;\r" } "ERROR" { exit 1 } } } } EOF if [ "$?" != "0" ]; then echo $MESSAGE_ERROR_GRANT $1 $MESSAGE_TO $2: $MESSAGE_ERROR_PASSWD, \ $CONF $MESSAGE_WRONG_PARAMETERS $MESSAGE_PERHAPS_DB_EXISTS mksite_safe_exit 1 else echo $MESSAGE_DONE_GRANT $1. fi } function mksite_import_database { if [ -z "$MYSQL_PASSWD" ]; then mksite_ask_db_passwd fi # pequena gambis! dbscript="$TMP/.mkdbscript" if [ -f $dbscript ]; then rm -f $dbscript if [ -f $dbscript ]; then echo $MESSAGE_ERROR_TMP_SCRIPT mksite_safe_exit 1 fi fi touch $dbscript && chmod 700 $dbscript echo "#!/bin/bash" > $dbscript echo "mysql -u $DB_SUPERUSER -h $DB_HOST -p $1 < $2" >> $dbscript expect -nN -- << EOF log_user 0 spawn $dbscript expect "Enter password:" send "$MYSQL_PASSWD\r" expect { "error:" { exit 1 } } EOF if [ "$?" != "0" ]; then echo $MESSAGE_ERROR_IMPORT_DB $1: $MESSAGE_ERROR_PASSWD, \ $CONF $MESSAGE_WRONG_PARAMETERS $MESSAGE_PERHAPS_DB_EXISTS rm -f $dbscript mksite_safe_exit 1 else echo $MESSAGE_IMPORT_DB fi rm -f $dbscript } function mksite_check_first_time { # # description: check if is the first time a mksite script runs for this site # +and create or load the site parameters if needed # usage: mksite_check_first_time # depends on: mksite_eval_site_config, mksite_safe_exit, mksite, $MKSITE_BASE # if [ -z "$1" ]; then echo $MESSAGE_MISSING_ARGUMENTS return 1 fi # checa se o arquivo de configuracao existe mksite_check_site_config # checa se o usuario existe mksite_check_user # checa se a pastas existem mksite_check_site_folder # checa se o grupo existe mksite_check_site_group # checa se o vhost existe mksite_check_vhost_exist # assumimos que o projeto existe se ha arquivo de configuracao if [ -f "$MKSITE_BASE/sites/$1" ]; then FIRST_TIME="0" mksite_eval_site_config $MKSITE_BASE/sites/$1 # pequena verificacao do arquivo de configuracao if [ -z "$CONTACT" ] || [ -z "$DOCROOT" ]; then echo $MESSAGE_SITE_CONFIG_ERROR mksite_safe_exit 1 fi else FIRST_TIME="1" echo $MESSAGE_CREATING_SITE $1 LOCK=0 mksite $1 noreload if [ -f "$MKSITE_BASE/sites/$1" ]; then mksite_eval_site_config $MKSITE_BASE/sites/$1 # pequena verificacao do arquivo de configuracao if [ -z "$CONTACT" ] || [ -z "$DOCROOT" ]; then echo $MESSAGE_SITE_CONFIG_ERROR mksite_safe_exit 1 fi fi fi } function mksite_check_instance_exist { # # description: checks if a name is used for an instance # usage: mksite_check_instance_exist instance-name # depends on: mksite_safe_exit, $MKSITE_BASE, $USER # if [ -z "$1" ]; then echo $MESSAGE_MISSING_ARGUMENTS fi if [ "$1" == "site" ]; then echo $MESSAGE_INSTANCE_RESERVED_NAME site mksite_safe_exit 1 fi for plugin in `ls $MKSITE_BASE/defaults/plugins/*conf | sed -e 's/.conf$//'`; do plugin="`basename $plugin`" plugin_name="`echo $plugin | tr '[:lower:]' '[:upper:]'`" instances="`mksite_eval_param $MKSITE_BASE/sites/$USER $plugin_name`" for instance in $instances; do instance="`echo $instance | cut -d : -f 1`" if [ "$instance" == "$1" ]; then echo "$MESSAGE_ERROR_INSTANCE_EXISTS $instance ($plugin)" mksite_safe_exit 1 fi done done } function mksite_check_configuration { # # usage: mksite_check_configuration [plugin-name] # if [ -z "$DB_HOST" ]; then echo "$MESSAGE_CONFIG_ERROR (DB_HOST)" mksite_safe_exit 1 elif [ -z "$DB_PREFIX" ]; then echo "$MESSAGE_CONFIG_ERROR (DB_PREFIX)" mksite_safe_exit 1 elif [ -z "$IP" ]; then echo "$MESSAGE_CONFIG_ERROR (IP)" mksite_safe_exit 1 elif [ -z "$APACHE_USER" ]; then echo "$MESSAGE_CONFIG_ERROR (APACHE_USER)" mksite_safe_exit 1 elif [ -z "$APACHE_GROUP" ]; then echo "$MESSAGE_CONFIG_ERROR (APACHE_GROUP)" mksite_safe_exit 1 fi if [ ! -z "$1" ]; then if [ ! -f "$MKSITE_BASE/defaults/plugins/$1.conf" ]; then echo "$MESSAGE_CONFIG_ERROR: $MKSITE_BASE/plugins/$1.conf" mksite_safe_exit 1 fi fi } function mksite_create_lockfile { if [ -f "$1" ] && [ "$LOCK" != "0" ]; then echo $MESSAGE_LOCKFILE exit 1 elif [ "$LOCK" != "0" ]; then trap "rm -f $1" 2 15 touch $1 chmod 600 $1 fi } function mksite_set_instance_name { # # usage: mksite_set_instance_name [-n instance_name] # local plugin plugin="$1" if [ "$FIRST_TIME" == "1" ]; then if [ "$2" == "-n" ]; then if [ ! -z "$3" ]; then DOCROOT="site" INSTANCE_NAME="$3" else mk$plugin.usage mksite_safe_exit 1 fi else DOCROOT="$plugin" INSTANCE_NAME="$plugin" fi else if [ "$2" == "-n" ]; then if [ ! -z "$3" ]; then INSTANCE_NAME="$3" else mk$plugin.usage mksite_safe_exit 1 fi else INSTANCE_NAME="$plugin" fi fi if [ "$2" == "-n" ]; then mksite_check_instance_exist $INSTANCE_NAME fi } function plugin_download_install { # download and install a plugin # usage: plugin_download_install local url version plugin plugin_dir ext tarflag plugin="$1" if [ -f "$MKSITE_BASE/plugins/$plugin.conf" ]; then plugin_conf="$MKSITE_BASE/plugins/$plugin.conf" else plugin_conf="$MKSITE_BASE/defaults/plugins/$plugin.conf" fi url="`mksite_eval_param $plugin_conf PLUGIN_URL`" ext="`mksite_eval_param $plugin_conf PLUGIN_EXT`" version="`mksite_eval_param $plugin_conf PLUGIN_VERSION`" plugin_dir="`mksite_eval_param $plugin_conf PLUGIN_DIR`" # prevents race conditions if [ -d "$TMP/mk$plugin" ]; then rm -rf $TMP/mk$plugin fi mkdir -p $TMP/mk$plugin chown root.root $TMP/mk$plugin echo $MESSAGE_DOWNLOADING_PLUGIN $plugin... ( cd $TMP/mk$plugin/ && wget "$url/$plugin-$version.$ext" && tar xvf $plugin-$version.$ext ) if [ ! -d "$plugin_dir" ]; then mv $TMP/mk$plugin/$plugin-$version $PLUGIN_DIR if [ "$PLUGIN_DIR_TYPE" == "symlink" ]; then ln -s $plugin_dir `mksite_eval_param $plugin_conf PLUGIN_DIR` fi else echo $MESSAGE_ERROR $plugin $MESSAGE_PLUGIN_SEEN_INSTALED fi rm -rf $TMP/mk$plugin if [ "`type -t plugin_post_install`" == "function" ]; then plugin_post_install fi } function mksite_check_usage { if [ -z "$1" ]; then usage mksite_safe_exit 1 else USER="$1" fi } function mksite_eval_plugin_parameters { if [ -f "$MKSITE_BASE/plugins/$PLUGIN_NAME.conf" ]; then plugin_conf="$MKSITE_BASE/plugins/$PLUGIN_NAME.conf" else plugin_conf="$MKSITE_BASE/defaults/plugins/$PLUGIN_NAME.conf" fi PLUGIN_NAME_UPPER="`echo $PLUGIN_NAME | tr '[:lower:]' '[:upper:]'`" PLUGIN_DIR="`mksite_eval_param $plugin_conf PLUGIN_DIR`" PLUGIN_DIR_TYPE="`mksite_eval_param $plugin_conf PLUGIN_DIR_TYPE`" PLUGIN_VERSION="`mksite_eval_param $plugin_conf PLUGIN_VERSION`" PLUGIN_TYPE="`mksite_eval_param $plugin_conf PLUGIN_TYPE`" } function mksite_check_plugin_installed { if [ ! -d "$PLUGIN_DIR" ]; then plugin_download_install $PLUGIN_NAME fi } function mksite_check_plugin_config { if [ -z "$PLUGIN_DIR" ]; then echo "$MESSAGE_CONFIG_ERROR (PLUGIN_DIR)" mksite_safe_exit 1 elif [ -z "$PLUGIN_TYPE" ]; then echo "$MESSAGE_CONFIG_ERROR (PLUGIN_TYPE)" mksite_safe_exit 1 fi } function mksite_check_plugin_type { # PLUGIN_DIR_TYPE: where plugin is or should be installed # # none: $PLUGIN_DIR # version: $PLUGIN_DIR-$PLUGIN_VERSION # symlink: $PLUGIN_DIR-$PLUGIN_VERSION, but a $PLUGIN-DIR symlink is created # if [ -z "$PLUGIN_DIR_TYPE" ]; then echo "$MESSAGE_CONFIG_ERROR (PLUGIN_DIR_TYPE)" mksite_safe_exit 1 elif [ -z "$PLUGIN_VERSION" ]; then echo "$MESSAGE_CONFIG_ERROR (PLUGIN_VERSION)" mksite_safe_exit 1 fi if [ "$PLUGIN_DIR_TYPE" == "version" ] || [ "$PLUGIN_DIR_TYPE" == "symlink" ]; then PLUGIN_DIR="$PLUGIN_DIR-$PLUGIN_VERSION" elif [ "$PLUGIN_DIR_TYPE" != "none" ]; then echo "$MESSAGE_CONFIG_ERROR (PLUGIN_DIR_TYPE)':" mksite_safe_exit 1 fi } function mksite_check_instance_name { # set the instance name procedure # usage: mksite_check_instance_name if [ "$2" == "-n" ]; then mksite_set_instance_name $PLUGIN_NAME -n $3 else mksite_set_instance_name $PLUGIN_NAME fi } function mksite_end { # salva as alteracoes no arquivo de configuracao do sitio write_config_file # recarrega as configuracoes do plugin update_config # agora falta recarregar o apache LOCK=0 mkvhost $USER echo $MESSAGE_SUCESS echo $MESSAGE_PROXY_WAIT mksite_safe_exit 0 } function mksite_init { # init procedures and plugin parameter evaluation # usage: mksite_init # cria arquivo de trava mksite_create_lockfile $LOCKFILE # checa a chamada mksite_check_usage $1 # checa o arquivo de configuracao mksite.conf mksite_check_configuration $PLUGIN_NAME # get the plugin variables mksite_eval_plugin_parameters # checa as configuracoes do plugin mksite_check_plugin_config if [ "$USE_VERSION" == "1" ]; then # checa o tipo de plugin mksite_check_plugin_type fi # checa se o plugin estah instalado mksite_check_plugin_installed # checa se o projeto jah existe mksite_check_first_time $USER # checa e obtem o nome da instancia mksite_check_instance_name $* # checa se a instancia foi instalada check_instance_installed if [ "$INSTALLED" == "installed" ] || [ "$UPDATE" == "1" ]; then echo $MESSAGE_SITE_UPDATING $PLUGIN_NAME / $USER update_config LOCK=0 mkvhost $USER noreload mksite_safe_exit 0 fi # cria pastas da instancia create_folders # cria banco de dados, caso necessario if [ "$USE_DATABASE" == "1" ]; then echo $MESSAGE_CREATE_DATABASE # acha o proximo nome de banco de dados livre mksite_next_available_db_name mksite_create_database $DBNAME DATABASES="`echo $DATABASES $DBNAME | sed -e 's/ / /g'`" # salva novas informacoes de banco de dados na configuracao do sitio write_config_file fi if [ ! -z "DB_SCRIPTS" ] && [ "$USE_DATABASES" == "1" ]; then # cria usuario echo $MESSAGE_GRANT_DB "$DBNAME"... mksite_grant_database $DBNAME $DBUSER for db_script in $DB_SCRIPTS; do echo $MESSAGE_IMPORTING_DB $db_script # importa banco de dados mksite_import_database $DBNAME $PLUGIN_DIR/$db_script done fi # cria arquivos de configuracao da instancia echo $MESSAGE_CREATE_CONFIG create_config_file $INSTANCE_NAME create_contrib_folders mksite_end } function mksite_checks { if [ ! -f "$CONF" ]; then echo Error: config file $CONFIG not found. echo Erro: arquivo de configuracao $CONF nao encontrado. exit 1 fi source $CONF if [ "$?" != "0" ]; then echo Error loading config file. echo Erro ao carregar o arquivo de configuracoes. exit 1 fi if [ -f "$MESSAGES" ]; then source $MESSAGES $LANG else echo Fatal error: message file not found, aborting. echo Erro fatal: arquivo de mensagens nao encontrado, abortando. exit 1 fi } function mksite_gen_passwd { # usage: mksite_gen_passwd local size min_size max_size min_size="$1" max_size="$2" size="0" if [[ $max_size > 62 ]]; then max_size="62" fi while [[ $size < $min_size ]]; do size="$(($RANDOM%$max_size))" done echo `mksite_random_string $size` } function mksite_random_string { # print a random string #+got it from firma, which got from http://funcoeszz.net/ :) # # usage: mksite_random_string local n alpha="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:?!" n="$(( 10#$(echo "$1" | tr -dc '[:digit:]') ))" if [[ "$n" == "0" ]]; then n="6" fi if [[ "$n" -gt "62" ]]; then return 1 fi while [[ "$n" != "0" ]]; do n="$((n-1))" ; pos="$((RANDOM%${#alpha}+1))" echo -n "$alpha" | sed "s/\(.\)\{$pos\}.*/\1/" alpha="$(echo $alpha | sed "s/.//$pos")" done | tr -d '\012' ; echo return 0 }