# Disable brp-java-repack-jars, so jars will not be decompressed and repackaged
%define __jar_repack 0

# Generate digests, 8 means algorithm of sha256
# This is different from rpm sig algorithm
# Requires rpm version 4.12 + to generate but b/c run on older versions
%define _source_filedigest_algorithm 8
%define _binary_filedigest_algorithm 8

# User Define Variables
%define product_name poissonsearch
%define product_dir %{_datadir}/%{product_name}
%define config_dir %{_sysconfdir}/%{product_name}
%define data_dir %{_sharedstatedir}/%{product_name}
%define log_dir %{_localstatedir}/log/%{product_name}
%define pid_dir %{_localstatedir}/run/%{product_name}
%define build_arch x86_64

Name: poissonsearch-oss
Version: 1.0.1
%define package_version 1.0.1
Release: 1
License: ASL 2.0
Summary: Distributed RESTful search engine built for the cloud
URL: https://gitee.com/openeuler/poissonsearch-oss
Source0: https://gitee.com/openEuler/poissonsearch-oss/archive/refs/tags/%{package_version}.tar.gz
Group: Application/Internet
ExclusiveArch: %{build_arch}
BuildArch: %{build_arch}

BuildRequires:  java-17-openjdk-devel,java-11-openjdk-devel,tar,gzip,rpmdevtools,dos2unix
Requires:       java-11-openjdk-headless
Provides: elasticsearch-oss = 7.10.2-1

%description
poissonsearch-oss is a distributed RESTful search engine built for the cloud, forked from elasticsearch-oss 7.10.2.

%prep
tar -xzf %{_sourcedir}/%{package_version}.tar.gz -C %{_builddir}

%build

# need to add java home and runtime java home
export JAVA_HOME=/etc/alternatives/java_sdk_17
export RUNTIME_JAVA_HOME=$JAVA_HOME

cd %{name}-%{package_version}
dos2unix gradlew
./gradlew buildOssNoJdkRpm --no-daemon --warning-mode none -Dorg.gradle.java.home=/etc/alternatives/java_sdk_17
cd ..
mv %{name}-%{package_version}/distribution/packages/oss-no-jdk-rpm/build/distributions/%{name}-7.10.2-no-jdk-x86_64.rpm ./%{name}-%{version}-%{_architecture}.rpm
rpm2cpio %{name}-%{version}-%{_architecture}.rpm | cpio -divm

# dos2unix for all scripts
find etc -type f -print0 | xargs -0 dos2unix
find usr/lib -type f -print0 | xargs -0 dos2unix
find usr/share/poissonsearch/bin -type f -print0 | xargs -0 dos2unix

%install
# Create necessary directories
mkdir -p %{buildroot}%{pid_dir}
cp -a usr etc var %{buildroot}

%check
cd %{name}-%{package_version}

export JAVA_HOME=/etc/alternatives/java_sdk_11
export RUNTIME_JAVA_HOME=$JAVA_HOME

# need to build with java 17 in openEuler, jdk 11 will be recognized as jre in gradle 7.5.1 for some reason
# for 20.03, gralde daemon got killed for no reason, disable test until fix this issue
#./gradlew test --warning-mode none --no-daemon -Dorg.gradle.java.home=/etc/alternatives/java_sdk_17 > test.report

%pre -p /bin/bash
#!/bin/bash
 RPM_ARCH=x86_64 
 RPM_OS=linux 
 RPM_PACKAGE_NAME=poissonsearch-oss 
 RPM_PACKAGE_VERSION=7.10.2 
 RPM_PACKAGE_RELEASE=1 

#
# This script is executed in the pre-installation phase
#
#   On Debian,
#       $1=install : indicates an new install
#       $1=upgrade : indicates an upgrade
#
#   On RedHat,
#       $1=1       : indicates an new install
#       $1=2       : indicates an upgrade

err_exit() {
    echo "$@" >&2
    exit 1
}

# source the default env file
if [ -f "/etc/sysconfig/poissonsearch" ]; then
    . "/etc/sysconfig/poissonsearch"
fi

export ES_PATH_CONF=${ES_PATH_CONF:-/etc/poissonsearch}

