From 6842226338027546f77fb46d4d738d101bab9e07 Mon Sep 17 00:00:00 2001 From: Håkon Hallingstad Date: Mon, 4 Dec 2017 01:53:13 +0100 Subject: Support making standalone container and node admin RPMs --- node-admin/src/main/resources/services.xml | 23 +++++++++ node-admin/src/main/sh/node-admin | 82 ++++++++++++++++++++++++++++++ node-admin/vespa-node-admin.spec | 49 ++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 node-admin/src/main/resources/services.xml create mode 100755 node-admin/src/main/sh/node-admin create mode 100644 node-admin/vespa-node-admin.spec (limited to 'node-admin') diff --git a/node-admin/src/main/resources/services.xml b/node-admin/src/main/resources/services.xml new file mode 100644 index 00000000000..57bdf8b7af2 --- /dev/null +++ b/node-admin/src/main/resources/services.xml @@ -0,0 +1,23 @@ + + + + + + + http://*/rest/* + + + + + + + false + + + + false + true + + + + diff --git a/node-admin/src/main/sh/node-admin b/node-admin/src/main/sh/node-admin new file mode 100755 index 00000000000..8a8963eeed0 --- /dev/null +++ b/node-admin/src/main/sh/node-admin @@ -0,0 +1,82 @@ +#!/bin/bash +# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +# BEGIN environment bootstrap section +# Do not edit between here and END as this section should stay identical in all scripts + +findpath () { + myname=${0} + mypath=${myname%/*} + myname=${myname##*/} + if [ "$mypath" ] && [ -d "$mypath" ]; then + return + fi + mypath=$(pwd) + if [ -f "${mypath}/${myname}" ]; then + return + fi + echo "FATAL: Could not figure out the path where $myname lives from $0" + exit 1 +} + +COMMON_ENV=libexec/vespa/common-env.sh + +source_common_env () { + if [ "$VESPA_HOME" ] && [ -d "$VESPA_HOME" ]; then + export VESPA_HOME + common_env=$VESPA_HOME/$COMMON_ENV + if [ -f "$common_env" ]; then + . $common_env + return + fi + fi + return 1 +} + +findroot () { + source_common_env && return + if [ "$VESPA_HOME" ]; then + echo "FATAL: bad VESPA_HOME value '$VESPA_HOME'" + exit 1 + fi + if [ "$ROOT" ] && [ -d "$ROOT" ]; then + VESPA_HOME="$ROOT" + source_common_env && return + fi + findpath + while [ "$mypath" ]; do + VESPA_HOME=${mypath} + source_common_env && return + mypath=${mypath%/*} + done + echo "FATAL: missing VESPA_HOME environment variable" + echo "Could not locate $COMMON_ENV anywhere" + exit 1 +} + +findroot + +# END environment bootstrap section + +Usage() { + cat < Date: Mon, 4 Dec 2017 02:04:41 +0100 Subject: Move services.xml to application directory and remove stray dependency --- node-admin/src/main/application/services.xml | 23 +++++++++++++++++++++++ node-admin/src/main/resources/services.xml | 23 ----------------------- pom.xml | 1 - 3 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 node-admin/src/main/application/services.xml delete mode 100644 node-admin/src/main/resources/services.xml (limited to 'node-admin') diff --git a/node-admin/src/main/application/services.xml b/node-admin/src/main/application/services.xml new file mode 100644 index 00000000000..030c42ac8c5 --- /dev/null +++ b/node-admin/src/main/application/services.xml @@ -0,0 +1,23 @@ + + + + + + + http://*/rest/* + + + + + + + false + + + + false + true + + + + diff --git a/node-admin/src/main/resources/services.xml b/node-admin/src/main/resources/services.xml deleted file mode 100644 index 57bdf8b7af2..00000000000 --- a/node-admin/src/main/resources/services.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - http://*/rest/* - - - - - - - false - - - - false - true - - - - diff --git a/pom.xml b/pom.xml index 34efcbcb7b7..eb1f954ce13 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,6 @@ simplemetrics socket_test standalone-container - standalone-container-deps statistics storage testutil -- cgit v1.2.3 From be7e101b46a75a92f28de4ed2e16c1bb0f405519 Mon Sep 17 00:00:00 2001 From: Håkon Hallingstad Date: Tue, 5 Dec 2017 15:54:14 +0100 Subject: Fix review comments - Rename *jdisc-container* to *standalone-container* (for files in this PR) - Implement stop standalone-container command - Avoid e.g. vespa user deletion on upgrade --- node-admin/src/main/sh/node-admin | 82 ------ node-admin/src/main/sh/node-admin.sh | 82 ++++++ node-admin/vespa-node-admin.spec | 2 +- standalone-container/src/main/sh/jdisc-container | 218 --------------- .../src/main/sh/standalone-container.sh | 309 +++++++++++++++++++++ standalone-container/vespa-jdisc-container.spec | 93 ------- .../vespa-standalone-container.spec | 95 +++++++ 7 files changed, 487 insertions(+), 394 deletions(-) delete mode 100755 node-admin/src/main/sh/node-admin create mode 100755 node-admin/src/main/sh/node-admin.sh delete mode 100755 standalone-container/src/main/sh/jdisc-container create mode 100755 standalone-container/src/main/sh/standalone-container.sh delete mode 100644 standalone-container/vespa-jdisc-container.spec create mode 100644 standalone-container/vespa-standalone-container.spec (limited to 'node-admin') diff --git a/node-admin/src/main/sh/node-admin b/node-admin/src/main/sh/node-admin deleted file mode 100755 index 8a8963eeed0..00000000000 --- a/node-admin/src/main/sh/node-admin +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -# BEGIN environment bootstrap section -# Do not edit between here and END as this section should stay identical in all scripts - -findpath () { - myname=${0} - mypath=${myname%/*} - myname=${myname##*/} - if [ "$mypath" ] && [ -d "$mypath" ]; then - return - fi - mypath=$(pwd) - if [ -f "${mypath}/${myname}" ]; then - return - fi - echo "FATAL: Could not figure out the path where $myname lives from $0" - exit 1 -} - -COMMON_ENV=libexec/vespa/common-env.sh - -source_common_env () { - if [ "$VESPA_HOME" ] && [ -d "$VESPA_HOME" ]; then - export VESPA_HOME - common_env=$VESPA_HOME/$COMMON_ENV - if [ -f "$common_env" ]; then - . $common_env - return - fi - fi - return 1 -} - -findroot () { - source_common_env && return - if [ "$VESPA_HOME" ]; then - echo "FATAL: bad VESPA_HOME value '$VESPA_HOME'" - exit 1 - fi - if [ "$ROOT" ] && [ -d "$ROOT" ]; then - VESPA_HOME="$ROOT" - source_common_env && return - fi - findpath - while [ "$mypath" ]; do - VESPA_HOME=${mypath} - source_common_env && return - mypath=${mypath%/*} - done - echo "FATAL: missing VESPA_HOME environment variable" - echo "Could not locate $COMMON_ENV anywhere" - exit 1 -} - -findroot - -# END environment bootstrap section - -Usage() { - cat < 0 )); then - Fail "Too many arguments" - fi - - # common setup - export VESPA_SERVICE_NAME="$service" - - # stuff for the process: - local appdir="$VESPA_HOME/conf/$service-app" - local pidfile="$VESPA_HOME/var/run/$service.pid" - local cfpfile="$VESPA_HOME/var/jdisc_core/$service.properties" - local bundlecachedir="$VESPA_HOME/var/vespa/bundlecache/$service" - - cd "$VESPA_HOME" || Fail "Cannot cd to $VESPA_HOME" - - fixlimits - checkjava - - local vespa_log="$VESPA_HOME/logs/vespa/vespa.log" - export VESPA_LOG_TARGET="file:$vespa_log" - mkdir -p "$(dirname "$vespa_log")" - - export VESPA_LOG_CONTROL_FILE="$VESPA_HOME/var/db/vespa/logcontrol/$service.logcontrol" - export VESPA_LOG_CONTROL_DIR="$(dirname "$VESPA_LOG_CONTROL_FILE")" - mkdir -p "$VESPA_LOG_CONTROL_DIR" - - # Does not need fast allocation - export MALLOC_ARENA_MAX=1 - - # will be picked up by standalone-container: - export standalone_jdisc_container__app_location="$appdir" - - # class path - CP="$VESPA_HOME/lib/jars/jdisc_core-jar-with-dependencies.jar" - - mkdir -p "$(dirname "$cfpfile")" - printenv > "$cfpfile" - FixDataDirectory "$bundlecachedir" - - java \ - -Xms128m -Xmx2048m \ - -XX:+PreserveFramePointer \ - -XX:+HeapDumpOnOutOfMemoryError \ - -XX:HeapDumpPath="$VESPA_HOME/var/crash" \ - -XX:OnOutOfMemoryError="kill -9 %p" \ - -Djava.library.path="$VESPA_HOME/lib64" \ - -Djava.awt.headless=true \ - -Dsun.rmi.dgc.client.gcInterval=3600000 \ - -Dsun.net.client.defaultConnectTimeout=5000 \ - -Dsun.net.client.defaultReadTimeout=60000 \ - -Djavax.net.ssl.keyStoreType=JKS \ - -Djdisc.config.file="$cfpfile" \ - -Djdisc.export.packages= \ - -Djdisc.cache.path="$bundlecachedir" \ - -Djdisc.debug.resources=false \ - -Djdisc.bundle.path="$VESPA_HOME/lib/jars" \ - -Djdisc.logger.enabled=true \ - -Djdisc.logger.level=ALL \ - -Djdisc.logger.tag="jdisc/$service" \ - -Dfile.encoding=UTF-8 \ - -cp "$CP" \ - com.yahoo.jdisc.core.StandaloneMain standalone-container-jar-with-dependencies.jar -} - -StopCommand() { - local service="$1" - shift - - if (( $# > 0 )); then - Fail "Too many arguments" - fi - - Fail "Not implemented" -} - -Main() { - if (( $# == 0 )); then - Usage - fi - - local command="$1" - shift - - local service="standalone/container" - local user="$VESPA_USER" - - while (( $# > 0 )); do - case "$1" in - --help|-h) Usage ;; - --service|-s) - service="$2" - shift 2 - ;; - --user|-u) - user="$2" - shift 2 - ;; - *) break ;; - esac - done - - # Service name will be included in paths and possibly environment variable - # names, so be restrictive. - local service_regex='^[a-zA-Z0-9_-]+$' - if test -z "$service"; then - Fail "SERVICE not specified" - elif ! [[ "$service" =~ $service_regex ]]; then - Fail "Service must math the regex '$service_regex'" - fi - - if ! getent passwd "$user" &> /dev/null; then - Fail "Bad user ($user): not found in passwd" - elif test "$(id -un)" != "$user"; then - Fail "${0##*/} must be started by $user" - fi - export VESPA_USER="$user" - - case "$command" in - help) Usage ;; - start) StartCommand "$service" "$@" ;; - stop) StopCommand "$service" "$@" ;; - *) Fail "Unknown command '$command'" ;; - esac -} - -Main "$@" diff --git a/standalone-container/src/main/sh/standalone-container.sh b/standalone-container/src/main/sh/standalone-container.sh new file mode 100755 index 00000000000..dd0693f6f85 --- /dev/null +++ b/standalone-container/src/main/sh/standalone-container.sh @@ -0,0 +1,309 @@ +#!/bin/bash +# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +# BEGIN environment bootstrap section +# Do not edit between here and END as this section should stay identical in all scripts + +findpath () { + myname=${0} + mypath=${myname%/*} + myname=${myname##*/} + if [ "$mypath" ] && [ -d "$mypath" ]; then + return + fi + mypath=$(pwd) + if [ -f "${mypath}/${myname}" ]; then + return + fi + echo "FATAL: Could not figure out the path where $myname lives from $0" + exit 1 +} + +COMMON_ENV=libexec/vespa/common-env.sh + +source_common_env () { + if [ "$VESPA_HOME" ] && [ -d "$VESPA_HOME" ]; then + export VESPA_HOME + common_env=$VESPA_HOME/$COMMON_ENV + if [ -f "$common_env" ]; then + . $common_env + return + fi + fi + return 1 +} + +findroot () { + source_common_env && return + if [ "$VESPA_HOME" ]; then + echo "FATAL: bad VESPA_HOME value '$VESPA_HOME'" + exit 1 + fi + if [ "$ROOT" ] && [ -d "$ROOT" ]; then + VESPA_HOME="$ROOT" + source_common_env && return + fi + findpath + while [ "$mypath" ]; do + VESPA_HOME=${mypath} + source_common_env && return + mypath=${mypath%/*} + done + echo "FATAL: missing VESPA_HOME environment variable" + echo "Could not locate $COMMON_ENV anywhere" + exit 1 +} + +findroot + +# END environment bootstrap section + +Usage() { + cat < 0 )); then + Fail "Too many arguments" + fi + + local service_regex='^[0-9a-zA-Z_-]+$' + if ! [[ "$service" =~ $service_regex ]]; then + Fail "Service must match regex '$service_regex'" + fi + + # common setup + export VESPA_SERVICE_NAME="$service" + + # stuff for the process: + local appdir="$VESPA_HOME/conf/$service-app" + local pidfile="$VESPA_HOME/var/run/$service.pid" + local cfpfile="$VESPA_HOME/var/jdisc_core/$service.properties" + local bundlecachedir="$VESPA_HOME/var/vespa/bundlecache/$service" + + cd "$VESPA_HOME" || Fail "Cannot cd to $VESPA_HOME" + + fixlimits + checkjava + + local vespa_log="$VESPA_HOME/logs/vespa/vespa.log" + export VESPA_LOG_TARGET="file:$vespa_log" + FixDataDirectory "$(dirname "$vespa_log")" + + export VESPA_LOG_CONTROL_FILE="$VESPA_HOME/var/db/vespa/logcontrol/$service.logcontrol" + export VESPA_LOG_CONTROL_DIR="$(dirname "$VESPA_LOG_CONTROL_FILE")" + FixDataDirectory "$VESPA_LOG_CONTROL_DIR" + + # Does not need fast allocation + export MALLOC_ARENA_MAX=1 + + # will be picked up by standalone-container: + export standalone_jdisc_container__app_location="$appdir" + + # class path + CP="$VESPA_HOME/lib/jars/jdisc_core-jar-with-dependencies.jar" + + FixDataDirectory "$(dirname "$cfpfile")" + printenv > "$cfpfile" + FixDataDirectory "$bundlecachedir" + + java \ + -Xms128m -Xmx2048m \ + -XX:+PreserveFramePointer \ + -XX:+HeapDumpOnOutOfMemoryError \ + -XX:HeapDumpPath="$VESPA_HOME/var/crash" \ + -XX:OnOutOfMemoryError="kill -9 %p" \ + -Djava.library.path="$VESPA_HOME/lib64" \ + -Djava.awt.headless=true \ + -Dsun.rmi.dgc.client.gcInterval=3600000 \ + -Dsun.net.client.defaultConnectTimeout=5000 \ + -Dsun.net.client.defaultReadTimeout=60000 \ + -Djavax.net.ssl.keyStoreType=JKS \ + -Djdisc.config.file="$cfpfile" \ + -Djdisc.export.packages= \ + -Djdisc.cache.path="$bundlecachedir" \ + -Djdisc.debug.resources=false \ + -Djdisc.bundle.path="$VESPA_HOME/lib/jars" \ + -Djdisc.logger.enabled=true \ + -Djdisc.logger.level=ALL \ + -Djdisc.logger.tag="jdisc/$service" \ + -Dfile.encoding=UTF-8 \ + -cp "$CP" \ + com.yahoo.jdisc.core.StandaloneMain standalone-container-jar-with-dependencies.jar & + + local pid="$!" + echo "$pid" > "$pidfile" +} + +Kill() { + local force="$1" + local expected_user="$2" + local expected_comm="$3" # Executable name only + local pid="$4" + + local -i now + if ! now=$(date +%s); then + Fail "Failed to get the current date in seconds since epoch" + fi + local -i timeout=$(( now + 300 )) + + local has_killed=false + + while true; do + local ps_output="" + if ! ps_output=$(ps -p "$pid" -o user= -o comm=); then + # success + return + fi + + local user comm + read -r user comm <<< "$ps_output" + + if test "$user" != "$expected_user"; then + echo "Warning: Pid collision ($pid): Expected user $expected_user but found $user." + echo "Will assume original process has died." + return + fi + + if test "$comm" != "$expected_comm"; then + echo "Warning: Pid collision ($pid): Expected program $expected_comm but found $comm." + echo "Will assume original process has died." + return + fi + + if ! "$has_killed"; then + if $force; then + if ! kill -KILL "$pid"; then + Fail "Failed to kill $pid" + fi + else + if ! kill "$pid"; then + Fail "Failed to kill $pid" + fi + fi + + has_killed=true + fi + + sleep 1 + + now=$(date +%s) + if (( now >= timeout )); then + Fail "Process $pid still exists after $timeout seconds, giving up" + fi + done +} + +StopCommand() { + local user="$1" + shift + + local force=false + while (( $# > 0 )); do + case "$1" in + -f|--force) + force=true + shift + ;; + *) break ;; + esac + done + + if (( $# != 1 )); then + Fail "Stop command takes exactly one argument" + fi + + local service="$1" + + local pidfile="$VESPA_HOME/var/run/$service.pid" + if ! test -r "$pidfile"; then + echo "$service is not running" + return + fi + + local pid=$(< "$pidfile") + if ! [[ "$pid" =~ ^[0-9]+$ ]]; then + Fail "Pid file '$pidfile' does not contain a valid pid: $pid" + fi + + Kill "$force" "$user" java "$pid" + rm -f "$pidfile" +} + +Main() { + if (( $# == 0 )); then + Usage + fi + + local command="$1" + shift + + local service="standalone/container" + local user="$VESPA_USER" + + while (( $# > 0 )); do + case "$1" in + --help|-h) Usage ;; + --service|-s) + service="$2" + shift 2 + ;; + --user|-u) + user="$2" + shift 2 + ;; + *) break ;; + esac + done + + # Service name will be included in paths and possibly environment variable + # names, so be restrictive. + local service_regex='^[a-zA-Z0-9_-]+$' + if test -z "$service"; then + Fail "SERVICE not specified" + elif ! [[ "$service" =~ $service_regex ]]; then + Fail "Service must math the regex '$service_regex'" + fi + + if ! getent passwd "$user" &> /dev/null; then + Fail "Bad user ($user): not found in passwd" + elif test "$(id -un)" != "$user"; then + Fail "${0##*/} must be started by $user" + fi + + case "$command" in + help) Usage ;; + start) StartCommand "$service" "$@" ;; + stop) StopCommand "$user" "$service" "$@" ;; + *) Fail "Unknown command '$command'" ;; + esac +} + +Main "$@" diff --git a/standalone-container/vespa-jdisc-container.spec b/standalone-container/vespa-jdisc-container.spec deleted file mode 100644 index 87def8881f6..00000000000 --- a/standalone-container/vespa-jdisc-container.spec +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. - -# Force special prefix for Vespa -%define _prefix /opt/vespa - -# Hack to speed up jar packing for now. This does not affect the rpm size. -%define __jar_repack %{nil} - -Name: vespa-jdisc-container -Version: %version -BuildArch: noarch -Release: 1%{?dist} -Summary: Vespa standalone JDisc container -Group: Applications/Databases -License: Commercial -URL: http://vespa.ai - -Requires: bash -Requires: java-1.8.0-openjdk-headless - -Conflicts: vespa - -%description -The Vespa standalone JDisc container is a runtime environment for Java -applications. - -%install -declare jars_dir=%buildroot%_prefix/lib/jars -mkdir -p "$jars_dir" - -declare -a dirs=( - jdisc_jetty/target/dependency - vespa_jersey2/target/dependency -) -for dir in "${dirs[@]}"; do - cp "$dir"/* "$jars_dir" -done - -declare -a modules=( - component - config-bundle - config-model-api - config-model - config-provisioning - configdefinitions - container-disc - container-jersey2 - container-search-and-docproc - defaults - docprocs - jdisc_core - jdisc_http_service - simplemetrics - standalone-container - vespaclient-container-plugin - zkfacade -) -for module in "${modules[@]}"; do - cp "$module"/target/"$module"-jar-with-dependencies.jar "$jars_dir" -done - -# vespajlib must be installed _without_ dependencies. -cp vespajlib/target/vespajlib.jar "$jars_dir" - -declare -a libexec_files=( - vespabase/src/common-env.sh - standalone-container/src/main/sh/jdisc-container -) -declare libexec_dir=%buildroot%_prefix/libexec/vespa -mkdir -p "$libexec_dir" -for file in "${libexec_files[@]}"; do - cp "$file" "$libexec_dir" -done - -%clean -rm -rf %buildroot - -%pre -getent group vespa >/dev/null || groupadd -r vespa -getent passwd vespa >/dev/null || \ - useradd -r -g vespa -d %_prefix -s /sbin/nologin \ - -c "Create owner of all Vespa data files" vespa -echo "pathmunge %_prefix/bin" > /etc/profile.d/vespa.sh -echo "export VESPA_HOME=%_prefix" >> /etc/profile.d/vespa.sh -chmod +x /etc/profile.d/vespa.sh - -%postun -rm -f /etc/profile.d/vespa.sh -userdel vespa - -%files -%defattr(-,vespa,vespa,-) -%_prefix/* diff --git a/standalone-container/vespa-standalone-container.spec b/standalone-container/vespa-standalone-container.spec new file mode 100644 index 00000000000..5ab7e9409a5 --- /dev/null +++ b/standalone-container/vespa-standalone-container.spec @@ -0,0 +1,95 @@ +# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +# Force special prefix for Vespa +%define _prefix /opt/vespa + +# Hack to speed up jar packing for now. This does not affect the rpm size. +%define __jar_repack %{nil} + +Name: vespa-standalone-container +Version: %version +BuildArch: noarch +Release: 1%{?dist} +Summary: Vespa standalone JDisc container +Group: Applications/Databases +License: Commercial +URL: http://vespa.ai + +Requires: bash +Requires: java-1.8.0-openjdk-headless + +Conflicts: vespa + +%description +The Vespa standalone JDisc container is a runtime environment for Java +applications. + +%install +declare jars_dir=%buildroot%_prefix/lib/jars +mkdir -p "$jars_dir" + +declare -a dirs=( + jdisc_jetty/target/dependency + vespa_jersey2/target/dependency +) +for dir in "${dirs[@]}"; do + cp "$dir"/* "$jars_dir" +done + +declare -a modules=( + component + config-bundle + config-model-api + config-model + config-provisioning + configdefinitions + container-disc + container-jersey2 + container-search-and-docproc + defaults + docprocs + jdisc_core + jdisc_http_service + simplemetrics + standalone-container + vespaclient-container-plugin + zkfacade +) +for module in "${modules[@]}"; do + cp "$module"/target/"$module"-jar-with-dependencies.jar "$jars_dir" +done + +# vespajlib must be installed _without_ dependencies. +cp vespajlib/target/vespajlib.jar "$jars_dir" + +declare -a libexec_files=( + vespabase/src/common-env.sh + standalone-container/src/main/sh/standalone-container.sh +) +declare libexec_dir=%buildroot%_prefix/libexec/vespa +mkdir -p "$libexec_dir" +for file in "${libexec_files[@]}"; do + cp "$file" "$libexec_dir" +done + +%clean +rm -rf %buildroot + +%pre +getent group vespa >/dev/null || groupadd -r vespa +getent passwd vespa >/dev/null || \ + useradd -r -g vespa -d %_prefix -s /sbin/nologin \ + -c "Create owner of all Vespa data files" vespa +echo "pathmunge %_prefix/bin" > /etc/profile.d/vespa.sh +echo "export VESPA_HOME=%_prefix" >> /etc/profile.d/vespa.sh +chmod +x /etc/profile.d/vespa.sh + +%postun +if [ $1 -eq 0 ]; then # this is an uninstallation + rm -f /etc/profile.d/vespa.sh + userdel vespa +fi + +%files +%defattr(-,vespa,vespa,-) +%_prefix/* -- cgit v1.2.3