#!/bin/bash

# Copyright 2014 Cloud Linux Zug GmbH
#
# Licensed under CLOUD LINUX LICENSE AGREEMENT
# http://cloudlinux.com/docs/LICENSE.TXT

SOCKPATH="/tmp/lshttpd"

function getPHPtype(){
    cat /usr/local/apache/conf/php.conf.yaml | grep php5: | cut -d":" -f2 | tr -d ' '
}

function isSuexec(){
    TMP=`cat /usr/local/apache/conf/php.conf.yaml | grep suexec: | cut -d":" -f2 | tr -d ' '`
    if [ "$TMP" == "1" ]; then
	echo "yes"
    else
	echo "no"
    fi
    
}

function getEasyApacheVer(){
    cat /var/cpanel/easy/apache/profile/_main.yaml | grep version | cut -d":" -f2 | tr -d ' ' | tr -d "'"
}

function getUserConfigSuphp(){
    DOMAIN="$1"
    if [ -z "$DOMAIN" ]; then
	echo ""
    else
	UN=`/scripts/whoowns "$1" | tr -d '\n' | tr -d ' '`
	if [ -z "$UN" ]; then
	    echo ""
	else
	    HD=`/usr/share/lve/modlscapi/utils/getdocroot.pm "$UN" "$DOMAIN"`
	    if [ -n "$HD" ]; then
		if [ ! -e "$HD/.htaccess" ]; then
		    touch "$HD/.htaccess"
		    chown "$UN":"$UN" "$HD/.htaccess"
		fi
		echo "$HD/.htaccess"
	    else
		echo "$HD/.htaccess"
	    fi
	fi
    fi
}

function getUserConfigFcgid(){
    DOMAIN="$1"
    if [ -z "$DOMAIN" ]; then
	echo ""
    else
	UN=`/scripts/whoowns "$1" | tr -d '\n' | tr -d ' '`
	if [ -z "$UN" ]; then
	    echo ""
	else
	    echo "/var/cpanel/userdata/$UN/$DOMAIN"
	fi
    fi
}

function getUserConfigFcgid_SSL(){
    DOMAIN="$1"
    if [ -z "$DOMAIN" ]; then
	echo ""
    else
	UN=`/scripts/whoowns "$1" | tr -d '\n' | tr -d ' '`
	if [ -z "$UN" ]; then
	    echo ""
	else
	    echo "/var/cpanel/userdata/$UN/$DOMAIN""_SSL"
	fi
    fi
}

function normalizeconfig(){
    if [ -e /usr/local/apache/conf/conf.d/lsapi.conf ]; then
	cat /usr/local/apache/conf/conf.d/lsapi.conf | tr -s '#' > /usr/local/apache/conf/conf.d/lsapi.conf.tmp1
	mv -f /usr/local/apache/conf/conf.d/lsapi.conf.tmp1 /usr/local/apache/conf/conf.d/lsapi.conf
    fi
}

