#! /bin/sh

set -e

. /usr/share/debconf/confmodule

prevver="$2"

add_system_user() {
    if ! getent passwd _<%= service_name %> >/dev/null; then
	if ! getent passwd <%= compat_service_name %> >/dev/null; then
	    # With underscore prefix, need to disable NAME_REGEX restriction
	    adduser --group --system --force-badname --home /var/lib/<%= package_dir %> _<%= service_name %>
	else
	    # When upgrading from v4, keep <%= compat_service_name %> user/group and 
	    # create _<%= service_name %> user/group with same uid/gid for compatibility easily.
	    if getent group <%= compat_service_name %> >/dev/null; then
		TD_GID=$(getent group <%= compat_service_name %> | cut -d':' -f3)
		groupadd --gid $TD_GID --non-unique _<%= service_name %>
	    fi
	    if getent passwd <%= compat_service_name %> >/dev/null; then
		TD_UID=$(id --user <%= compat_service_name %>)
		TD_GID=$(getent group <%= compat_service_name %> | cut -d':' -f3)
		useradd --system --uid $TD_UID --gid $TD_GID --non-unique --home-dir /var/lib/<%= package_dir %> --shell /usr/sbin/nologin _<%= service_name %>
	    fi
	fi
    fi
}

v4migration=n
v4migration_with_restart=n

add_directories() {
    mkdir -p /var/run/<%= package_dir %>
    mkdir -p /etc/<%= package_dir %>
    mkdir -p /etc/<%= package_dir %>/plugin
    mkdir -p /var/log/<%= package_dir %>
}

fixperms() {
    # If statoverride entry doesn't exit, set it.
    dpkg-statoverride --list /var/run/<%= package_dir %> >/dev/null || \
        dpkg-statoverride --update --add _<%= service_name %> _<%= service_name %> 0755 /var/run/<%= package_dir %>
    dpkg-statoverride --list /etc/<%= package_dir %> >/dev/null || \
        dpkg-statoverride --update --add _<%= service_name %> _<%= service_name %> 0755 /etc/<%= package_dir %>
    dpkg-statoverride --list /var/log/<%= package_dir %> >/dev/null || \
        dpkg-statoverride --update --add _<%= service_name %> _<%= service_name %> 0755 /var/log/<%= package_dir %>
    # Remove obsolete statoverride
    if dpkg-statoverride --list /var/run/<%= compat_package_dir %> >/dev/null; then
        dpkg-statoverride --force-all --remove /var/run/<%= compat_package_dir %>
    fi
    if dpkg-statoverride --list /etc/<%= compat_package_dir %> >/dev/null; then
        dpkg-statoverride --force-all --remove /etc/<%= compat_package_dir %>
    fi
    if dpkg-statoverride --list /var/log/<%= compat_package_dir %> >/dev/null; then
        dpkg-statoverride --force-all --remove /var/log/<%= compat_package_dir %>
    fi
}

