piler/util/postinstall.sh.in

484 lines
11 KiB
Bash
Raw Permalink Normal View History

#!/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"
2014-01-21 11:18:34 +01:00
SOCKET_HELPER_SCRIPT="aaa.pl"
2013-09-28 21:47:34 +02:00
load_default_values() {
PILERUSER="piler"
PILERGROUP="piler"
SYSCONFDIR=__SYSCONFDIR
LOCALSTATEDIR=__LOCALSTATEDIR
LIBEXECDIR=__LIBEXECDIR
DATAROOTDIR=__DATAROOTDIR
2013-09-28 21:47:34 +02:00
KEYTMPFILE="piler.key"
KEYFILE="$SYSCONFDIR/piler/piler.key"
2013-09-28 21:47:34 +02:00
HOSTNAME=`hostname --fqdn`
MYSQL_HOSTNAME="localhost"
MYSQL_DATABASE="piler"
MYSQL_USERNAME="piler"
MYSQL_PASSWORD=""
MYSQL_ROOT_PASSWORD=""
2013-11-01 13:06:48 +01:00
MYSQL_SOCKET=""
2013-09-28 21:47:34 +02:00
SPHINXCFG="/usr/local/etc/piler/sphinx.conf"
2013-09-28 21:47:34 +02:00
WWWGROUP="apache"
2014-11-11 14:03:12 +01:00
DOCROOT="/var/www/piler"
2013-09-28 21:47:34 +02:00
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/piler.pem ]; then
2013-09-28 21:47:34 +02:00
echo -n "Making an ssl certificate ... "
openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj "$SSL_CERT_DATA" -keyout $SYSCONFDIR/piler/piler.pem -out 1.cert -sha1
cat 1.cert >> $SYSCONFDIR/piler/piler.pem
chmod 600 $SYSCONFDIR/piler/piler.pem
2013-09-28 21:47:34 +02:00
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
}
2013-11-01 11:57:53 +01:00
askNoEcho() {
PROMPT=$1
DEFAULT=$2
stty -echo
ask "$PROMPT" "$DEFAULT"
stty echo
echo ""
}
2013-09-28 21:47:34 +02:00
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 webserver groupname" "$WWWGROUP"
WWWGROUP=$response
}
gather_mysql_account() {
2013-11-01 13:06:48 +01:00
if [ -e /var/lib/mysql/mysql.sock ]; then MYSQL_SOCKET="/var/lib/mysql/mysql.sock"; fi
if [ -e /var/run/mysqld/mysqld.sock ]; then MYSQL_SOCKET="/var/run/mysqld/mysqld.sock"; fi
askNonBlank "Please enter mysql hostname" "$MYSQL_HOSTNAME"
MYSQL_HOSTNAME=$response
2013-11-01 13:06:48 +01:00
if [ $MYSQL_HOSTNAME = "localhost" ]; then
2013-11-01 13:40:40 +01:00
askNonBlank "Please enter mysql socket path" "$MYSQL_SOCKET"
2013-11-01 13:06:48 +01:00
MYSQL_SOCKET=$response
else
MYSQL_SOCKET=""
fi
askNonBlank "Please enter mysql database" "$MYSQL_DATABASE"
MYSQL_DATABASE=$response
askNonBlank "Please enter mysql user name" "$MYSQL_USERNAME"
MYSQL_USERNAME=$response
2013-11-01 11:57:53 +01:00
askNoEcho "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() {
askNonBlank "Please enter the path of sphinx.conf" "$SPHINXCFG"
SPHINXCFG=$response
}
gather_smtp_relay_data() {
ask "Please enter smtp relay" "$SMARTHOST"
SMARTHOST=$response
2013-07-09 10:12:42 +02:00
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
2013-07-09 10:12:42 +02:00
echo "5,35 * * * * $LIBEXECDIR/piler/indexer.delta.sh" >> $CRON_TMP
2013-07-10 14:10:26 +02:00
echo "30 2 * * * $LIBEXECDIR/piler/indexer.main.sh" >> $CRON_TMP
2015-04-27 14:30:08 +02:00
echo "15,45 * * * * $LIBEXECDIR/piler/indexer.attachment.sh" >> $CRON_TMP
echo "*/15 * * * * $INDEXER --quiet tag1 --rotate --config $SYSCONFDIR/piler/sphinx.conf" >> $CRON_TMP
echo "*/15 * * * * $INDEXER --quiet note1 --rotate --config $SYSCONFDIR/piler/sphinx.conf" >> $CRON_TMP
2013-09-30 17:09:20 +02:00
echo "30 6 * * * /usr/bin/php $LIBEXECDIR/piler/generate_stats.php --webui $DOCROOT" >> $CRON_TMP
echo "*/5 * * * * /usr/bin/find $DOCROOT/tmp -type f -name i.\* -exec rm -f {} \;" >> $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"
2013-11-01 13:06:48 +01:00
echo "mysql socket: $MYSQL_SOCKET"
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" $DATAROOTDIR/piler/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 < $DATAROOTDIR/piler/db-mysql.sql
echo "Done."
2013-10-13 21:39:34 +02:00
echo -n "Writing 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%" $SYSCONFDIR/piler/sphinx.conf.dist > $SPHINXCFG
echo "Done."
echo -n "Initializing sphinx indices... ";
su $PILERUSER -c "indexer --all --config $SPHINXCFG"
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."
2013-09-28 21:47:34 +02:00
make_certificate
2014-01-21 11:18:34 +01:00
cat <<SOCKHELPER > $SOCKET_HELPER_SCRIPT
\$a=\$ARGV[0];
\$a=~s/\//\\\\\//g;
print \$a;
SOCKHELPER
MYSQL_SOCKET=`perl $SOCKET_HELPER_SCRIPT $MYSQL_SOCKET`
2013-11-01 13:06:48 +01:00
sed -e "s/mysqlpwd=verystrongpassword/mysqlpwd=$MYSQL_PASSWORD/" -e "s/tls_enable=0/tls_enable=1/" -e "s/mysqlsocket=\/var\/run\/mysqld\/mysqld.sock/mysqlsocket=$MYSQL_SOCKET/" $SYSCONFDIR/piler/piler.conf > $PILERCONF_TMP
cat $PILERCONF_TMP > $SYSCONFDIR/piler/piler.conf
rm -f $PILERCONF_TMP
2013-08-04 12:33:34 +02:00
chmod 755 $LOCALSTATEDIR/piler/stat
2013-11-02 15:02:35 +01:00
if [ -d webui ]; then
echo -n "Copying www files to $DOCROOT... "
mkdir -p $DOCROOT || exit 1
cp -R webui/* $DOCROOT
cp -R webui/.htaccess $DOCROOT
fi
if [ -d /var/www/piler.yourdomain.com ]; then
mv /var/www/piler.yourdomain.com $DOCROOT
fi
if [ -d $DOCROOT ]; then webui_install; fi
2013-10-13 22:29:45 +02:00
}
webui_install() {
2013-08-04 12:33:34 +02:00
chmod 770 $DOCROOT/tmp $DOCROOT/images
2014-08-21 15:54:55 +02:00
chown $PILERUSER $DOCROOT/tmp
chgrp $WWWGROUP $DOCROOT/tmp
echo "<?php" > $DOCROOT/config-site.php
echo >> $DOCROOT/config-site.php
echo "\$config['SITE_NAME'] = '$HOSTNAME';" >> $DOCROOT/config-site.php
2014-11-11 14:03:12 +01:00
echo "\$config['SITE_URL'] = 'http://' . \$config['SITE_NAME'] . '/';" >> $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