if [ "$1" == "--uninstall" ]; then
    normalizeconfig
    if [ -e "/var/cpanel/conf/apache/main.bak" ]; then
	mv -f /var/cpanel/conf/apache/main.bak /var/cpanel/conf/apache/main
    fi
    if [ -e /usr/local/apache/conf/conf.d ]; then
	cat /usr/local/apache/conf/conf.d/lsapi.conf | sed 's/LoadModule/#LoadModule/g' > /usr/local/apache/conf/conf.d/lsapi.conf.tmp
	cp -f /usr/local/apache/conf/conf.d/lsapi.conf.tmp /usr/local/apache/conf/conf.d/lsapi.conf
    fi    
    
    if [ -e /var/cpanel/templates/apache2_4/vhost.default.bak ]; then
	mv -f /var/cpanel/templates/apache2_4/vhost.default.bak /var/cpanel/templates/apache2_4/vhost.default
    fi
    
    if [ -e /var/cpanel/templates/apache2_4/ssl_vhost.default.bak ]; then
	mv -f /var/cpanel/templates/apache2_4/ssl_vhost.default.bak /var/cpanel/templates/apache2_4/ssl_vhost.default
    fi
    
    if [ -e /var/cpanel/templates/apache2_2/vhost.default.bak ]; then
	mv -f /var/cpanel/templates/apache2_2/vhost.default.bak /var/cpanel/templates/apache2_2/vhost.default
    fi
    
    if [ -e /var/cpanel/templates/apache2_2/ssl_vhost.default.bak ]; then
	mv -f /var/cpanel/templates/apache2_2/ssl_vhost.default.bak /var/cpanel/templates/apache2_2/ssl_vhost.default
    fi
    
    #Disable all domains if exists for suphp
    /usr/share/lve/modlscapi/utils/getdocroots.pm | while read line;
    do
    if [ -e "$line/.htaccess" ]; then
	sed -i '/x-httpd-lsphp/d' "$line/.htaccess"
    fi
    done
    #Disable all domains if exists for fcgid
    /usr/share/lve/modlscapi/utils/getuserdomains.pm | while read line;
    do
	U=`echo $line | cut -d' ' -f1`
	D=`echo $line | cut -d' ' -f2`
	if [ -e "/var/cpanel/userdata/$U/$D" ]; then
	    sed -i '/modlsapi/d' "/var/cpanel/userdata/$U/$D"
	fi
    done 

    /scripts/rebuildhttpdconf
    echo "Reconfiguration completed"
    exit
fi

PHP=`getPHPtype`

