#!/bin/sh
#
#  php5enmod - a php5 module manager for Debian
#
#  Copyright 2013 Ondřej Surý <ondrej@sury.org>
#
# This program is licensed at your choice under the terms of the GNU General
# Public License version 2+ or under the terms of the PHP License 3.01.
#
# For GPL-2+:
# This program 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 (at your option) any later version.
#
# This program 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
# USA.
#
# For PHP 3.01:
# This source file is subject to version 3.01 of the PHP license,
# that is bundled with this package in the file LICENSE, and is
# available through the world-wide-web at the following url:
# http://www.php.net/license/3_01.txt
# If you did not receive a copy of the PHP license and are unable to
# obtain it through the world-wide-web, please send a note to
# license@php.net so we can mail you a copy immediately.
#

set -ue

SCRIPT_NAME=${0##*/}
QUIET=no
NEED_RESTART=no
MAINT_MODE=no
PURGE=no
FORCE=no

. /usr/share/php5/php5-helper

usage() {
    [ -n "$@" ] && warning $@
    echo "usage: ${SCRIPT_NAME} [ -s ALL|sapi_name ] module_name [ module_name_2 ]"
    exit 1
}

enmods() {
    local sapis="$1"
    local mods="$2"
    local sapi
    local mod

    for sapi in $sapis; do
	for mod in $mods; do
	    enmod_ret=0
            enmod $sapi $mod || enmod_ret=$?
	    case $enmod_ret in
		0)
		    NEED_RESTART=yes
		    record_state enabled $sapi $mod
		    ;;
	    esac
	done
    done
}

dismods() {
    local sapis="$1"
    local mods="$2"
    local sapi
    local mod

    for sapi in $sapis; do
	for mod in $mods; do
	    local dismod_ret=0
            dismod $sapi $mod || dismod_ret=$?
	    case $dismod_ret in
		0)
		    NEED_RESTART=yes
		    record_state disabled $sapi $mod
		    ;;
	    esac
	    if [ "$PURGE" = "yes" ]; then
		remove_state enabled $sapi $mod
		remove_state disabled $sapi $mod
	    fi
	done
    done
}

enmod() {
    local sapi=$1
    local modname=$2

    if ! module_exists $modname; then
	warning "Module $module ini file doesn't exist under /etc/php5/mods-available"
	return 1
    fi

    local priority=$(get_priority $sapi $modname)
    local live_link=$(get_live_link $sapi $modname $priority)
    local live_link_content=$(get_live_link_content $sapi $modname $priority)

    module_cleanup $sapi $modname $priority

    local module_state=0
    php5query -q -s $sapi -m $modname || module_state=$?

    case $module_state in
	# module enabled
	0)
	    return 0
	    ;;
	# module not yet enabled
	1)
	    ;;
	# module disabled by maintainer script
	33)
	    ;;
	# module disabled by site administrator
	# enable module only if not running in maintainer mode
	32)
	    if [ "$MAINT_MODE" = "yes" ]; then
		warning "Not enabling the ${modname} module for ${sapi} SAPI since the module"
		warning "was disabled by local administrator."
		return 1
	    fi
	    ;;
	34)
            warning "Not enabling the ${modname} module for ${sapi} SAPI since module symlink"
	    warning "already exists in /etc/php5/${sapi}/conf.d with different content."
	    return 1
	    ;;
	# fail if we get any different result
	*)
	    warning "Unable to get module state, run php5query -s $sapi -m $modname manually"
	    warning "and fix the module state."
	    return 1
    esac

    if [ -d "/etc/php5/$sapi/conf.d" ]; then
	ln -s "${live_link_content}" "${live_link}"
    fi

    return 0
}

dismod() {
    local sapi=$1
    local modname=$2

    if ! module_exists $modname; then
	if [ "$PURGE" != "no" ]; then
	    warning "Module $module ini file doesn't exist under /etc/php5/mods-available"
	    return 1
	fi
    fi

    local priority=$(get_priority $sapi $modname)
    local live_link=$(get_live_link $sapi $modname $priority)
    local live_link_content=$(get_live_link_content $sapi $modname $priority)

    module_cleanup $sapi $modname $priority

    local module_state=0
    php5query -q -s $sapi -m $modname || module_state=$?

    case $module_state in
	# module enabled
	0)
	    ;;
	# module not enabled
	1|32|33)
	    return 0
	    ;;
	34)
	    warning "Not disabling module $module for $sapi SAPI.  The configuration was"
	    warning "modified by local administrator."
	    return 1
	    ;;
	# fail if we get any different result
	*)
	    warning "Unable to get module state, run php5query -s $sapi -m $module manually"
	    warning "and fix the module state."
	    return 1
    esac

    if [ -d "/etc/php5/$sapi/conf.d" ]; then
	rm -f $live_link
    fi

    return 0
}

sapis=
while getopts pfs:mq opt; do
    case $opt in
	s)
	    if [ "$sapis" = "ALL" -o \( "$OPTARG" = "ALL" -a -n "$sapis" \) ]; then
		warning "You cannot specify ALL and individual sapis"
		usage
	    fi
	    sapis="${sapis}${sapis:+ }$OPTARG"
	    ;;
	m) MAINT_MODE=yes;;
	p) PURGE=yes;;
	f) FORCE=yes;;
	q) QUIET=yes;;
	\?) usage;;
    esac
done
shift $(expr $OPTIND - 1)
mods="$@"
sapis="${sapis:-ALL}"

if [ "$sapis" = "ALL" ]; then
    sapis=$(php5query -S)
fi

[ -z "$mods" ] && usage

case "${SCRIPT_NAME}" in
php5enmod)
    enmods "$sapis" "$mods"
    ;;
php5dismod)
    dismods "$sapis" "$mods"
    ;;
*)
    usage
    ;;
esac
exit 0
