#!/bin/bash # # Init file for the A-REX cache service # # This startup script takes ARC0 configuration file as # its input and generates ARC1 arched configuration file # which contains commands to start A-REX cache service. # chkconfig: - 87 13 # description: ARC cache service # processname: arched ### BEGIN INIT INFO # Provides: arc-cache-service # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Stop: 0 1 2 3 4 5 6 # Short-Description: ARC cache service # Description: ARC cache service ### END INIT INFO # source function library if [ -f /etc/init.d/functions ]; then . /etc/init.d/functions log_success_msg() { echo -n "$@" success "$@" echo } log_warning_msg() { echo -n "$@" warning "$@" echo } log_failure_msg() { echo -n "$@" failure "$@" echo } elif [ -f /lib/lsb/init-functions ]; then . /lib/lsb/init-functions else echo "Error: Cannot source neither init.d nor lsb functions" exit 1 fi add_library_path() { location="$1" if [ ! "x$location" = "x" ] ; then if [ ! "$location" = "/usr" ] ; then libdir="$location/lib" libdir64="$location/lib64" if [ -d "$libdir64" ] ; then if [ "x$LD_LIBRARY_PATH" = "x" ]; then LD_LIBRARY_PATH="$libdir64" else LD_LIBRARY_PATH="$libdir64:$LD_LIBRARY_PATH" fi fi if [ -d "$libdir" ] ; then if [ "x$LD_LIBRARY_PATH" = "x" ]; then LD_LIBRARY_PATH="$libdir" else LD_LIBRARY_PATH="$libdir:$LD_LIBRARY_PATH" fi fi fi fi } prog=arched RUN=yes # sysconfig files if [ -r /etc/sysconfig/nordugrid ]; then . /etc/sysconfig/nordugrid elif [ -r /etc/default/nordugrid ]; then . /etc/default/nordugrid fi if [ -r /etc/sysconfig/arc-cache-service ]; then . /etc/sysconfig/arc-cache-service elif [ -r /etc/default/arc-cache-service ]; then . /etc/default/arc-cache-service fi # GLOBUS_LOCATION GLOBUS_LOCATION=${GLOBUS_LOCATION:-/usr} if [ ! -d "$GLOBUS_LOCATION" ]; then log_failure_msg "GLOBUS_LOCATION ($GLOBUS_LOCATION) not found" exit 1 fi export GLOBUS_LOCATION # ARC_LOCATION ARC_LOCATION=${ARC_LOCATION:-/usr} if [ ! -d "$ARC_LOCATION" ]; then log_failure_msg "ARC_LOCATION ($ARC_LOCATION) not found" exit 1 fi export ARC_LOCATION readconfigvar() { fname=$1 if [ ! -r "$fname" ]; then return fi bname="[$2]" vname=$3 value= cat "$fname" | grep -e '^\[' -e "^${vname}=" | { while true; do read line if [ ! $? = 0 ] ; then return fi if [ "$line" = "$bname" ] ; then while true ; do read line if [ ! $? = 0 ] ; then return fi lstart=`echo "$line" | head -c 1` if [ "$lstart" = '[' ] ; then return fi vlname=`echo "$line" | sed 's/=.*//;t;s/.*//'` if [ "$vlname" = "$vname" ] ; then val=`echo "$line" | sed 's/[^=]*=//'` eval "echo $val" return fi done fi done } } # ARC_CONFIG if [ "x$ARC_CONFIG" = "x" ]; then if [ -r $ARC_LOCATION/etc/arc.conf ]; then ARC_CONFIG=$ARC_LOCATION/etc/arc.conf elif [ -r /etc/arc.conf ]; then ARC_CONFIG=/etc/arc.conf fi fi PID_FILE= if [ `id -u` = 0 ] ; then # Debian does not have /var/lock/subsys if [ -d /var/lock/subsys ]; then LOCKFILE=/var/lock/subsys/$prog-cache-service else LOCKFILE=/var/lock/$prog-cache-service fi if [ "x$PID_FILE" = "x" ]; then PID_FILE=/var/run/$prog-cache-service.pid fi else LOCKFILE=$HOME/$prog-cache-service.lock if [ "x$PID_FILE" = "x" ]; then PID_FILE=$HOME/$prog-cache-service.pid fi fi prepare() { CMD="$ARC_LOCATION/sbin/$prog" if [ ! -x "$CMD" ]; then log_failure_msg "Missing executable" exit 1 fi if [ ! -r "$ARC_CONFIG" ]; then log_warning_msg "ARC configuration not found (usually /etc/arc.conf)" exit 0 fi # Creating configuration file of arched # Reading following information from config file: # Debug level # User name # Log file is currently hard-coded #LOGFILE=`readconfigvar "$ARC_CONFIG" grid-manager logfile` LOGLEVEL=`readconfigvar "$ARC_CONFIG" grid-manager debug` LOGSIZE=`readconfigvar "$ARC_CONFIG" grid-manager logsize` USERNAME=`readconfigvar "$ARC_CONFIG" grid-manager user` X509_USER_CERT=`readconfigvar "$ARC_CONFIG" grid-manager x509_user_cert` X509_USER_KEY=`readconfigvar "$ARC_CONFIG" grid-manager x509_user_key` X509_CERT_DIR=`readconfigvar "$ARC_CONFIG" grid-manager x509_cert_dir` GRIDMAP=`readconfigvar "$ARC_CONFIG" grid-manager gridmap` GLOBUS_TCP_PORT_RANGE=`readconfigvar "$ARC_CONFIG" grid-manager globus_tcp_port_range` GLOBUS_UDP_PORT_RANGE=`readconfigvar "$ARC_CONFIG" grid-manager globus_udp_port_range` if [ -z "$X509_USER_CERT" ] ; then X509_USER_CERT=`readconfigvar "$ARC_CONFIG" common x509_user_cert` fi if [ -z "$X509_USER_KEY" ] ; then X509_USER_KEY=`readconfigvar "$ARC_CONFIG" common x509_user_key` fi if [ -z "$X509_CERT_DIR" ] ; then X509_CERT_DIR=`readconfigvar "$ARC_CONFIG" common x509_cert_dir` fi if [ -z "$GRIDMAP" ] ; then GRIDMAP=`readconfigvar "$ARC_CONFIG" common gridmap` fi if [ -z "$GLOBUS_TCP_PORT_RANGE" ] ; then GLOBUS_TCP_PORT_RANGE=`readconfigvar "$ARC_CONFIG" common globus_tcp_port_range` fi if [ -z "$GLOBUS_UDP_PORT_RANGE" ] ; then GLOBUS_UDP_PORT_RANGE=`readconfigvar "$ARC_CONFIG" common globus_udp_port_range` fi # Exporting collected variables if [ ! -z "$X509_USER_CERT" ] ; then export X509_USER_CERT ; fi if [ ! -z "$X509_USER_KEY" ] ; then export X509_USER_KEY ; fi if [ ! -z "$X509_CERT_DIR" ] ; then export X509_CERT_DIR ; fi if [ ! -z "$GRIDMAP" ] ; then export GRIDMAP ; fi if [ ! -z "$GLOBUS_TCP_PORT_RANGE" ] ; then export GLOBUS_TCP_PORT_RANGE ; fi if [ ! -z "$GLOBUS_UDP_PORT_RANGE" ] ; then export GLOBUS_UDP_PORT_RANGE ; fi # Required defaults if [ -z "$GRIDMAP" ] ; then GRIDMAP=/etc/grid-security/grid-mapfile fi if [ -z "$X509_USER_CERT" ] ; then X509_USER_CERT=/etc/grid-security/hostcert.pem fi if [ -z "$X509_USER_KEY" ] ; then X509_USER_KEY=/etc/grid-security/hostkey.pem fi if [ -z "$X509_CERT_DIR" ] ; then X509_CERT_DIR=/etc/grid-security/certificates fi # Web Service configuration host=`readconfigvar "$ARC_CONFIG" common hostname` cache_endpoint=https://$host:60001/cacheservice CACHE_CONFIG=`mktemp -t arc-cache-service.xml.XXXXXX` if [ -z "$CACHE_CONFIG" ] ; then log_failure_msg "Failed to create temporary file" exit 1 fi CMD="$CMD -c '$CACHE_CONFIG'" # VOMS_LOCATION VOMS_LOCATION=${VOMS_LOCATION:-@DEFAULT_VOMS_LOCATION@} # GRIDSITE_LOCATION GRIDSITE_LOCATION=${GRIDSITE_LOCATION:-@DEFAULT_GRIDSITE_LOCATION@} add_library_path "$LFC_LOCATION" add_library_path "$GRIDSITE_LOCATION" add_library_path "$VOMS_LOCATION" add_library_path "$GLOBUS_LOCATION" if [ "x$LD_LIBRARY_PATH" = "x" ]; then LD_LIBRARY_PATH=$ARC_LOCATION/lib64 else LD_LIBRARY_PATH=$ARC_LOCATION/lib64:$LD_LIBRARY_PATH fi export LD_LIBRARY_PATH case "$LOGLEVEL" in 0) LOGLEVEL="FATAL" ;; 1) LOGLEVEL="ERROR" ;; 2) LOGLEVEL="WARNING" ;; 3) LOGLEVEL="INFO" ;; 4) LOGLEVEL="VERBOSE" ;; 5) LOGLEVEL="DEBUG" ;; *) LOGLEVEL="WARNING" ;; esac if [ "$USERNAME" = "root" ] ; then USERNAME="" fi LOGFILE=${LOGFILE:-/var/log/arc/cache-service.log} if [ ! -d `dirname $LOGFILE` ]; then mkdir -p `dirname $LOGFILE` fi LOGSIZE=${LOGSIZE:--1 -1} LOGNUM=`echo "$LOGSIZE" | sed 's/^ *[-+0-9]* *//'` LOGSIZE=`echo "$LOGSIZE" | sed 's/^ *\([-+0-9]*\).*/\1/'` if [ ! -z "$USERNAME" ] ; then CMD="$CMD -u $USERNAME" fi # Cache service XML config CACHECFG="\ <?xml version=\"1.0\"?>\ <ArcConfig\ xmlns=\"http://www.nordugrid.org/schemas/ArcConfig/2007\"\ xmlns:tcp=\"http://www.nordugrid.org/schemas/ArcMCCTCP/2007\" xmlns:cacheservice=\"urn:cacheservice_config\">\ <Server>\ <PidFile>$PID_FILE</PidFile>\ <Logger>\ <File>$LOGFILE</File>\ <Level>$LOGLEVEL</Level>\ <Backups>$LOGNUM</Backups>\ <Maxsize>$LOGSIZE</Maxsize>\ </Logger>\ </Server>\ <ModuleManager>\ <Path>$ARC_LOCATION/lib64/arc/</Path>\ </ModuleManager>\ <Plugins><Name>mcctcp</Name></Plugins>\ <Plugins><Name>mcctls</Name></Plugins>\ <Plugins><Name>mcchttp</Name></Plugins>\ <Plugins><Name>mccsoap</Name></Plugins>\ <Plugins><Name>identitymap</Name></Plugins>\ <Plugins><Name>arcshc</Name></Plugins>\ <Plugins><Name>cacheservice</Name></Plugins>\ <Chain>\ <Component name=\"tcp.service\" id=\"tcp\">\ <next id=\"tls\"/>\ <tcp:Listen><tcp:Port>60001</tcp:Port></tcp:Listen>\ </Component>\ <Component name=\"tls.service\" id=\"tls\">\ <next id=\"http\"/>\ <KeyPath>$X509_USER_KEY</KeyPath>\ <CertificatePath>$X509_USER_CERT</CertificatePath>\ <CACertificatesDir>$X509_CERT_DIR</CACertificatesDir>\ <VOMSCertTrustDNChain> <VOMSCertTrustRegex>.*</VOMSCertTrustRegex> </VOMSCertTrustDNChain> <SecHandler name=\"identity.map\" id=\"map\" event=\"incoming\">\ <PDP name=\"allow.pdp\"><LocalList>$GRIDMAP</LocalList></PDP>\ <PDP name=\"allow.pdp\"><LocalName>nobody</LocalName></PDP>\ </SecHandler>\ </Component>\ <Component name=\"http.service\" id=\"http\">\ <next id=\"soap\">POST</next>\ <next id=\"plexer\">GET</next>\ <next id=\"plexer\">PUT</next>\ </Component>\ <Component name=\"soap.service\" id=\"soap\">\ <next id=\"plexer\"/>\ </Component>\ <Plexer name=\"plexer.service\" id=\"plexer\">\ <next id=\"cacheservice\">^/cacheservice</next>\ </Plexer>\ <Service name=\"cacheservice\" id=\"cacheservice\">\ <!-- Put sec handler in here so that sensible error message can\ be returned -->\ <SecHandler name=\"arc.authz\" id=\"map\" event=\"incoming\">\ <PDP name=\"simplelist.pdp\" location=\"$GRIDMAP\"/>\ </SecHandler>\ <cacheservice:cache>\ <cacheservice:config>$ARC_CONFIG</cacheservice:config>\ <cacheservice:maxload>5</cacheservice:maxload>\ </cacheservice:cache>\ </Service> </Chain>\ </ArcConfig>\ " echo "$CACHECFG" > "$CACHE_CONFIG" if [ ! -z "$USERNAME" ] ; then [ -f $CACHE_CONFIG ] && chown $USERNAME $CACHE_CONFIG fi } start() { if [ "$RUN" != "yes" ] ; then echo "arc-cache-service disabled in configuration" return 0 fi echo -n "Starting $prog: " # Check if we are already running if [ -f $PID_FILE ]; then read pid < $PID_FILE if [ "x$pid" != "x" ]; then ps -p "$pid" -o comm 2>/dev/null | grep "^$prog$" 1>/dev/null 2>/dev/null if [ $? -eq 0 ] ; then log_success_msg "already running (pid $pid)" return 0 fi fi rm -f "$PID_FILE" "$LOCKFILE" fi prepare eval "$CMD" RETVAL=$? rm -f "$CACHE_CONFIG" if [ $RETVAL -eq 0 ]; then touch $LOCKFILE log_success_msg else log_failure_msg fi return $RETVAL } stop() { echo -n "Stopping $prog: " if [ -f "$PID_FILE" ]; then read pid < "$PID_FILE" if [ ! -z "$pid" ] ; then kill "$pid" RETVAL=$? if [ $RETVAL -eq 0 ]; then log_success_msg else log_failure_msg fi sleep 1 kill -9 "$pid" 1>/dev/null 2>&1 rm -f "$PID_FILE" "$LOCKFILE" else RETVAL=1 log_failure_msg "$prog shutdown - pidfile is empty" fi else RETVAL=0 log_success_msg "$prog shutdown - already stopped" fi return $RETVAL } status() { if [ -f "$PID_FILE" ]; then read pid < "$PID_FILE" if [ "$pid" != "" ]; then if ps -p "$pid" > /dev/null; then echo "$1 (pid $pid) is running..." return 0 fi echo "$1 stopped but pid file exists" return 1 fi fi if [ -f $LOCKFILE ]; then echo "$1 stopped but lockfile exist" return 2 fi echo "$1 is stopped" return 3 } restart() { stop start } case "$1" in start) start ;; stop) stop ;; status) status ;; restart | force-reload) restart ;; reload) ;; condrestart | try-restart) [ -f $LOCKFILE ] && restart || : ;; *) echo "Usage: $0 {start|stop|status|restart|force-reload|reload|condrestart|try-restart}" exit 1 ;; esac exit $?