migration_from_v4_main_process() {
    # prevver can't be used to judge td-agent => fluent-package because it's empty.
    if [ -d /etc/<%= compat_package_dir %> -a ! -h /etc/<%= compat_package_dir %> ]; then
        v4migration=y
        # /etc/<%= compat_package_dir %> migration from v4
        if [ -d /etc/<%= compat_package_dir %>/plugin -a -n "$(ls /etc/<%= compat_package_dir %>/plugin)" ]; then
            echo "Migrating from /etc/<%= compat_service_name %>/plugin/ to /etc/<%= package_dir %>/plugin/..."
            mv -f /etc/<%= compat_service_name %>/plugin/* /etc/<%= package_dir %>/plugin/
        fi
        create_link_for_config=n
        if [ -f /etc/<%= compat_package_dir %>/<%= compat_service_name %>.conf -a ! -e /etc/<%= compat_package_dir %>/<%= service_name %>.conf ]; then
            create_link_for_config=y
        fi
        if [ -f /etc/<%= compat_package_dir %>/<%= compat_service_name %>.conf ]; then
            echo "Migrating from /etc/<%= compat_package_dir %>/<%= compat_service_name %>.conf to /etc/<%= package_dir %>/<%= compat_service_name %>.conf"
            cp -f /etc/<%= compat_package_dir %>/<%= compat_service_name %>.conf /etc/<%= package_dir %>/<%= compat_service_name %>.conf
        fi
	if [ -n "$(ls /etc/<%= compat_package_dir %>/)" ]; then
	    for d in /etc/<%= compat_package_dir %>/*; do
		if [ ! "$d" = "/etc/<%= compat_package_dir %>/plugin" -a ! "$d" = "/etc/<%= compat_package_dir %>/<%= compat_service_name %>.conf" ]; then
                    # except managed under deb files must be migrated
		    echo "Migrating from /etc/<%= compat_package_dir %>/$d to /etc/<%= package_dir %>/..."
                    mv -f "$d" /etc/<%= package_dir %>/
		fi
	    done
        fi
	if [ $create_link_for_config = "y" ]; then
            rm -f /etc/<%= package_dir %>/<%= service_name %>.conf
            ln -sf /etc/<%= package_dir %>/<%= compat_service_name %>.conf /etc/<%= package_dir %>/<%= service_name %>.conf
        fi
	if [ -h /etc/systemd/system/td-agent.service ]; then
	    if [ -n "$(command -v systemctl)" ]; then
		if systemctl is-active <%= compat_service_name %> >/dev/null; then
		    # Want to restart with new user/group here,
		    # but to avoid holding file descriptor under /var/log/<%= compat_package_dir %>/,
		    # delay restarting <%= service_name %> service.
		    systemctl stop <%= compat_service_name %>
		    v4migration_with_restart=y
	       fi
	    fi
	fi
    fi
    if [ -d /var/log/<%= compat_package_dir %> -a ! -h /var/log/<%= compat_package_dir %> ]; then
        # /var/log/<%= compat_package_dir %> migration from v4
        if [ -d /var/log/<%= compat_package_dir %>/buffer ]; then
            if [ -n "$(ls /var/log/<%= compat_package_dir %>/buffer)" ]; then
                mv -f /var/log/<%= compat_package_dir %>/buffer/* /var/log/<%= package_dir %>/buffer/
            fi
        fi
        # except /var/log/<%= compat_package_dir %>/buffer must be migrated
	if [ -n "$(ls /var/log/<%= compat_package_dir %>/)" ]; then
	    for d in /var/log/<%= compat_package_dir %>/*; do
		if [ ! "$d" = "/var/log/<%= compat_package_dir %>/buffer" ]; then
                    # except /var/log/<%= compat_package_dir %>/buffer must be migrated
		    echo "Migrating from /var/log/<%= compat_package_dir %>/$d to /var/log/<%= package_dir %>/..."
                    mv -f "$d" /var/log/<%= package_dir %>/
		fi
            done
	fi
    fi
}

migration_from_v4_post_process() {
    if [ ! "$v4migration" = "y" ]; then
       return
    fi
    if [ -d /etc/<%= compat_package_dir %> -a ! -h /etc/<%= compat_package_dir %> ]; then
        rm -fr /etc/<%= compat_package_dir %>
        ln -sf /etc/<%= package_dir %> /etc/<%= compat_package_dir %>
        if [ ! -h /usr/sbin/<%= compat_service_name %> ]; then
            ln -sf /usr/sbin/<%= service_name %> /usr/sbin/<%= compat_service_name %>
        fi
        if [ ! -h /usr/sbin/<%= compat_service_name %>-gem ]; then
            ln -sf /usr/sbin/fluent-gem /usr/sbin/<%= compat_service_name %>-gem
        fi
    fi
    if [ -d /var/log/<%= compat_package_dir %> -a ! -h /var/log/<%= compat_package_dir %> ]; then
        rm -fr /var/log/<%= compat_package_dir %>
        ln -sf /var/log/<%= package_dir %> /var/log/<%= compat_package_dir %>
    fi
    if [ "$v4migration_with_restart" = "y" ]; then
        if [ -n "$(command -v systemctl)" ]; then
            systemctl daemon-reload
            systemctl restart <%= service_name %>
        fi
    fi
}

case "$1" in
    configure)
        add_system_user
        add_directories
        migration_from_v4_main_process
        fixperms
        migration_from_v4_post_process
	;;
    abort-upgrade|abort-deconfigure|abort-remove)
        :
        ;;
    *)
        echo "Called with unknown argument $1, bailing out."
        exit 1
        ;;
esac

<% if install_message %>
if [ "$1" = "configure" ]; then
  echo "<%= install_message %>"
fi
<% end %>

#DEBHELPER#