if [ "$1" == "--setup" ]; then
    SUE=`isSuexec`
    if [ "$SUE" == "no" ]; then
	echo "SUEXEC mechanism should be enabled"
	exit 255
    fi
    normalizeconfig
    if [ ! -e "/var/cpanel/conf/apache/main.bak" ]; then
	cp /var/cpanel/conf/apache/main /var/cpanel/conf/apache/main.bak
    fi
    
    cat /var/cpanel/conf/apache/main | sed -n '/mod_ruid2\.so/{N;s/.*//;x;d;};x;p;${x;p;}' | sed '/^$/d' > /var/cpanel/conf/apache/main.tmp
    cat /var/cpanel/conf/apache/main.tmp | sed -n '/mod_ruid2\.conf/{s/.*//;x;d;};x;p;${x;p;}' | sed '/^$/d' > /var/cpanel/conf/apache/main
    rm -f /var/cpanel/conf/apache/main.tmp

    if [ -e /usr/local/apache/conf/conf.d ]; then
	cat /usr/local/apache/conf/conf.d/lsapi.conf | sed 's/#LoadModule/LoadModule/g' > /usr/local/apache/conf/conf.d/lsapi.conf.tmp
	cp -f /usr/local/apache/conf/conf.d/lsapi.conf.tmp /usr/local/apache/conf/conf.d/lsapi.conf
    fi
    
    if [ -e /usr/local/apache/conf/conf.d ]; then
        cat /usr/local/apache/conf/conf.d/lsapi.conf | sed 's/AddType application\/x-httpd-lsphp \.php/#AddType application\/x-httpd-lsphp \.php/g' > /usr/local/apache/conf/conf.d/lsapi.conf.tmp
        cp -f /usr/local/apache/conf/conf.d/lsapi.conf.tmp /usr/local/apache/conf/conf.d/lsapi.conf
    fi
    if [ "$PHP" == "suphp" ]; then
	echo "SUPHP deteceted"	
    fi
    
    if [ "$PHP" == "fcgi" ]; then
	echo "FCGID deteceted"
    fi
    
    VER=`getEasyApacheVer`
    if [ "$VER" == "2_4" ]; then
	if [ -e /var/cpanel/templates/apache2_4/ssl_vhost.default ]; then
	    if [ ! -e /var/cpanel/templates/apache2_4/ssl_vhost.default.bak ]; then
		cp /var/cpanel/templates/apache2_4/ssl_vhost.default /var/cpanel/templates/apache2_4/ssl_vhost.default.bak
	    fi
            IS_PATCHED=`cat /var/cpanel/templates/apache2_4/ssl_vhost.default | grep lsapi`
            if [ -z "$IS_PATCHED" ]; then
	        patch -p0 /var/cpanel/templates/apache2_4/ssl_vhost.default /usr/share/lve/modlscapi/tars/apache2_4.patch
            fi
	fi
	if [ -e /var/cpanel/templates/apache2_4/vhost.default ]; then
	    if [ ! -e /var/cpanel/templates/apache2_4/vhost.default.bak ]; then
		cp /var/cpanel/templates/apache2_4/vhost.default /var/cpanel/templates/apache2_4/vhost.default.bak
	    fi
            IS_PATCHED=`cat /var/cpanel/templates/apache2_4/vhost.default | grep lsapi`
            if [ -z "$IS_PATCHED" ]; then
	       patch -p0 /var/cpanel/templates/apache2_4/vhost.default /usr/share/lve/modlscapi/tars/apache2_4.patch
            fi
	fi
    fi
    if [ "$VER" == "2_2" ]; then
	if [ -e /var/cpanel/templates/apache2_2/ssl_vhost.default ]; then
	    if [ ! -e /var/cpanel/templates/apache2_2/ssl_vhost.default.bak ]; then
		cp /var/cpanel/templates/apache2_2/ssl_vhost.default /var/cpanel/templates/apache2_2/ssl_vhost.default.bak
	    fi
            IS_PATCHED=`cat /var/cpanel/templates/apache2_2/ssl_vhost.default | grep lsapi`
            if [ -z "$IS_PATCHED" ]; then
	       patch -p0 /var/cpanel/templates/apache2_2/ssl_vhost.default /usr/share/lve/modlscapi/tars/apache2_2.patch
            fi
	fi
	if [ -e /var/cpanel/templates/apache2_2/vhost.default ]; then
	    if [ ! -e /var/cpanel/templates/apache2_2/vhost.default.bak ]; then
		cp /var/cpanel/templates/apache2_2/vhost.default /var/cpanel/templates/apache2_2/vhost.default.bak
	    fi
            IS_PATCHED=`cat /var/cpanel/templates/apache2_2/vhost.default | grep lsapi`
            if [ -z "$IS_PATCHED" ]; then
	       patch -p0 /var/cpanel/templates/apache2_2/vhost.default /usr/share/lve/modlscapi/tars/apache2_2.patch
            fi
	fi
    fi
    /usr/share/lve/modlscapi/utils/checkconfdutil.pm
    /scripts/rebuildhttpdconf
    if [ ! -e /usr/local/bin/lsphp ]; then
	cp /opt/alt/php54/usr/bin/lsphp /usr/local/bin/
	ln -s /usr/local/bin/lsphp /etc/cl.selector/lsphp
	cagefsctl --update-etc
	RES=`cat /etc/cl.selector/native.conf | grep lsphp=/usr/local/bin/lsphp `
	if [ -z "$RES" ]; then
	    echo "lsphp=/usr/local/bin/lsphp" >> /etc/cl.selector/native.conf
	fi
	cagefsctl --setup-cl-selector
    fi
    /usr/sbin/cagefsctl --check-mp
    IS_MNT=`cat /etc/cagefs/cagefs.mp | grep "$SOCKPATH"`
    if [ -z "$IS_MNT" ]; then
	mkdir -p "$SOCKPATH"
	chmod 755 "$SOCKPATH"
        chown nobody:nobody "$SOCKPATH"
	echo "$SOCKPATH" >> /etc/cagefs/cagefs.mp
	cagefsctl --remount-all
    fi
    /usr/sbin/cagefsctl --check-mp
    
    
    CSF_CONFIG="/etc/csf/csf.pignore"
    CSF_MAIN_RULE="exe:/usr/local/bin/lsphp"
    CSF_ALT_RULE="pexe:/opt/alt/php.*/usr/bin/lsphp"

    if [ -f "${CSF_CONFIG}" ]; then
	[ -e "${CSF_CONFIG}.bkp" ] || cp "${CSF_CONFIG}" "${CSF_CONFIG}.bkp"
	grep -v '^[[:space:]]*#' "${CSF_CONFIG}" | grep -Fq "${CSF_MAIN_RULE}" || echo "${CSF_MAIN_RULE}" >> "$CSF_CONFIG"
	grep -v '^[[:space:]]*#' "${CSF_CONFIG}" | grep -Fq "${CSF_ALT_RULE}" || echo "${CSF_ALT_RULE}" >> "$CSF_CONFIG"
	service lfd restart 2>/dev/null >/dev/null
    fi

    echo "Reconfiguration completed"
    exit
