piler/util/postinstall.sh.in
2013-09-28 22:36:36 +02:00

450 lines
10 KiB
Bash
Executable File

#!/bin/sh
INDEXER=`which indexer 2>/dev/null`
SEARCHD=`which searchd 2>/dev/null`
CRON_ORIG="/tmp/crontab.piler.orig"
CRON_TMP="/tmp/crontab.piler"
PILERCONF_TMP="/tmp/config.piler.88"
load_default_values() {
PILERUSER="piler"
PILERGROUP="piler"
SYSCONFDIR=__SYSCONFDIR
LOCALSTATEDIR=__LOCALSTATEDIR
LIBEXECDIR=__LIBEXECDIR
KEYTMPFILE="piler.key"
KEYFILE="$SYSCONFDIR/piler.key"
HOSTNAME=`hostname --fqdn`
MYSQL_HOSTNAME="localhost"
MYSQL_DATABASE="piler"
MYSQL_USERNAME="piler"
MYSQL_PASSWORD=""
MYSQL_ROOT_PASSWORD=""
SPHINXCFG="/usr/local/etc/sphinx.conf"
WWWGROUP="apache"
DOCROOT="/var/www/$HOSTNAME"
SMARTHOST=""
SMARTHOST_PORT=25
SSL_CERT_DATA="/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
}
make_certificate() {
if [ ! -f $SYSCONFDIR/piler.pem ]; then
echo -n "Making an ssl certificate ... "
openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj "$SSL_CERT_DATA" -keyout $SYSCONFDIR/piler.pem -out 1.cert
cat 1.cert >> $SYSCONFDIR/piler.pem
chmod 600 $SYSCONFDIR/piler.pem
rm 1.cert
fi
}
display_install_intro() {
echo ""
echo ""
echo "This is the postinstall utility for piler"
echo "It should be run only at the first install. DO NOT run on an existing piler installation!"
echo ""
askYN "Continue? [Y/N]" "N"
if [ $response != "yes" ]; then
echo "Aborted."
exit
fi
echo ""
}
check_user() {
user=$1
if [ x`whoami` != x$user ]; then echo "ERROR: postinstaller must be run as $user user"; exit 1; fi
}
isFQDN() {
# we need min. 2 dots
if [ x"$1" = "xdogfood" ]; then
echo 1
return
fi
if [ x"$1" = "x" ]; then
echo 0
return
fi
NF=`echo $1 | awk -F. '{print NF}'`
if [ $NF -ge 2 ]; then
echo 1
else
echo 0
fi
}
ask() {
PROMPT=$1
DEFAULT=$2
echo ""
echo -n "$PROMPT [$DEFAULT] "
read response
if [ -z $response ]; then
response=$DEFAULT
fi
}
askNonBlankNoEcho() {
PROMPT=$1
DEFAULT=$2
while [ 1 ]; do
stty -echo
ask "$PROMPT" "$DEFAULT"
stty echo
echo ""
if [ ! -z $response ]; then
break
fi
echo "A non-blank answer is required"
done
}
askNonBlank() {
PROMPT=$1
DEFAULT=$2
while [ 1 ]; do
ask "$PROMPT" "$DEFAULT"
if [ ! -z $response ]; then
break
fi
echo "A non-blank answer is required"
done
}
askYN() {
PROMPT=$1
DEFAULT=$2
if [ "x$DEFAULT" = "xyes" -o "x$DEFAULT" = "xYes" -o "x$DEFAULT" = "xy" -o "x$DEFAULT" = "xY" ]; then
DEFAULT="Y"
else
DEFAULT="N"
fi
while [ 1 ]; do
ask "$PROMPT" "$DEFAULT"
response=$(perl -e "print lc(\"$response\");")
if [ -z $response ]; then
:
else
if [ $response = "yes" -o $response = "y" ]; then
response="yes"
break
else
if [ $response = "no" -o $response = "n" ]; then
response="no"
break
fi
fi
fi
echo "A Yes/No answer is required"
done
}
preinstall_check() {
check_user root
if [ "x$INDEXER" = "x" ]; then "ERROR: cannot find sphinx indexer"; echo ""; exit ; fi
if [ "x$SEARCHD" = "x" ]; then "ERROR: cannot find sphinx searchd"; echo ""; exit 0; fi
if [ -f $KEYFILE ]; then echo "ERROR: found existing keyfile ($KEYFILE), aborting install"; echo ""; exit 0; fi
}
gather_webserver_data() {
askNonBlank "Please enter the path of your documentroot" "$DOCROOT"
DOCROOT=$response
if [ -d $DOCROOT ]; then echo "ERROR: vhost docroot should NOT exist, abroting install"; echo ""; exit 0; fi
askNonBlank "Please enter the webserver groupname" "$WWWGROUP"
WWWGROUP=$response
}
gather_mysql_account() {
askNonBlank "Please enter mysql hostname" "$MYSQL_HOSTNAME"
MYSQL_HOSTNAME=$response
askNonBlank "Please enter mysql database" "$MYSQL_DATABASE"
MYSQL_DATABASE=$response
askNonBlank "Please enter mysql user name" "$MYSQL_USERNAME"
MYSQL_USERNAME=$response
askNonBlankNoEcho "Please enter mysql password for $MYSQL_USERNAME" ""
MYSQL_PASSWORD=$response
askNonBlankNoEcho "Please enter mysql root password" ""
MYSQL_ROOT_PASSWORD=$response
s=`echo "use information_schema; select TABLE_NAME from TABLES where TABLE_SCHEMA='$MYSQL_DATABASE'" | mysql -h $MYSQL_HOSTNAME -u root --password=$MYSQL_ROOT_PASSWORD`
if [ $? -eq 0 ];
then
echo "mysql connection successful"; echo;
if [ `echo $s | grep -c metadata` -eq 1 ]; then echo "ERROR: Detected metadata table in $MYSQL_DATABASE. Aborting"; exit 0; fi
else
echo "ERROR: failed to connect to mysql";
gather_mysql_account
fi
}
gather_sphinx_data() {
if [ $INDEXER = "/usr/bin/indexer" ]; then SPHINXCFG="/etc/sphinx.conf"; fi
if test -f /etc/sphinxsearch/sphinx.conf || test -f /etc/sphinxsearch/sphinx.conf.sample ; then SPHINXCFG="/etc/sphinxsearch/sphinx.conf"; fi
askNonBlank "Please enter the path of sphinx.conf" "$SPHINXCFG"
SPHINXCFG=$response
}
gather_smtp_relay_data() {
ask "Please enter smtp relay" "$SMARTHOST"
SMARTHOST=$response
ask "Please enter smtp relay port" "$SMARTHOST_PORT"
SMARTHOST_PORT=$response
}
make_cron_entries() {
crontab -u $PILERUSER -l > $CRON_ORIG
grep PILERSTART $CRON_ORIG > /dev/null 2>&1
if [ $? != 0 ]; then
cat /dev/null > $CRON_ORIG
fi
grep PILEREND $CRON_ORIG > /dev/null 2>&1
if [ $? != 0 ]; then
cat /dev/null > $CRON_ORIG
fi
rm -f $CRON_TMP
echo ""
echo "### PILERSTART" >> $CRON_TMP
echo "*/5 * * * * LC_ALL=C mpstat | tail -1 | awk '{print \$11}' > $LOCALSTATEDIR/piler/stat/cpu.stat" >> $CRON_TMP
echo "5,35 * * * * $LIBEXECDIR/piler/indexer.delta.sh" >> $CRON_TMP
echo "30 2 * * * $LIBEXECDIR/piler/indexer.main.sh" >> $CRON_TMP
echo "*/15 * * * * $INDEXER --quiet tag1 --rotate" >> $CRON_TMP
echo "*/15 * * * * $INDEXER --quiet note1 --rotate" >> $CRON_TMP
echo "30 6 * * * /usr/bin/php $LIBEXECDIR/piler/generate_stats.php $DOCROOT" >> $CRON_TMP
echo "### PILEREND" >> $CRON_TMP
}
make_new_key() {
dd if=/dev/urandom bs=56 count=1 of=$KEYTMPFILE 2>/dev/null
if [ `stat -c '%s' $KEYTMPFILE` -ne 56 ]; then echo "could not read 56 bytes from /dev/urandom to $KEYTMPFILE"; exit 1; fi
}
show_summary() {
echo
echo
echo "INSTALLATION SUMMARY:"
echo
echo "piler user: $PILERUSER"
echo "keyfile: $KEYFILE"
echo
echo "mysql host: $MYSQL_HOSTNAME"
echo "mysql database: $MYSQL_DATABASE"
echo "mysql username: $MYSQL_USERNAME"
echo "mysql password: *******"
echo
echo "sphinx indexer: $INDEXER"
echo "sphinx config file: $SPHINXCFG"
echo
echo "vhost docroot: $DOCROOT"
echo "www group: $WWWGROUP"
echo
echo "smtp relay host: $SMARTHOST"
echo "smtp relay port: $SMARTHOST_PORT"
echo
echo "piler crontab:"
cat $CRON_TMP
echo; echo;
askYN "Correct? [Y/N]" "N"
if [ $response != "yes" ]; then
echo "Aborted."
exit
fi
}
execute_post_install_tasks() {
askYN "Continue and modify system? [Y/N]" "N"
if [ $response != "yes" ]; then
echo "Aborted."
exit
fi
echo;
echo -n "Creating mysql database... ";
sed -e "s%MYSQL_HOSTNAME%$MYSQL_HOSTNAMEg%" -e "s%MYSQL_DATABASE%$MYSQL_DATABASE%g" -e "s%MYSQL_USERNAME%$MYSQL_USERNAME%g" -e "s%MYSQL_PASSWORD%$MYSQL_PASSWORD%g" util/db-mysql-root.sql.in | mysql -h $MYSQL_HOSTNAME -u root --password=$MYSQL_ROOT_PASSWORD
mysql -h $MYSQL_HOSTNAME -u $MYSQL_USERNAME --password=$MYSQL_PASSWORD $MYSQL_DATABASE < util/db-mysql.sql
echo "Done."
echo -n "Overwriting sphinx configuration... ";
sed -e "s%MYSQL_HOSTNAME%$MYSQL_HOSTNAME%" -e "s%MYSQL_DATABASE%$MYSQL_DATABASE%" -e "s%MYSQL_USERNAME%$MYSQL_USERNAME%" -e "s%MYSQL_PASSWORD%$MYSQL_PASSWORD%" etc/sphinx.conf.in > etc/sphinx.conf
cp etc/sphinx.conf $SPHINXCFG
echo "Done."
echo -n "Initializing sphinx indices... ";
su $PILERUSER -c "indexer --all"
echo "Done."
echo -n "installing cron entries for $PILERUSER... "
crontab -u $PILERUSER $CRON_TMP
echo "Done."
echo -n "installing keyfile ($KEYTMPFILE) to $KEYFILE... "
cp $KEYTMPFILE $KEYFILE
chgrp $PILERUSER $KEYFILE
chmod 640 $KEYFILE
rm -f $KEYTMPFILE
echo "Done."
make_certificate
sed -e "s/mysqlpwd=verystrongpassword/mysqlpwd=$MYSQL_PASSWORD/" -e "s/tls_enable=0/tls_enable=1/" $SYSCONFDIR/piler.conf > $PILERCONF_TMP
cat $PILERCONF_TMP > $SYSCONFDIR/piler.conf
rm -f $PILERCONF_TMP
chmod 755 $LOCALSTATEDIR/piler/stat
echo -n "Copying www files to $DOCROOT... "
mkdir -p $DOCROOT || exit 1
cp -R webui/* $DOCROOT
cp -R webui/.htaccess $DOCROOT
chmod 770 $DOCROOT/tmp $DOCROOT/images
chgrp $WWWGROUP $DOCROOT/tmp
echo "<?php" > $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "\$config['SITE_NAME'] = '$HOSTNAME';" >> $DOCROOT/config-site.php
echo "\$config['SITE_URL'] = 'http://$HOSTNAME/';" >> $DOCROOT/config-site.php
echo "\$config['DIR_BASE'] = '$DOCROOT/';" >> $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "\$config['ENABLE_SYSLOG'] = 1;" >> $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "\$config['SMTP_DOMAIN'] = '$HOSTNAME';" >> $DOCROOT/config-site.php
echo "\$config['SMTP_FROMADDR'] = 'no-reply@$HOSTNAME';" >> $DOCROOT/config-site.php
echo "\$config['ADMIN_EMAIL'] = 'admin@$HOSTNAME';" >> $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "\$config['DB_DRIVER'] = 'mysql';" >> $DOCROOT/config-site.php
echo "\$config['DB_PREFIX'] = '';" >> $DOCROOT/config-site.php
echo "\$config['DB_HOSTNAME'] = '$MYSQL_HOSTNAME';" >> $DOCROOT/config-site.php
echo "\$config['DB_USERNAME'] = '$MYSQL_USERNAME';" >> $DOCROOT/config-site.php
echo "\$config['DB_PASSWORD'] = '$MYSQL_PASSWORD';" >> $DOCROOT/config-site.php
echo "\$config['DB_DATABASE'] = '$MYSQL_DATABASE';" >> $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "\$config['SMARTHOST'] = '$SMARTHOST';" >> $DOCROOT/config-site.php
echo "\$config['SMARTHOST_PORT'] = $SMARTHOST_PORT;" >> $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "?>" >> $DOCROOT/config-site.php
echo "Done."
}
clean_up_temp_stuff() {
rm -f $CRON_TMP
echo; echo "Done post installation tasks."; echo
}
load_default_values
#LOGFILE="/tmp/piler-install.log.$$"
#touch $LOGFILE
#chmod 600 $LOGFILE
preinstall_check
display_install_intro
gather_webserver_data
gather_mysql_account
gather_sphinx_data
gather_smtp_relay_data
make_cron_entries
make_new_key
show_summary
execute_post_install_tasks
clean_up_temp_stuff