diff options
Diffstat (limited to 'avantfaxsetup.sh')
-rwxr-xr-x | avantfaxsetup.sh | 649 |
1 files changed, 649 insertions, 0 deletions
diff --git a/avantfaxsetup.sh b/avantfaxsetup.sh new file mode 100755 index 000000000000..90c1bf55b768 --- /dev/null +++ b/avantfaxsetup.sh @@ -0,0 +1,649 @@ +#!/bin/sh +# Packagers can change this to dash + +# TODO: Fix magic. I don't see where magic is used anywhere. +# TODO: Fix trusted-users (mail) + +# This was adapted from the RPM .spec. The .spec forced an organization which +# the *-install.sh files lacked. RPM used some bashisms that were removed. + +# The Hylafax scripts are very classy work. I'll try to duplicate some of that +# class here. +# The Basis Pro/5 scripts were even classier, all as functions so they can be +# thrown together in any order. + +# This script is designed so you can run the desired parts over and over +# until all the steps complete properly. This is part of the rigor required +# to function well in the fast upgrade environment of Arch Linux. + +# All vars and functions start with _ so this can be directly run from +# Arch Linux PKGBUILD. + +# /etc/avantfaxrpm.conf + +# To make these vars more friendly for sed hacking always use "double" quotes +# and do not put # comments on the end of lines (like this one). # don't do this! # or this! +# AUTO_START_HTTP isn't (yet) used in this file but it may be used by files +# that source this. It will likely be used when this script is adapted +# for platforms other than Arch Linux. +_opt_AUTO_START_HTTP=0 +_opt_WWWUSER="http" +_opt_WWWGROUP="http" +_opt_HYLA_GROUP="uucp" +_opt_AVANTFAX_SERVERNAME="avantfax" +_opt_HTTP_DIR="/srv/http" +_opt_HYLA_BIN_DIR="/usr/bin" +# reboot, halt, # I'm not the only one who thinks that this is a bad idea. +_opt_SUDO_LINE="${_opt_WWWUSER} ALL = NOPASSWD: ${_opt_HYLA_BIN_DIR}/faxdeluser, ${_opt_HYLA_BIN_DIR}/faxadduser" +_opt_AVANT_CMTTAG="##AvantFAX##" + +if [ ! -z "${_opt_SOURCEONLY}" ]; then + return 0 +fi +# We can't set -u before here or we might change the setting for our sourcer +if [ -z "${_opt_DESTDIR}" ]; then + _opt_DESTDIR="${_opt_DESTDIR}" +fi +set -u + +if [ "`id -u`" -ne 0 ]; then # $EUID is a bashism + echo "`basename "$0"`: Must run as root" + exit 1 +fi + +_opt_INST_DIR="${_opt_HTTP_DIR}/${_opt_AVANTFAX_SERVERNAME}" +_opt_BIN_DIR="${_opt_HTTP_DIR}/${_opt_AVANTFAX_SERVERNAME}-bin" +# These are the database settings AvantFAX will create and use +_opt_ADFB_USER="avantfax" +# ADFB_NAME used to be called DB. 2 character variables or variables likely +# to be in the persistent shell environment are unwise! +_opt_AFDB_NAME="avantfax" +# The MariaDB service is still called mysqld +_opt_MYSQLD="mysqld" +# friendly name for server +_opt_SQL_FR="MariaDB" +_opt_MYSQLADMIN="mysqladmin" +_opt_MYSQL="mysql" +_opt_MYSQLDUMP="mysqldump" +_opt_FAXRMPWD="pwd" +_opt_HYLASPOOL="/var/spool/hylafax" +# "" for autodetect, 0 for SysV, 1 for systemd +_opt_SYSTEMD= +_opt_SERVICE="/sbin/service" +# You can sed this or use export _opt_DESTDIR="..." +#_opt_DESTDIR= +# _opt_BUILD is only an idea not implemented, but would be something like +# RPM, Debian, ArchLinux, or any other value that can be used to adapt this +# script to many platforms. Someday we'll get rid of the too many install scripts. +#_opt_BUILD= +_opt_VHOSTS=1 + +if [ -z "${_opt_DESTDIR}" ]; then + if [ ! -s "$0.password" ]; then + cat >> "$0.password" << EOF +# The MySQL/MariaDB root password must be placed here for AvantFAX. This file +# can only be read by root and the password isn't stored anywhere else. The +# password is only used at install and remove to add or remove user avantfax. +# All normal operations are done with the avantfax user and the password below. +_opt_ROOTMYSQLPWD="" + +# The MySQL avantfax user password is placed here to make it persistent +# between upgrades. This password is transferred to the php config script so +# would be revealed by any hacker that can get to the php script. The purpose +# is to ensure that every AvantFAX install has a random password to minimize +# the possibility of a widespread AvantFAX hack if http, php, or mysql +# vulnerabilities lead to non root access to MySQL. +_opt_ADFB_PASS="`dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev`" + +# When you are done configuring this run: +# avantfaxsetup.sh install +EOF + chown 'root:root' "$0.password" # just to make sure + chmod 600 "$0.password" + fi + . "$0.password" +fi + +if [ -z "${_opt_SYSTEMD}" ]; then + if command -v systemctl >/dev/null 2>&1; then + _opt_SYSTEMD=1 + else + _opt_SYSTEMD=0 + fi +fi + +if grep -i 'adv''ant' "$0"; then + echo "It's AvantFax, not Adv""antFAX. Please fix the script!" + exit 1 +fi + +# These parts can be done in the package build, the preferred place for chmod. +_fn_setup_package() { + chmod -R 0770 "${_opt_DESTDIR}${_opt_INST_DIR}/tmp" "${_opt_DESTDIR}${_opt_INST_DIR}/faxes" +####### SETUP SMARTY ####### + chmod 0770 \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/templates/admin_theme/templates_c/" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/templates/admin_theme/cache/" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/templates/main_theme/templates_c/" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/templates/main_theme/cache/" + chmod 0755 \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/faxcover.php" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/faxrcvd.php" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/notify.php" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/tools/update_contacts.php" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/tools/faxcover.php" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/avantfaxcron.php" \ + "${_opt_DESTDIR}${_opt_INST_DIR}/includes/dynconf.php" +} + +# This is called build because it is from the %build section of the RPM .spec. +# I prefer to chown in the installer where we get to use words, not the +# PKGBUILD where we can't adduser so we can't depend on anything more than numbers. +_fn_setup_build() { +############################################################################################################## + chown -R "${_opt_WWWUSER}:${_opt_WWWGROUP}" "${_opt_INST_DIR}/" + chown -R "${_opt_WWWUSER}:${_opt_HYLA_GROUP}" "${_opt_INST_DIR}/tmp" "${_opt_INST_DIR}/faxes" + +####### SETUP SMARTY ####### + chown "${_opt_WWWUSER}:${_opt_WWWGROUP}" \ + "${_opt_INST_DIR}/includes/templates/admin_theme/templates_c/" \ + "${_opt_INST_DIR}/includes/templates/admin_theme/cache/" \ + "${_opt_INST_DIR}/includes/templates/main_theme/templates_c/" \ + "${_opt_INST_DIR}/includes/templates/main_theme/cache/" + + # open_basedir resolves soft links so we'll create hard links. This keeps us out of the /bin folder. + install -d -m755 "${_opt_BIN_DIR}" + # which would need to be tested with -x to eliminate not found executables + for _var_i in 'html2ps' 'lpr' 'tesseract' 'fax2ps' 'faxinfo' 'faxstat' 'faxadduser' 'faxdeluser' 'faxgetty' 'sendfax' 'faxrm' 'faxalter'; do + _var_file="`command -v ${_var_i}`" + if [ ! -z "${_var_file}" ]; then + ln -f "${_var_file}" "${_opt_BIN_DIR}/${_var_i}" + fi + done +} + +_fn_check_mysql() { + for _var_isthere in "${_opt_MYSQL}" "${_opt_MYSQLADMIN}"; do + if ! command -v "${_var_isthere}" >/dev/null 2>&1; then + echo "I require ${_var_isthere} but it's not installed." + exit 1 + fi + done # From graysky's zfs installer +} + +# This is called pre because it's from the %pre section of the RPM .spec. +# It cannot be run at %pre. It is run at %post because of a race condition. +# Running at %pre is fine if mysql is already installed and configured. +# If AvantFAX and MySQL/MariaDB are installed at the same time (which is likely) +# this could execute before MySQL's install. Then with all the code trapped +# in the RPM .spec the user has no way to continue the install. All they +# can do is to uninstall and reinstall. +# $1 flag: 1 = install, 2 = upgrade +_fn_setup_pre() { + if [ "$1" -eq 1 ]; then + echo "### DB Settings: ${_opt_ADFB_USER} ${_opt_ADFB_PASS} ${_opt_AFDB_NAME} (root password)" # ${_opt_ROOTMYSQLPWD}" + fi + _fn_check_mysql + + if [ "${_opt_SYSTEMD}" -ne 0 ]; then + systemctl -q is-active "${_opt_MYSQLD}.service" + else + ${_opt_SERVICE} "${_opt_MYSQLD}" status >/dev/null 2>&1 + fi + _var_WAS_ACTIVE="$?" + + # If the admin had it stopped, we'll stop it when done. + _fn_sql_deactivate() { + if [ "${_var_WAS_ACTIVE}" -ne 0 ]; then + if [ "${_opt_SYSTEMD}" -ne 0 ]; then + systemctl stop "${_opt_MYSQLD}.service" + else + ${_opt_SERVICE} "${_opt_MYSQLD}" stop + fi + fi + } + + _fn_sql_boom() { # clever function from Hylafax + _fn_sql_deactivate + echo "`basename "$0"`: Unable to configure ${_opt_SQL_FR}. Ensure it is configured and run `basename "$0"` again" + echo "Problem: $1" + exit 1 + } + + if [ "${_var_WAS_ACTIVE}" -ne 0 ]; then + echo "##########################################################################" + echo "### Temporairly Starting ${_opt_SQL_FR}" + if [ "${_opt_SYSTEMD}" -ne 0 ]; then + systemctl start "${_opt_MYSQLD}.service" + if ! systemctl -q is-active "${_opt_MYSQLD}.service"; then + _fn_sql_boom "Service didn't start" + fi + else + ${_opt_SERVICE} "${_opt_MYSQLD}" start + if ! ${_opt_SERVICE} "${_opt_MYSQLD}" status >/dev/null 2>&1; then + _fn_sql_boom "Service didn't start" + fi + fi + fi + + if [ "$1" -eq 1 ]; then + echo "### Testing root access for ${_opt_SQL_FR}" + fi + _var_isthere="`${_opt_MYSQL} --user=root --password="${_opt_ROOTMYSQLPWD}" 'mysql' -sNe "select count(*) as existe from user where User = '${_opt_ADFB_USER}'"`" + #echo "${_var_isthere}" + if [ "$?" -ne 0 ]; then + echo "sudo vi '$0.password' # enter your root password here." + _fn_sql_boom "Is there a root password set for MySQL set in `basename "$0"`.password?" + fi + + if [ "$1" -eq 1 ]; then + _var_isthere="`${_opt_MYSQL} --user=root --password="${_opt_ROOTMYSQLPWD}" -sNe "SHOW DATABASES like '${_opt_AFDB_NAME}'"`" + #echo "${_var_isthere}" + if [ "$?" -ne 0 -o ! -z "${_var_isthere}" ]; then + echo "### AvantFAX database ${_opt_AFDB_NAME} already exists" + else + echo "### Creating AvantFAX ${_opt_SQL_FR} database" + ${_opt_MYSQLADMIN} --default-character-set=utf8 --user='root' --password="${_opt_ROOTMYSQLPWD}" create "${_opt_AFDB_NAME}" + + if [ "$?" -ne 0 ]; then + _fn_sql_boom "Can't create ${_opt_ADFB_USER} user" + fi + echo "### Creating ${_opt_ADFB_USER} account with password ${_opt_ADFB_PASS} for DB ${_opt_AFDB_NAME}" + ${_opt_MYSQL} --user='root' --password="${_opt_ROOTMYSQLPWD}" 'mysql' -e "GRANT ALL PRIVILEGES ON ${_opt_AFDB_NAME}.* TO '${_opt_ADFB_USER}'@'localhost' IDENTIFIED BY \"${_opt_ADFB_PASS}\"" + if [ "$?" -ne 0 ]; then + _fn_sql_boom "Can't grant to ${_opt_ADFB_USER} user" + fi + echo "`basename "$0"`: SQL configuration complete." + fi + elif [ "$1" -eq 2 ]; then + echo '### Backing up old AvantFAX into /root/avantfaxbackup' + mkdir -p '/root/avantfaxbackup' + ${_opt_MYSQLDUMP} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" > '/root/avantfaxbackup/db_backup.sql' + cp -pru "${_opt_INST_DIR}/includes/local_config.php" "${_opt_INST_DIR}/includes/config.php" "${_opt_INST_DIR}/faxes/" '/root/avantfaxbackup/' + fi + _fn_sql_deactivate +} + +# Reload apache, but only if it's already loaded +_fn_reload_http() { + echo '### Reloading http service' + if [ "${_opt_SYSTEMD}" -ne 0 ]; then + if systemctl -q is-active 'httpd.service'; then + systemctl reload 'httpd.service' + fi + else + if ${_opt_SERVICE} httpd status >/dev/null 2>&1; then + ${_opt_SERVICE} httpd graceful + fi + fi +} + +# $1 flag: 1 = install, 2 = upgrade +_fn_setup_post() { + if [ "$1" -eq 1 ]; then + echo "### DB Settings: ${_opt_ADFB_USER} ${_opt_ADFB_PASS} ${_opt_AFDB_NAME} (root password)" # ${_opt_ROOTMYSQLPWD}" + fi + _fn_check_mysql + #echo "### DB Settings: ${_opt_ADFB_USER} ${_opt_ADFB_PASS} ${_opt_AFDB_NAME}" # ${_opt_ROOTMYSQLPWD}" + for _var_i in '/etc/hylafax/hyla.conf' '/var/lib/hylafax/hfaxd.conf' '/usr/lib/fax/hfaxd.conf'; do + if [ -f "${_var_i}" ]; then + _var_HYLACONF="${_var_i}" + break + fi + done + + if [ -z "${_var_HYLACONF}" ]; then + echo 'Unable to find Hylafax or Hylafax+ configuration.' + exit 1 + fi + + _var_HYLACONF_DIR="`dirname "${_var_HYLACONF}"`" + + if ! grep -q "${_opt_AVANT_CMTTAG}"'$' "${_var_HYLACONF}" >/dev/null 2>&1; then + cat >> "${_var_HYLACONF}" << EOF +# ${_opt_AVANT_CMTTAG} +## JobFmt for AvantFAX ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +JOBFMT: "%-3j %3i %1a %15o %40M %-12.12e %5P %5D %7z %.25s" ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +EOF + fi + + # install database + _var_TABLES="`${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" -sNe 'show tables'`" + if [ "$?" -ne 0 ]; then + echo "##AvantFAX: Unable to view our database ${_opt_AFDB_NAME}" + echo 'Perhaps you need to run pre first' + echo 'If a previous uninstall failed you might need to manually:' + echo " * DROP DATABASE ${_opt_AFDB_NAME}" + echo " * DROP USER '${_opt_ADFB_USER}'@'localhost'" + exit 1 + elif [ -z "${_var_TABLES}" ]; then + ${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" < "/usr/lib/${_opt_AVANTFAX_SERVERNAME}/create_tables.sql" + if [ "$?" -ne 0 ]; then + echo "##AvantFAX: Unable to create our tables in database ${_opt_AFDB_NAME}" + exit 1 + fi + elif [ "$1" -eq 2 ]; then # upgrade database + echo '### Checking for AvantFAX db upgrades' + _var_AVANTFAX_VERSION="`grep '^\s\+$AVANTFAX_VERSION\s*=\s*'"'3" /root/avantfaxbackup/config.php | awk -F "'" '1 { print $2 }'`" # Example: 3.3.3. This is locked to version 3 for now. + _var_SHORTVERSION="`echo "${_var_AVANTFAX_VERSION}" | sed -e 's/\.//g'`" # Example: 333 + # echo "### Checking for AvantFAX database upgrades to ${_var_AVANTFAX_VERSION}" + + for _var_i in `ls "/usr/lib/${_opt_AVANTFAX_SERVERNAME}/db-update-"*.sql -l | awk -F '-' '1 { print $9 }' | awk -F "." '1 { print $1 }'`; do + # echo "### Checking db-update-${_var_i}.sql" + if [ "${_var_i}" -gt "${_var_SHORTVERSION}" ]; then + echo "### Applying db-update-${_var_i}.sql" + ${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" < "/usr/lib/${_opt_AVANTFAX_SERVERNAME}/db-update-${_var_i}.sql" + fi + done + echo '### Checking for AvantFAX db upgrades complete' + fi + + ####### DISABLE SELINUX FOR APACHE ####### + if [ "$1" -eq 1 ]; then + echo '### Disabling SELinux for Apache (permanently)' + fi + setsebool -P 'httpd_disable_trans' 1 >/dev/null 2>&1 + + ####### CONFIGURE AVANTFAX VIRTUALHOST ####### + + # Add Hylafax spool folder into the VirtualHost open_basedir. The PKGBUILD install places this file and adds the Include to httpd.conf + _var_file="/etc/httpd/conf/extra/httpd-${_opt_AVANTFAX_SERVERNAME}.conf" + if [ -f "${_var_file}" ] && ! grep -q ":${_opt_HYLASPOOL}/" "${_var_file}" >/dev/null 2>&1; then + sed -i -e 's|^\(\s\+php_admin_value open_basedir "[^"]\+\)"$|\1:'"${_opt_HYLASPOOL}"'/"|g' \ + "${_var_file}" + fi + + # Arch Linux doesn't add virtual hosts this way. It's tested for add and remove but it's not tested for proper functionality. + if [ "${_opt_VHOSTS}" -ne 0 ]; then + _var_file='/etc/httpd/conf/extra/httpd-vhosts.conf' + if ! grep -q "${_opt_AVANT_CMTTAG}"'$' "${_var_file}" >/dev/null 2>&1; then + cat >> "${_var_file}" << EOF +NameVirtualHost *:80 ${_opt_AVANT_CMTTAG} + ${_opt_AVANT_CMTTAG} +<VirtualHost *:80> ${_opt_AVANT_CMTTAG} + DocumentRoot ${_opt_INST_DIR} ${_opt_AVANT_CMTTAG} + ServerName ${_opt_AVANTFAX_SERVERNAME} ${_opt_AVANT_CMTTAG} + ErrorLog logs/${_opt_AVANTFAX_SERVERNAME}-error_log ${_opt_AVANT_CMTTAG} + CustomLog logs/${_opt_AVANTFAX_SERVERNAME}-access_log common ${_opt_AVANT_CMTTAG} +</VirtualHost> ${_opt_AVANT_CMTTAG} +EOF + _fn_reload_http + if [ "$1" -eq 1 ]; then + echo '### Reloading your http server to access AvantFAX' + fi + fi + chmod 644 "${_var_file}" + fi + + ####### SYMLINK AVANTFAX SCRIPTS ####### + + _var_file="${_var_HYLACONF_DIR}/sendfax.conf" + if ! grep -q "^CoverCmd:\s\+${_opt_INST_DIR}/" "${_var_file}" >/dev/null 2>&1; then + echo "CoverCmd: ${_opt_INST_DIR}/includes/faxcover.php ${_opt_AVANT_CMTTAG}" >> "${_var_file}" + fi + chmod 644 "${_var_file}" + + _var_file="${_opt_INST_DIR}/includes/local_config.php" + cp -p "${_opt_INST_DIR}/includes/local_config-example.php" "${_var_file}" + sed -i -e "s:^\(\s\+define('AFDB_USER',\s*'\)[^']\+\('\):\1${_opt_ADFB_USER}\2:g" \ + -e "s:^\(\s\+define('AFDB_PASS',\s*'\)[^']\+\('\):\1${_opt_ADFB_PASS}\2:g" \ + -e "s:^\(\s\+define('AFDB_NAME',\s*'\)[^']\+\('\):\1${_opt_AFDB_NAME}\2:g" \ + -e 's:^\(\s\+$HYLASPOOL'"\s*=\s*'\)[^']\+\('\):\1${_opt_HYLASPOOL}\2:g" \ + -e 's:^\(\s\+$WWWUSER'"\s*=\s*'\)[^']\+\('\):\1${_opt_WWWUSER}\2:g" \ + -e 's:^\(\s\+$AVANTFAX_SERVERNAME'"\s*=\s*'\)[^']\+\('\):\1${_opt_AVANTFAX_SERVERNAME}\2:g" \ + "${_var_file}" + + for _var_file in 'faxrcvd.php' 'dynconf.php' 'notify.php'; do + if [ ! -e "${_opt_HYLASPOOL}/bin/${_var_file}" ]; then + ln -s "${_opt_INST_DIR}/includes/${_var_file}" "${_opt_HYLASPOOL}/bin/${_var_file}" + fi + done + + # Arch Linux 'man file' shows /usr/share/file/misc/magic. + # I can't find where file or magic is used in the php files so + # so I don't know how to fix this. + ####### FIX FILEINFO ####### + #for _var_file in `ls "/usr/share/file/magic*"`; do + # if [ ! -e "/usr/share/misc/`basename ${_var_file}`" ]; then + # ln -s "${_var_file}" "/usr/share/misc/" + # fi + #done + + ####### SETUP SUDO PERMISSIONS ####### + if [ ! -d '/etc/sudoers.d' ]; then + if [ "$1" -eq 1 ]; then + echo '### Configuring sudo sans sudoers.d' + fi + + if ! grep -ql "^${_opt_SUDO_LINE}" '/etc/sudoers' >/dev/null 2>&1; then + sed -i -e 's:^\([^#].*requiretty.*\)$:'"# \1 ${_opt_AVANT_CMTTAG}:g" /etc/sudoers + echo "${_opt_SUDO_LINE} -u * -p * * ${_opt_AVANT_CMTTAG}" >> /etc/sudoers + fi + fi + + ####### Sendmail setting + if [ -f '/etc/mail/trusted-users' ]; then + grep "^${_opt_WWWUSER}"'$' '/etc/mail/trusted-users' || echo "${_opt_WWWUSER}" >> '/etc/mail/trusted-users' + fi + + ####### CONFIGURE MODEMS TO USE AVANTFAX ####### + # Make backup of HylaFAX configuration + # if [ ! -d "${_opt_HYLASPOOL}/etc/abackup" ]; then + # mkdir -p "${_opt_HYLASPOOL}/etc/abackup" + # cp -f "${_opt_HYLASPOOL}/etc/config"* "${_opt_HYLASPOOL}/etc/hosts.hfaxd" "${_opt_HYLASPOOL}/etc/abackup/" >/dev/null 2>&1 + # fi + + for _var_file in `ls "${_opt_HYLASPOOL}/etc/config".*`; do + _var_file_base="`basename "${_var_file}"`" + if [ "${_var_file}" != "${_opt_HYLASPOOL}/etc/config.sav" \ + -a "${_var_file}" != "${_opt_HYLASPOOL}/etc/config.devid" \ + -a ! -L "${_var_file}" \ + -a "`expr "${_var_file_base}" : '.*~.*'`" -eq 0 ]; then + if ! grep -q "${_opt_AVANT_CMTTAG}" "${_var_file}" >/dev/null 2>&1; then + cat >> "${_var_file}" << EOF +# ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +## AvantFAX ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +FaxRcvdCmd: bin/faxrcvd.php ${_opt_AVANT_CMTTAG} +DynamicConfig: bin/dynconf.php ${_opt_AVANT_CMTTAG} +UseJobTSI: true ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +EOF + fi + + ####### ADD MODEMS TO AVANTFAX DATABASE ####### + _var_modem="`echo ${_var_file} | awk -F'/' '{print $6}' | awk -F'.' '{print $2}'`" + #echo ${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" -e "select count(*) as existe from Modems where device='${_var_modem}'" + _var_exists="`${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" -sNe "select count(*) as existe from Modems where device='${_var_modem}'"`" + #_var_exists="`expr "${_var_exists}" : '^existe\s\+\([0-9]\+\)\$'`" + #echo "${var_exists}" + [ -z "${_var_exists}" ] && _var_exists=0 + if [ "${_var_exists}" -eq 0 ]; then + # ADD MODEMS TO AVANTFAX DATABASE + echo "Adding modem: ${_var_modem}" + ${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" -e "INSERT INTO Modems SET device='${_var_modem}', alias ='${_var_modem}'" + if [ "$?" -ne 0 ]; then + echo "##AvantFAX: Failed to add modem ${_var_modem}" + exit 1 + fi + fi + fi + done + + _var_file="${_opt_HYLASPOOL}/etc/config" + if ! grep -q "NotifyCmd:\s\+bin/notify.php" "${_var_file}" >/dev/null 2>&1; then + cat >> "${_var_file}" << EOF +# ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +## AvantFAX ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +NotifyCmd: bin/notify.php ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +EOF + chmod 644 "${_var_file}" + fi + + ####### ADD CRONTAB ENTRIES ####### + if [ -d '/etc/cron.d' -a "${_opt_SYSTEMD}" -eq 0 ]; then + _var_file="/etc/cron.d/${_opt_AVANTFAX_SERVERNAME}" + if [ ! -f "${_var_file}" ]; then + printf "0 0 * * *\t`which su` -s `which sh` '${_opt_WWWUSER}' -c 'cd ${_opt_INST_DIR}; includes/avantfaxcron.php -t 2'\n" > "${_var_file}" + fi + chmod 644 "${_var_file}" + fi + + chown "${_opt_WWWUSER}:${_opt_HYLA_GROUP}" "${_opt_INST_DIR}/tmp" "${_opt_INST_DIR}/faxes" + chown -R "${_opt_WWWUSER}:${_opt_HYLA_GROUP}" "${_opt_INST_DIR}/faxes/recvd" "${_opt_INST_DIR}/faxes/sent" +# chmod -R 777 "${_opt_INST_DIR}/faxes" "${_opt_INST_DIR}/tmp" + + ####### CONFIGURE FAXMAIL ####### + _var_file="${_var_HYLACONF_DIR}/faxmail.conf" + if [ ! -f "${_var_file}" ]; then + cat > "${_var_file}" << EOF +# ${_opt_AVANT_CMTTAG} +AutoCoverPage: false ${_opt_AVANT_CMTTAG} +TextPointSize: 12pt ${_opt_AVANT_CMTTAG} +Headers: Message-id Date Subject From ${_opt_AVANT_CMTTAG} +MailUser: faxmail ${_opt_AVANT_CMTTAG} +# ${_opt_AVANT_CMTTAG} +EOF + fi + chmod 644 "${_var_file}" + + if [ "$1" -eq 1 ]; then + if [ -z "`command -v ip`" ]; then + # _var_i="`/sbin/ifconfig eth0 | grep 'inet addr' | awk -F' ' '{print \$2}' | awk -F':' '{print \$2}'`" + _var_i="`ifconfig | grep '^\s\+inet [0-9\.]\+ ' | awk -F' ' '{print \$2}' | grep -m 1 -xv '127.0.0.1'`" + else + _var_i="`ip addr`" + _var_i="`echo "${_var_i}" | grep ' inet ' | awk '{print \$2}' | sed -e 's:/.\+\$::g' | grep -m 1 -xv '127.0.0.1'`" + fi + echo "###############################################################################" + echo "Log into the AvantFAX Administrative interface at: http://${_var_i}/${_opt_AVANTFAX_SERVERNAME}/admin/" + echo "Username: admin" + echo "Password: password" + echo "###############################################################################" + echo "Done" + fi +} + +# $1 flag: 0 = uninstall, 1 = upgrade +_fn_setup_preun() { + if [ "$1" -eq 0 ]; then + rm -rf "${_opt_INST_DIR}/tmp/*" + fi +} + +# For files that don't have a .d folder, clean out our tagged lines, preserving permissions. +_fn_cleanfile() { + if [ -s "$1" ]; then + rm -f '/tmp/avantfax.cleanfile' + if grep -q "${_opt_AVANT_CMTTAG}"'$' "$1" >/dev/null 2>&1; then + cp -p "$1" '/tmp/avantfax.cleanfile' + grep -v "${_opt_AVANT_CMTTAG}"'$' '/tmp/avantfax.cleanfile' > "$1" + rm -f '/tmp/avantfax.cleanfile' + if [ ! -s "$1" ]; then + rm -f "$1" + fi + return 0 + fi + fi + return 1 +} + +# This script must be copied at %preun by the package installer. +# When the package %postun runs this has long been deleted. + +# $1 flag: 0 = uninstall, 1 = upgrade +_fn_setup_postun() { + if [ "$1" -eq 0 ]; then + echo "### Uninstalling (postun)" + echo "### Removing HTTP virtual host" + rm -rf "${_opt_BIN_DIR}" + if _fn_cleanfile '/etc/httpd/conf/extra/httpd-vhosts.conf'; then + _fn_reload_http + fi + + echo "### Restoring HylaFAX settings" + rm -f "/etc/cron.d/${_opt_AVANTFAX_SERVERNAME}" "${_opt_HYLASPOOL}/bin/notify.php" "${_opt_HYLASPOOL}/bin/faxrcvd.php" "${_opt_HYLASPOOL}/bin/dynconf.php" + + # Clean up modem files + for _var_file in "${_opt_HYLASPOOL}/etc/config"*; do + _fn_cleanfile "${_var_file}" + done + + _var_file='/etc/mail/trusted-users' + if [ -f "${_var_file}" ] && grep -q "^${_opt_WWWUSER}"'$' "${_var_file}" >/dev/null 2>&1; then + _var_tmpfile='/tmp/avantfax.trusted-users' + cp -p "${_var_file}" "${_var_tmpfile}" + grep -v "^${_opt_WWWUSER}"'$' "${_var_tmpfile}" > "${_var_file}" + rm -f "${_var_tmpfile}" + fi + + ${_opt_HYLA_BIN_DIR}/faxdeluser "${_opt_WWWUSER}" + + echo "### DB Settings: ${_opt_ADFB_USER} ${_opt_ADFB_PASS} ${_opt_AFDB_NAME}" # ${_opt_ROOTMYSQLPWD}" + + _var_users="`${_opt_MYSQL} --user="${_opt_ADFB_USER}" --password="${_opt_ADFB_PASS}" "${_opt_AFDB_NAME}" -sNe "select username from UserAccount"`" + + for _var_i in ${_var_users}; do + ${_opt_HYLA_BIN_DIR}/faxdeluser "${_var_i}" + done + + _fn_cleanfile '/etc/sudoers' + + echo "### Removing user ${_opt_ADFB_USER}" + ${_opt_MYSQL} --user='root' --password="${_opt_ROOTMYSQLPWD}" 'mysql' -e "DROP USER '${_opt_ADFB_USER}'@'localhost'" + + echo "### Removing database: ${_opt_AFDB_NAME}" + ${_opt_MYSQLADMIN} --user='root' --password="${_opt_ROOTMYSQLPWD}" --force drop "${_opt_AFDB_NAME}" + + rm -f "$0.password" + echo "### Done" + #elif [ "$1" -eq 1 ]; then + # echo "### Upgrading (postun)" + fi +} + +_fn_usage_boom() { + echo "##Setup tool for AvantFAX" + echo '' + echo "Usage: `basename "$1"` flag rpmfunc [[flag] rpmfunc...]" + echo 'flag = {0,1,2} (same as RPM .spec)' + echo 'rpmfunc = {package,install,build,pre,post,preun,postun}' + echo '' + echo "But ignore all that. That's for package build scripts." + echo "You're here because part of the install was missed." + echo 'What you want is to finish your install with this:' + echo '' + echo "`basename "$1"` install" + echo '' + echo 'This should be run anytime you upgrade Hylafax,' + echo 'run faxaddmodem, or faxsetup.' + echo 'Modems removed from Hylafax can be manually removed in AvantFAX.' + exit 0 +} + +# $1 flag: 1 = install, 2 = upgrade +_fn_setup_install() { + _fn_setup_build + _fn_setup_pre "$1" + _fn_setup_post "$1" +} + +if [ "$#" -eq 0 ]; then + _fn_usage_boom "$0" +fi + +_var_flag=1 +while [ "$#" -ne 0 ]; do + case "$1" in + 0|1|2) _var_flag="$1";; + package|install|build|pre|post|preun|postun) "_fn_setup_$1" "${_var_flag}";; + *) _fn_usage_boom "$0";; + esac + shift +done |