case "$1" in

    # Debian ####################################################
    install|upgrade)

        # Create poissonsearch group if not existing
        if ! getent group poissonsearch > /dev/null 2>&1 ; then
            echo -n "Creating poissonsearch group..."
            addgroup --quiet --system poissonsearch
            echo " OK"
        fi

        # Create poissonsearch user if not existing
        if ! id poissonsearch > /dev/null 2>&1 ; then
            echo -n "Creating poissonsearch user..."
            adduser --quiet \
                    --system \
                    --no-create-home \
                    --home /nonexistent \
                    --ingroup poissonsearch \
                    --disabled-password \
                    --shell /bin/false \
                    poissonsearch
            echo " OK"
        fi
    ;;
    abort-deconfigure|abort-upgrade|abort-remove)
    ;;

    # RedHat ####################################################
    1|2)

        # Create poissonsearch group if not existing
        if ! getent group poissonsearch > /dev/null 2>&1 ; then
            echo -n "Creating poissonsearch group..."
            groupadd -r poissonsearch
            echo " OK"
        fi

        # Create poissonsearch user if not existing
        if ! id poissonsearch > /dev/null 2>&1 ; then
            echo -n "Creating poissonsearch user..."
            useradd --system \
                    --no-create-home \
                    --home-dir /nonexistent \
                    --gid poissonsearch \
                    --shell /sbin/nologin \
                    --comment "poissonsearch user" \
                    poissonsearch
            echo " OK"
        fi
    ;;

    *)
        err_exit "pre install script called with unknown argument \`$1'"
    ;;
esac



%post -p /bin/sh
 RPM_ARCH=x86_64 
 RPM_OS=linux 
 RPM_PACKAGE_NAME=poissonsearch-oss 
 RPM_PACKAGE_VERSION=7.10.2 
 RPM_PACKAGE_RELEASE=1 

#
# This script is executed in the post-installation phase
#
#   On Debian,
#       $1=configure : is set to 'configure' and if $2 is set, it is an upgrade
#
#   On RedHat,
#       $1=0         : indicates a removal
#       $1=1         : indicates an upgrade

# source the default env file
if [ -f "/etc/sysconfig/poissonsearch" ]; then
    . "/etc/sysconfig/poissonsearch"
fi

export ES_PATH_CONF=${ES_PATH_CONF:-/etc/poissonsearch}

IS_UPGRADE=false

case "$1" in

    # Debian ####################################################
    configure)

        # If $1=configure and $2 is set, this is an upgrade
        if [ -n $2 ]; then
            IS_UPGRADE=true
        fi
        PACKAGE=deb
    ;;
    abort-upgrade|abort-remove|abort-deconfigure)
        PACKAGE=deb
    ;;

    # RedHat ####################################################
    1)
        # If $1=1 this is an install
        IS_UPGRADE=false
        PACKAGE=rpm
    ;;
    2)
        # If $1=1 this is an upgrade
        IS_UPGRADE=true
        PACKAGE=rpm
    ;;

    *)
        echo "post install script called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# to pick up /usr/lib/sysctl.d/poissonsearch.conf
if command -v systemctl > /dev/null; then
    systemctl restart systemd-sysctl.service || true
fi

if [ "x$IS_UPGRADE" != "xtrue" ]; then
    if command -v systemctl >/dev/null; then
        echo "### NOT starting on installation, please execute the following statements to configure poissonsearch service to start automatically using systemd"
        echo " sudo systemctl daemon-reload"
        echo " sudo systemctl enable poissonsearch.service"
        echo "### You can start poissonsearch service by executing"
        echo " sudo systemctl start poissonsearch.service"

    elif command -v chkconfig >/dev/null; then
        echo "### NOT starting on installation, please execute the following statements to configure poissonsearch service to start automatically using chkconfig"
        echo " sudo chkconfig --add poissonsearch"
        echo "### You can start poissonsearch service by executing"
        echo " sudo service poissonsearch start"

    elif command -v update-rc.d >/dev/null; then
        echo "### NOT starting on installation, please execute the following statements to configure poissonsearch service to start automatically using chkconfig"
        echo " sudo update-rc.d poissonsearch defaults 95 10"
        echo "### You can start poissonsearch service by executing"
        echo " sudo /etc/init.d/poissonsearch start"
    fi
