util/postinstall.sh.in
Rama master · réplica de lectura del repositorio original.
#!/bin/bash
set -o nounset
set -o errexit
set -o pipefail
INDEXER="$(command -v indexer)"
SEARCHD="$(command -v searchd)"
CRON_ORIG="/tmp/crontab.piler.orig"
CRON_TMP="/tmp/crontab.piler"
PILERCONF_TMP="/tmp/config.piler.88"
SOCKET_HELPER_SCRIPT="aaa.pl"
load_default_values() {
PILERUSER="piler"
SYSCONFDIR=__SYSCONFDIR
LOCALSTATEDIR=__LOCALSTATEDIR
LIBEXECDIR=__LIBEXECDIR
DATAROOTDIR=__DATAROOTDIR
PILER_CONFIG_DIR="${SYSCONFDIR}/piler"
CONFIG_SITE_PHP="${PILER_CONFIG_DIR}/config-site.php"
KEYFILE="${PILER_CONFIG_DIR}/piler.key"
HOSTNAME="$(hostname --fqdn)"
MYSQL_HOSTNAME="localhost"
MYSQL_DATABASE="piler"
MYSQL_USERNAME="piler"
MYSQL_PASSWORD=""
MYSQL_ROOT_PASSWORD=""
MYSQL_SOCKET=""
RT=1
SEARCHCFG="${PILER_CONFIG_DIR}/manticore.conf"
WWWGROUP="www-data"
DOCROOT="/var/piler/www"
SMARTHOST=""
SMARTHOST_PORT=25
SSL_CERT_DATA="/C=HU/ST=Pest/L=Budapest/O=Example/CN=archive.example.com"
}
make_certificate() {
local piler_pem="${PILER_CONFIG_DIR}/piler.pem"
if [[ ! -f "$piler_pem" ]]; then
echo -n "Making an ssl certificate ... "
openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj "$SSL_CERT_DATA" -keyout "$piler_pem" -out 1.cert -sha1
cat 1.cert >> "$piler_pem"
chmod 640 "$piler_pem"
chgrp "$PILERUSER" "$piler_pem"
rm -f 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 1
fi
echo ""
}
check_user() {
user="$1"
if [[ $(whoami) != "$user" ]]; then echo "ERROR: postinstaller must be run as ${user} user"; exit 1; fi
}
isFQDN() {
# we need min. 2 dots
if [[ "$1" == "xdogfood" ]]; then
echo 1
return
fi
if [[ "$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 -r response
if [[ -z "$response" ]]; then
response=$DEFAULT
fi
}
askNoEcho() {
PROMPT=$1
DEFAULT=$2
stty -echo
ask "$PROMPT" "$DEFAULT"
stty echo
echo ""
}
askNonBlankNoEcho() {
PROMPT=$1
DEFAULT=$2
while true; do
stty -echo
ask "$PROMPT" "$DEFAULT"
stty echo
echo ""
if [[ -n "$response" ]]; then
break
fi
echo "A non-blank answer is required"
done
}
askNonBlank() {
PROMPT="$1"
DEFAULT="$2"
while true; do
ask "$PROMPT" "$DEFAULT"
if [[ -n "$response" ]]; then
break
fi
echo "A non-blank answer is required"
done
}
askYN() {
PROMPT=$1
DEFAULT=$2
case "$DEFAULT" in
yes|Yes|y|Y)
DEFAULT="Y"
;;
*)
DEFAULT="N"
;;
esac
while true; do
ask "$PROMPT" "$DEFAULT"
response=$(perl -e "print lc(\"$response\");")
if [[ -z "$response" ]]; then
:
else
if [[ "$response" == "yes" || "$response" == "y" ]]; then
response="yes"
break
else
if [[ "$response" == "no" || "$response" == "n" ]]; then
response="no"
break
fi
fi
fi
echo "A Yes/No answer is required"
done
}
preinstall_check() {
check_user root
if [[ "$INDEXER" == "" ]]; then "ERROR: cannot find indexer binary"; echo ""; exit ; fi
if [[ "$SEARCHD" == "" ]]; then "ERROR: cannot find searchd binary"; echo ""; exit 0; fi
}
gather_webserver_data() {
askNonBlank "Please enter the webserver groupname" "$WWWGROUP"
WWWGROUP="$response"
}
gather_mysql_account() {
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"
if [[ $MYSQL_HOSTNAME == "localhost" ]]; then
askNonBlank "Please enter mysql socket path" "$MYSQL_SOCKET"
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"
askNoEcho "Please enter mysql password for ${MYSQL_USERNAME}" ""
MYSQL_PASSWORD="$response"
askNonBlankNoEcho "Please enter mysql root password. If its a recent version of mysql and uses socket authentication, then any string would do here" ""
MYSQL_ROOT_PASSWORD="$response"
askYN "Real time index for manticore? [Y/N]" "Y"
if [[ "$response" != "yes" ]]; then
RT=0
fi
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")
# shellcheck disable=SC2181
if [[ $? -eq 0 ]]; then
echo "mysql connection successful"; echo;
else
echo "ERROR: failed to connect to mysql";
gather_mysql_account
fi
}
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 || true > "$CRON_ORIG"
if grep PILERSTART "$CRON_ORIG" > /dev/null 2>&1 != 0; then
cat /dev/null > "$CRON_ORIG"
fi
if grep PILEREND "$CRON_ORIG" > /dev/null 2>&1 != 0; then
cat /dev/null > "$CRON_ORIG"
fi
rm -f "$CRON_TMP"
{
echo "";
echo "### PILERSTART";
[[ $RT -eq 1 ]] || echo "5,35 * * * * ${LIBEXECDIR}/piler/indexer.delta.sh";
[[ $RT -eq 1 ]] || echo "30 2 * * * ${LIBEXECDIR}/piler/indexer.main.sh";
echo "40 3 * * * ${LIBEXECDIR}/piler/purge.sh";
[[ $RT -eq 1 ]] || echo "*/15 * * * * ${INDEXER} --quiet tag1 --rotate --config ${PILER_CONFIG_DIR}/manticore.conf";
[[ $RT -eq 1 ]] || echo "*/15 * * * * ${INDEXER} --quiet note1 --rotate --config ${PILER_CONFIG_DIR}/manticore.conf";
echo "30 6 * * * /usr/bin/php ${LIBEXECDIR}/piler/generate_stats.php --webui ${DOCROOT} >/dev/null";
echo "*/5 * * * * /usr/bin/find ${LOCALSTATEDIR}/piler/error -type f|wc -l > ${LOCALSTATEDIR}/piler/stat/error";
echo "*/5 * * * * /usr/bin/find ${DOCROOT}/tmp -type f -name i.\* -exec rm -f {} \;";
echo "*/10 * * * * ${LIBEXECDIR}/piler/import.sh";
echo "### PILEREND";
} >> "$CRON_TMP"
}
make_new_key() {
if [[ ! -f "$KEYFILE" ]]; then
dd if=/dev/urandom bs=56 count=1 of="$KEYFILE" 2>/dev/null
if [ "$(stat -c '%s' "$KEYFILE")" -ne 56 ]; then echo "could not read 56 bytes from /dev/urandom to ${KEYFILE}"; exit 1; fi
chgrp "$PILERUSER" "$KEYFILE"
chmod 640 "$KEYFILE"
fi
}
show_summary() {
echo
echo
echo "INSTALLATION SUMMARY:"
echo
echo "piler user: ${PILERUSER}"
echo "keyfile: ${KEYFILE}"
echo
echo "mysql host: ${MYSQL_HOSTNAME}"
echo "mysql socket: ${MYSQL_SOCKET}"
echo "mysql database: ${MYSQL_DATABASE}"
echo "mysql username: ${MYSQL_USERNAME}"
echo "mysql password: *******"
echo
echo "indexer: ${INDEXER}"
echo "config file: ${SEARCHCFG}"
echo "real time index: ${RT}"
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;
export HOSTNAME SITE_NAME DOCROOT SMTP_DOMAIN MYSQL_HOSTNAME MYSQL_USERNAME MYSQL_PASSWORD MYSQL_DATABASE SMARTHOST SMARTHOST_PORT RT
askYN "Correct? [Y/N]" "N"
if [[ $response != "yes" ]]; then
echo "Aborted."
exit
fi
}
execute_post_install_tasks() {
local create_db=1
askYN "Continue and modify system? [Y/N]" "N"
if [[ "$response" != "yes" ]]; then
echo "Aborted."
exit
fi
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")
# shellcheck disable=SC2181
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}."; create_db=0; fi
else
echo "ERROR: failed to connect to mysql";
exit 1
fi
if [[ $create_db -eq 1 ]]; then
echo
echo -n "Creating mysql database... ";
sed -e "s%MYSQL_HOSTNAME%${MYSQL_HOSTNAME}%g" -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."
fi
echo -n "Writing manticore 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/manticore.conf.dist" > "$SEARCHCFG"
chmod +x "$SEARCHCFG"
echo "Done."
if [[ $RT -eq 0 ]]; then
echo -n "Initializing manticore index data... "
sed -i "s/define('RT', 1)/define('RT', 0)/" "$SEARCHCFG"
su "$PILERUSER" -c "indexer --all --config ${SEARCHCFG}"
echo "Done."
fi
echo -n "installing cron entries for ${PILERUSER}... "
crontab -u "$PILERUSER" "$CRON_TMP"
echo "Done."
echo "Fix piler.conf path in pilerpurge.py"
sed -i "s%\/etc\/piler\/piler\.conf%${SYSCONFDIR}\/piler\/piler\.conf%" "${LIBEXECDIR}/piler/pilerpurge.py"
cat > "$CONFIG_SITE_PHP" << EOF
<?php
\$config['SITE_NAME'] = '$HOSTNAME';
\$config['PATH_PREFIX'] = '/';
\$config['SITE_URL'] = 'http://' . \$config['SITE_NAME'] . \$config['PATH_PREFIX'];
\$config['DIR_BASE'] = '$DOCROOT/';
\$config['SMTP_DOMAIN'] = '$HOSTNAME';
\$config['SMTP_FROMADDR'] = 'no-reply@' . \$config['SMTP_DOMAIN'];
\$config['ADMIN_EMAIL'] = 'admin@' . \$config['SMTP_DOMAIN'];
\$config['DB_DRIVER'] = 'mysql';
\$config['DB_PREFIX'] = '';
\$config['DB_HOSTNAME'] = '$MYSQL_HOSTNAME';
\$config['DB_USERNAME'] = '$MYSQL_USERNAME';
\$config['DB_PASSWORD'] = '$MYSQL_PASSWORD';
\$config['DB_DATABASE'] = '$MYSQL_DATABASE';
\$config['SMARTHOST'] = '$SMARTHOST';
\$config['SMARTHOST_PORT'] = '$SMARTHOST_PORT';
\$config['RT'] = $RT;
EOF
make_certificate
cat <<SOCKHELPER > "$SOCKET_HELPER_SCRIPT"
\$a=\$ARGV[0];
\$a=~s/\//\\\\\//g;
print \$a;
SOCKHELPER
MYSQL_SOCKET=$(perl "$SOCKET_HELPER_SCRIPT" "$MYSQL_SOCKET")
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.dist" > "$PILERCONF_TMP"
if [[ $RT -eq 0 ]]; then sed -e "s/rtindex=.*/rtindex=0/" "$PILERCONF_TMP"; fi
if ! grep queuedir "$PILERCONF_TMP"; then echo queuedir=/var/piler/store >> "$PILERCONF_TMP"; fi
cat "$PILERCONF_TMP" > "${SYSCONFDIR}/piler/piler.conf"
rm -f "$PILERCONF_TMP"
# Manticore is the preferred search engine
touch "${SYSCONFDIR}/piler/MANTICORE"
chmod 755 "${LOCALSTATEDIR}/piler/stat"
if [[ -d webui ]]; then
echo -n "Copying www files to ${DOCROOT}... "
mkdir -p "$DOCROOT" || exit 1
cp -R webui/* "$DOCROOT"
cp webui/.htaccess "$DOCROOT"
fi
if [[ -d "$DOCROOT" ]]; then webui_install; fi
if [[ -f "/usr/bin/systemctl" ]]; then
RELOAD_COMMAND="/usr/bin/systemctl reload piler"
else
RELOAD_COMMAND="/etc/init.d/rc.piler reload"
fi
if [[ -d "/etc/sudoers.d" ]]; then
echo -n "Creating sudoers file"
echo "www-data ALL=NOPASSWD: ${RELOAD_COMMAND}" >> /etc/sudoers.d/piler
fi
}
webui_install() {
chmod 770 "${DOCROOT}/tmp" "${DOCROOT}/images"
chown "${PILERUSER}:${WWWGROUP}" "${DOCROOT}/tmp"
echo "Done."
}
clean_up_temp_stuff() {
rm -f "$CRON_TMP"
echo; echo "Done post installation tasks."; echo
}
load_default_values
preinstall_check
display_install_intro
gather_webserver_data
gather_mysql_account
gather_smtp_relay_data
make_cron_entries
make_new_key
show_summary
execute_post_install_tasks
clean_up_temp_stuff