fi



if [ "$1" == "--enable-domain" ]; then
    if [ -z "$2" ]; then
	echo "$0 --enable-domain [DOMAIN] - should have domain specified"
	exit 255
    fi
    if [ "$PHP" == "fcgi" ]; then
	PA=`getUserConfigFcgid "$2"`
	if [ -n "$PA" ]; then
	    if [ -e "$PA" ]; then
		IS=`cat "$PA" | grep "modlsapi:"`
		if [ -z "$IS" ]; then
		    echo "modlsapi: .php5 .php4 .php .php3 .php2 .phtml" >> "$PA"
		    /scripts/rebuildhttpdconf
		fi
	    fi
	else
	    echo "Domain $2 not found"
	    exit 255
	fi
	PASSL=`getUserConfigFcgid_SSL "$2"`
	if [ -n "$PASSL" ]; then
	    if [ -e "$PASSL" ]; then
		IS=`cat "$PASSL" | grep "modlsapi:"`
		if [ -z "$IS" ]; then
		    echo "modlsapi: .php5 .php4 .php .php3 .php2 .phtml" >> "$PASSL"
		    /scripts/rebuildhttpdconf
		fi
	    fi
	fi
    fi
    if [ "$PHP" == "suphp" ]; then
	PA=`getUserConfigSuphp "$2"`
	if [ -n "$PA" ]; then
	    if [ -e "$PA" ]; then
		IS=`cat "$PA" | grep "x-httpd-lsphp"`
		if [ -z "$IS" ]; then
		    echo "AddType application/x-httpd-lsphp .php5 .php4 .php .php3 .php2 .phtml" >> "$PA"
		fi
	    else
		echo "Can't create $PA"
		exit 255
	    fi
	else
	    echo "Domain $2 not found"
	    exit 255
	fi
    fi
    exit
fi

if [ "$1" == "--disable-domain" ]; then
    if [ -z "$2" ]; then
	echo "$0 --disable-domain [DOMAIN] - should have domain specified"
	exit 255
    fi
    if [ "$PHP" == "fcgi" ]; then
	PA=`getUserConfigFcgid "$2"`
	if [ -n "$PA" ]; then
	    if [ -e "$PA" ]; then
		IS=`cat "$PA" | grep "modlsapi:"`
		if [ -n "$IS" ]; then
		    sed -i '/modlsapi/d' "$PA"
		    /scripts/rebuildhttpdconf
		fi
	    fi
	else
	    echo "Domain $2 not found"
	    exit 255
	fi
	PASSL=`getUserConfigFcgid_SSL "$2"`
	if [ -n "$PASSL" ]; then
	    if [ -e "$PASSL" ]; then
		IS=`cat "$PASSL" | grep "modlsapi:"`
		if [ -n "$IS" ]; then
		    sed -i '/modlsapi/d' "$PASSL"
		    /scripts/rebuildhttpdconf
		fi
	    fi
	fi
    fi
    if [ "$PHP" == "suphp" ]; then
	PA=`getUserConfigSuphp "$2"`
	if [ -n "$PA" ]; then
	    if [ -e "$PA" ]; then
		IS=`cat "$PA" | grep "lsphp"`
		if [ -n "$IS" ]; then
		    sed -i '/x-httpd-lsphp/d' "$PA"

		fi
	    else
		echo "Can't create $PA"
		exit 255
	    fi
	else
	    echo "Domain $2 not found"
	    exit 255
	fi
    fi
    exit
fi

