#!/sbin/openrc-run description="Manages the services needed to run Artifactory on a dedicated Tomcat" command="/opt/artifactory/tomcat/bin/catalina.sh" pidfile="/opt/artifactory/run/artifactory.pid" procname="artifactory" user=${ARTIFACTORY_USER:-artifactory} group=${group:-artifactory} # Artifactory can be very slow to start, and without locking, # restarting via runscript is very error prone CATALINA_LOCK_FILE="$(dirname $pidfile)/lock" CATALINA_MGMT_PORT=8015 REQUIRED_JAVA_VERSION="1.8" START_TIMEOUT=300 # Helper functions: is_mgmt_port_used() { mgmt_port_used=$(netstat -vatn | grep LISTEN | grep $CATALINA_MGMT_PORT | wc -l) } get_pid_info() { pidValue="" javaPs="" if [ -e "$pidfile" ]; then pidValue=$(cat $pidfile) if [ -n "$pidValue" ]; then javaPs="$(ps -p $pidValue | grep java)" fi fi } depend() { need net nginx use dns logger netmount } start_pre() { if [ -z "$ARTIFACTORY_HOME" ] || [ ! -d "$ARTIFACTORY_HOME" ]; then eerror "Artifactory home folder not defined or does not exists at $ARTIFACTORY_HOME" return 1 fi if [ -z "$pidfile" ]; then eerror "Artifactory pid destination pidfile was not set!" return 1 fi if [ -z "$TOMCAT_HOME" ] || [ ! -d "$TOMCAT_HOME" ]; then eerror "Tomcat Artifactory folder not defined or does not exists at $TOMCAT_HOME" return 1 fi if [ -z "$ARTIFACTORY_USER" ]; then ARTIFACTORY_USER=$user fi current_open_file_limit=$(su -l $ARTIFACTORY_USER -c "ulimit -n") desired_open_file_limit=32000 if [ "$current_open_file_limit" != "unlimited" ] && [ $current_open_file_limit -lt $desired_open_file_limit ]; then eerror "Maximum number of open files ($current_open_file_limit) is too small!" eerror "You should add:" eerror "artifactory soft nofile $desired_open_file_limit" eerror "artifactory hard nofile $desired_open_file_limit" eerror "to your /etc/security/limits.conf file." return 1 fi current_max_process_limit=$(su -l $ARTIFACTORY_USER -c "ulimit -u") desired_max_process_limit=1024 if [ "$current_max_process_limit" != "unlimited" ] && [ $current_max_process_limit -lt $desired_max_process_limit ]; then eerror "Number of processes $current_max_process_limit is too small!" eerror "You should add:" eerror "artifactory soft nproc $desired_max_process_limit" eerror "artifactory hard nproc $desired_max_process_limit" eerror "to your /etc/security/limits.conf file." return 1 fi if [ -n "$JAVA_HOME" ] && [ -x "$JAVA_HOME/bin/java" ]; then einfo "Found java executable in $JAVA_HOME" _java="$JAVA_HOME/bin/java" elif command -v java > dev/null 2>&1 ; then _java=java else eerror "No Java Runtime Environment (jre) found! At least java-$REQUIRED_JAVA_VERSION is required." return 1 fi if [ "$_java" ]; then java_version=$($_java -version 2>&1 | grep 'version' | cut -d ' ' -f3 | tr -d \") java_major=$(echo $java_version | cut -d . -f1-2) if [ "$java_major" != "$REQUIRED_JAVA_VERSION" ] ; then eerror "Java version $java_version is too old, java-$REQUIRED_JAVA_VERSION is required." return 1 fi fi } # We have to pass start/stop through to catalina.sh, which doesn't understand restart (and restart can't be overridden in OpenRC): start() { get_pid_info is_mgmt_port_used if [ $mgmt_port_used -ne 0 ] || [ -n "$javaPs" ]; then eerror "$RC_SERVICE already started!" return 1 else ebegin "Starting $RC_SERVICE" start-stop-daemon --exec $command --pidfile $pidfile --user $user:$group --wait $START_TIMEOUT start RETVAL=$? eend $RETVAL "start-stop-daemon failed to start $RC_SERVICE" fi is_mgmt_port_used seconds=1 while [ $mgmt_port_used -eq 0 ] && [ $seconds -lt $START_TIMEOUT ]; do sleep 1 ((seconds=seconds+1)) is_mgmt_port_used done if [ $mgmt_port_used -eq 0 ]; then eerror "$RC_SERVICE did not start in $START_TIMEOUT seconds!" return 1 elif [ $mgmt_port_used -eq 1 ]; then einfo "$RC_SERVICE started" [ $RETVAL=0 ] && touch $CATALINA_LOCK_FILE else eerror "Got unexpected result when checking port $CATALINA_MGMT_PORT" return 1 fi return $RETVAL } stop() { ebegin "Stopping $RC_SERVICE" start-stop-daemon --stop --pidfile $pidfile --wait $START_TIMEOUT stop RETVAL=$? eend $RETVAL "Failed to stop $RC_SERVICE!" [ $RETVAL=0 ] && rm -f "$CATALINA_LOCK_FILE" "$pidfile" return $RETVAL } status() { is_mgmt_port_used if [ $mgmt_port_used -eq 0 ]; then if [ -e "$pidfile" ]; then eerror "$RC_SERVICE stopped but the pid file $pidfile still exists!" RETVAL=1 else if [ -e "$CATALINA_LOCK_FILE" ]; then eerror "$RC_SERVICE is stopped but the lock file $CATALINA_LOCK_FILE still exists!" RETVAL=2 else eerror "$RC_SERVICE is stopped" RETVAL=3 fi fi else einfo "$RC_SERVICE is running" RETVAL=0 fi return $RETVAL }