elif [ "$RESTART_ON_UPGRADE" = "true" ]; then

    echo -n "Restarting poissonsearch service..."
    if command -v systemctl >/dev/null; then
        systemctl daemon-reload
        systemctl restart poissonsearch.service || true

    elif [ -x /etc/init.d/poissonsearch ]; then
        if command -v invoke-rc.d >/dev/null; then
            invoke-rc.d poissonsearch stop || true
            invoke-rc.d poissonsearch start || true
        else
            /etc/init.d/poissonsearch restart || true
        fi

    # older suse linux distributions do not ship with systemd
    # but do not have an /etc/init.d/ directory
    # this tries to start the poissonsearch service on these
    # as well without failing this script
    elif [ -x /etc/rc.d/init.d/poissonsearch ] ; then
        /etc/rc.d/init.d/poissonsearch restart || true
    fi
    echo " OK"
fi

# the equivalent code for rpm is in posttrans
if [ "$PACKAGE" = "deb" ]; then
    if [ ! -f "${ES_PATH_CONF}"/elasticsearch.keystore ]; then
        /usr/share/poissonsearch/bin/elasticsearch-keystore create
        chown root:poissonsearch "${ES_PATH_CONF}"/elasticsearch.keystore
        chmod 660 "${ES_PATH_CONF}"/elasticsearch.keystore
        md5sum "${ES_PATH_CONF}"/elasticsearch.keystore > "${ES_PATH_CONF}"/.elasticsearch.keystore.initial_md5sum
    else
        if /usr/share/poissonsearch/bin/elasticsearch-keystore has-passwd --silent ; then
          echo "### Warning: unable to upgrade encrypted keystore" 1>&2
          echo " Please run elasticsearch-keystore upgrade and enter password" 1>&2
        else
          /usr/share/poissonsearch/bin/elasticsearch-keystore upgrade
        fi
    fi
fi


%posttrans -p /bin/sh
 RPM_ARCH=x86_64 
 RPM_OS=linux 
 RPM_PACKAGE_NAME=poissonsearch-oss 
 RPM_PACKAGE_VERSION=7.10.2 
 RPM_PACKAGE_RELEASE=1 

# source the default env file
if [ -f "/etc/sysconfig/poissonsearch" ]; then
    . "/etc/sysconfig/poissonsearch"
fi

export ES_PATH_CONF=${ES_PATH_CONF:-/etc/poissonsearch}

if [ ! -f "${ES_PATH_CONF}"/elasticsearch.keystore ]; then
    /usr/share/poissonsearch/bin/elasticsearch-keystore create
    chown root:poissonsearch "${ES_PATH_CONF}"/elasticsearch.keystore
    chmod 660 "${ES_PATH_CONF}"/elasticsearch.keystore
    md5sum "${ES_PATH_CONF}"/elasticsearch.keystore > "${ES_PATH_CONF}"/.elasticsearch.keystore.initial_md5sum
else
    if /usr/share/poissonsearch/bin/elasticsearch-keystore has-passwd --silent ; then
      echo "### Warning: unable to upgrade encrypted keystore" 1>&2
      echo " Please run elasticsearch-keystore upgrade and enter password" 1>&2
    else
      /usr/share/poissonsearch/bin/elasticsearch-keystore upgrade
    fi
fi


%preun -p /bin/sh
 RPM_ARCH=x86_64 
 RPM_OS=linux 
 RPM_PACKAGE_NAME=poissonsearch-oss 
 RPM_PACKAGE_VERSION=7.10.2 
 RPM_PACKAGE_RELEASE=1 

#
# This script is executed in the pre-remove phase
#
#   On Debian,
#       $1=remove    : indicates a removal
#       $1=upgrade   : indicates an upgrade
#
#   On RedHat,
#       $1=0         : indicates a removal
#       $1=1         : indicates an upgrade

# source the default env file
if [ -f "/etc/sysconfig/poissonsearch" ]; then
    . "/etc/sysconfig/poissonsearch"