if [ "$1" == "--enable-global" ]; then
    normalizeconfig
    if [ -e /usr/local/apache/conf/conf.d ]; then
        cat /usr/local/apache/conf/conf.d/lsapi.conf | sed 's/#AddType application\/x-httpd-lsphp/AddType application\/x-httpd-lsphp/g' > /usr/local/apache/conf/conf.d/lsapi.conf.tmp
        cp -f /usr/local/apache/conf/conf.d/lsapi.conf.tmp /usr/local/apache/conf/conf.d/lsapi.conf
    fi
    
    cat /var/cpanel/conf/apache/main | sed -n '/php\.conf/{s/.*//;x;d;};x;p;${x;p;}' | sed '/^$/d' > /var/cpanel/conf/apache/main.tmp2
    cat /var/cpanel/conf/apache/main.tmp2 > /var/cpanel/conf/apache/main
    rm -f /var/cpanel/conf/apache/main.tmp2
    
    /scripts/rebuildhttpdconf
    exit

fi

if [ "$1" == "--disable-global" ]; then
    normalizeconfig
    if [ -e /usr/local/apache/conf/conf.d ]; then
        cat /usr/local/apache/conf/conf.d/lsapi.conf | sed 's/AddType application\/x-httpd-lsphp/#AddType application\/x-httpd-lsphp/g' > /usr/local/apache/conf/conf.d/lsapi.conf.tmp
        cp -f /usr/local/apache/conf/conf.d/lsapi.conf.tmp /usr/local/apache/conf/conf.d/lsapi.conf
    fi
    /usr/share/lve/modlscapi/utils/inserphpconf.pm
    /scripts/rebuildhttpdconf
    exit
fi

if [ "$1" == "--build-native-lsphp" ]; then
    if [ ! -e "/usr/local/cpanel/whostmgr/docroot/cgi/lsws" ]; then
	mkdir -p /usr/local/cpanel/whostmgr/docroot/cgi/lsws
    fi
    if [ ! -e "/usr/local/cpanel/whostmgr/docroot/cgi/lsws/cmd_buildmatchingphp.php" ]; then
	cp /usr/share/lve/modlscapi/buildlsphp/cmd_buildmatchingphp.php /usr/local/cpanel/whostmgr/docroot/cgi/lsws/
    fi
    if [ ! -e "/usr/local/cpanel/whostmgr/docroot/cgi/lsws/php_build.template" ]; then
	cp /usr/share/lve/modlscapi/buildlsphp/php_build.template /usr/local/cpanel/whostmgr/docroot/cgi/lsws/
    fi
    if [ ! -e "/usr/local/cpanel/whostmgr/docroot/cgi/lsws/php.ini" ]; then
	cp /usr/share/lve/modlscapi/buildlsphp/php.ini /usr/local/cpanel/whostmgr/docroot/cgi/lsws/
    fi
    if [ ! -e "/usr/local/cpanel/whostmgr/docroot/cgi/lsws/WhmMod_LiteSpeed_BuildPHP.php" ]; then
	cp /usr/share/lve/modlscapi/buildlsphp/WhmMod_LiteSpeed_BuildPHP.php /usr/local/cpanel/whostmgr/docroot/cgi/lsws/
    fi
    cd /usr/local/cpanel/whostmgr/docroot/cgi/lsws/
    /usr/local/bin/php -c /usr/local/cpanel/whostmgr/docroot/cgi/lsws/php.ini /usr/local/cpanel/whostmgr/docroot/cgi/lsws/cmd_buildmatchingphp.php
    cd -
    
    exit
fi


echo "$0 [OPTION]"
echo "utility for switch on or switch off mod_lsapi on cPanel (without mod_ruid2):"
echo "--setup - setup mod_lsapi configurations for apache"
echo "--uninstall - uninstall mod_lsapi from apache"
echo "--enable-domain - enable mod_lsapi for individual domain"
echo "--disable-domain - disable mod_lsapi for individual domain"
echo "--enable-global - sets up mod_lsapi as a default way to serve PHP, making it enabled for all domains. Once that mode is enabled, you cannot disable mod_lsapi for individual domain"
echo "--disable-global - disable mod_lsapi  as a default way to serve PHP, disabling mod_lsapi for all domains, including those selected previously using --enable-domain"
echo "--build-native-lsphp - build native lsphp for cPanel"
echo "--help - show this help"