fi

export ES_PATH_CONF=${ES_PATH_CONF:-/etc/poissonsearch}

STOP_REQUIRED=false
REMOVE_SERVICE=false

case "$1" in

    # Debian ####################################################
    remove)
        STOP_REQUIRED=true
        REMOVE_SERVICE=true
    ;;
    upgrade)
        if [ "$RESTART_ON_UPGRADE" = "true" ]; then
            STOP_REQUIRED=true
        fi
    ;;
    deconfigure|failed-upgrade)
    ;;

    # RedHat ####################################################
    0)
        STOP_REQUIRED=true
        REMOVE_SERVICE=true
    ;;
    1)
        # Dont do anything on upgrade, because the preun script in redhat gets executed after the postinst (madness!)
    ;;

    *)
        echo "pre remove script called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

# Stops the service
if [ "$STOP_REQUIRED" = "true" ]; then
    echo -n "Stopping poissonsearch service..."
    if command -v systemctl >/dev/null; then
        systemctl --no-reload stop poissonsearch.service

    elif [ -x /etc/init.d/poissonsearch ]; then
        if command -v invoke-rc.d >/dev/null; then
            invoke-rc.d poissonsearch stop
        else
            /etc/init.d/poissonsearch stop
        fi

    # older suse linux distributions do not ship with systemd
    # but do not have an /etc/init.d/ directory
    # this tries to start the poissonsearch service on these
    # as well without failing this script
    elif [ -x /etc/rc.d/init.d/poissonsearch ] ; then
        /etc/rc.d/init.d/poissonsearch stop
    fi
    echo " OK"
fi

if [ -f "${ES_PATH_CONF}"/elasticsearch.keystore ]; then
  if md5sum --status -c "${ES_PATH_CONF}"/.elasticsearch.keystore.initial_md5sum; then
    rm "${ES_PATH_CONF}"/elasticsearch.keystore "${ES_PATH_CONF}"/.elasticsearch.keystore.initial_md5sum
  fi
fi

if [ "$REMOVE_SERVICE" = "true" ]; then
    if command -v systemctl >/dev/null; then
        systemctl disable poissonsearch.service > /dev/null 2>&1 || true
    fi

    if command -v chkconfig >/dev/null; then
        chkconfig --del poissonsearch 2> /dev/null || true
    fi

    if command -v update-rc.d >/dev/null; then
        update-rc.d poissonsearch remove >/dev/null || true
    fi
fi

# Built for packages-7.10.2 (rpm)


%postun -p /bin/sh
 RPM_ARCH=x86_64 
 RPM_OS=linux 
 RPM_PACKAGE_NAME=poissonsearch-oss 
 RPM_PACKAGE_VERSION=7.10.2 
 RPM_PACKAGE_RELEASE=1 

#
# This script is executed in the post-removal phase
#
#   On Debian,
#       $1=remove    : indicates a removal
#       $1=purge     : indicates an upgrade
#
#   On RedHat,
#       $1=0         : indicates a removal
#       $1=1         : indicates an upgrade

# source the default env file
if [ -f "/etc/sysconfig/poissonsearch" ]; then
    . "/etc/sysconfig/poissonsearch"
fi

export ES_PATH_CONF=${ES_PATH_CONF:-/etc/poissonsearch}

REMOVE_DIRS=false
REMOVE_JVM_OPTIONS_DIRECTORY=false
REMOVE_USER_AND_GROUP=false

case "$1" in

    # Debian ####################################################
    remove)
        REMOVE_DIRS=true
    ;;

    purge)
        REMOVE_DIRS=true
        REMOVE_JVM_OPTIONS_DIRECTORY=true
        REMOVE_USER_AND_GROUP=true
    ;;
    failed-upgrade|abort-install|abort-upgrade|disappear|upgrade|disappear)
    ;;

    # RedHat ####################################################
    0)
        REMOVE_DIRS=true
        REMOVE_USER_AND_GROUP=true
    ;;
    1)
        # If $1=1 this is an upgrade
        IS_UPGRADE=true
    ;;

    *)
        echo "post remove script called with unknown argument \`$1'" >&2
        exit 1
    ;;
esac

if [ "$REMOVE_DIRS" = "true" ]; then

    if [ -d /var/log/poissonsearch ]; then
        echo -n "Deleting log directory..."
        rm -rf /var/log/poissonsearch
        echo " OK"
    fi

    if [ -d /usr/share/poissonsearch/plugins ]; then
        echo -n "Deleting plugins directory..."
        rm -rf /usr/share/poissonsearch/plugins
        echo " OK"
    fi

    # plugins may have contained bin files
    if [ -d /usr/share/poissonsearch/bin ]; then
        echo -n "Deleting plugin bin directories..."
        rm -rf /usr/share/poissonsearch/bin
        echo " OK"
    fi

    if [ -d /var/run/poissonsearch ]; then
        echo -n "Deleting PID directory..."
        rm -rf /var/run/poissonsearch
        echo " OK"
    fi

    # Delete the data directory if and only if empty
    if [ -d /var/lib/poissonsearch ]; then
        rmdir --ignore-fail-on-non-empty /var/lib/poissonsearch
    fi

    # delete the jvm.options.d directory if and only if empty
    if [ -d "${ES_PATH_CONF}/jvm.options.d" ]; then
        rmdir --ignore-fail-on-non-empty "${ES_PATH_CONF}/jvm.options.d"
    fi

    # delete the jvm.options.d directory if we are purging
    if [ "$REMOVE_JVM_OPTIONS_DIRECTORY" = "true" ]; then
      if [ -d "${ES_PATH_CONF}/jvm.options.d" ]; then
        echo -n "Deleting jvm.options.d directory..."
        rm -rf "${ES_PATH_CONF}/jvm.options.d"
        echo " OK"
      fi
    fi

    # delete the conf directory if and only if empty
    if [ -d "${ES_PATH_CONF}" ]; then
        rmdir --ignore-fail-on-non-empty "${ES_PATH_CONF}"
    fi

fi

if [ "$REMOVE_USER_AND_GROUP" = "true" ]; then
    if id poissonsearch > /dev/null 2>&1 ; then
        userdel poissonsearch
    fi

    if getent group poissonsearch > /dev/null 2>&1 ; then
        groupdel poissonsearch
    fi
fi


%files
# Permissions
%defattr(-, %{product_name}, %{product_name})

# Root dirs/docs/licenses
# /usr/share/poissonsearch
%dir %{product_dir} 
%doc %{product_dir}/NOTICE.txt
%doc %{product_dir}/README.asciidoc
%license %{product_dir}/LICENSE.txt

# Config dirs/files
# /etc/poissonsearch
%dir %{config_dir}
%{config_dir}/jvm.options.d
%config(noreplace) %{config_dir}/elasticsearch.yml
%config(noreplace) %{config_dir}/jvm.options
%config(noreplace) %{config_dir}/log4j2.properties

# Service files
# /etc/init.d/poissonsearch
%attr(0644, root, root) %{_sysconfdir}/init.d/%{product_name}
%attr(0644, root, root) %config(noreplace) %{_sysconfdir}/sysconfig/%{product_name}
# /usr/lib/
%attr(0644, root, root) %{_prefix}/lib/systemd/system/%{product_name}.service
%attr(0644, root, root) %config(noreplace) %{_prefix}/lib/sysctl.d/%{product_name}.conf
%attr(0644, root, root) %config(noreplace) %{_prefix}/lib/tmpfiles.d/%{product_name}.conf

# Main dirs
%{product_dir}/bin
%{product_dir}/lib
%{product_dir}/modules
%{product_dir}/plugins
%{log_dir}
%{pid_dir}
%dir %{data_dir}

%changelog
* Fri Mar 29 2024 Zhang An <zhangan9@huawei.com> - 1.0.1-1
- 1.0.1 package release
* Fri Mar 22 2024 Zhang An <zhangan9@huawei.com> - 1.0.0-1
- 1.0.0 package release (HEAD -> master)
* Tue Mar 19 2024 Zhang An <zhangan9@huawei.com> - 1.0.0-1
- Initial package (HEAD -> master)

