Example AWS SFengine Script

The following is an example of an Sfengine script for AWS.

#!/bin/sh
### BEGIN INIT INFO
# Provides:          sfengine
# Required-Start:    $network nfs syslog docker
# Required-Stop:
# Default-Start:     3 4 5
# Default-Stop:      1 2
# Short-Description: Engine Daemon makes this host part of TIBCO Silver Fabric private cloud
#    and makes this host part of Broker Rngine inventory.
### END INIT INFO


/bin/rm /var/log/sfengine.log
echo "$0 $1" >> /var/log/sfengine.log

MAC_ADDR=`/sbin/ifconfig -a | grep ether | awk 'NR==1 {print $2}'`
echo "Mac Address: $MAC_ADDR" >> /var/log/sfengine.log
IP=($(curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC_ADDR/local-ipv4s))
PRIVATE_IPV4S=
for ip in ${IP[@]}; do
  PRIVATE_IPV4S="$PRIVATE_IPV4S $ip"
done
for ip in ${IP[@]:1}; do
    echo "Adding IP: $ip" >> /var/log/sfengine.log
    ip addr add dev eth0 $ip/24
done

# get local-hostname from aws meta-data web service
HOSTNAME=`curl http://169.254.169.254/latest/meta-data/public-hostname`
if [ "${HOSTNAME:0:5}" == "<?xml" ]
then
        LOCALIP=`curl http://169.254.169.254/latest/meta-data/local-ipv4`
    echo "Local IP: $LOCALIP" >> /var/log/sfengine.log
        REVERSE=`nslookup $LOCALIP | grep name | awk -F '=' '{print $2}'`
    echo "Reverse Lookup of Local IP: $REVERSE" >> /var/log/sfengine.log
        if [ "$REVERSE" == "" ]
        then
                HOSTNAME=`curl http://169.254.169.254/latest/meta-data/hostname`
        else
                if [ "${REVERSE: -1}" == "." ]
                then
                        HOSTNAME="${REVERSE%.}"
            echo "${HOSTNAME}"
            HOSTNAME="${HOSTNAME//[[:blank:]]/}"
                fi
        fi
fi

echo "Setting hostname: $HOSTNAME"  >> /var/log/sfengine.log
hostname $HOSTNAME
rm -f /etc/hostname
echo "${HOSTNAME}" >> /etc/hostname
HOSTNAME=`hostname`
echo "Hostname: $HOSTNAME" >> /var/log/sfengine.log
export HOSTNAME

AMI_ID=`curl http://169.254.169.254/latest/meta-data/ami-id`
INSTANCE_TYPE=`curl http://169.254.169.254/latest/meta-data/instance-type`
INSTANCE_ID=`curl http://169.254.169.254/latest/meta-data/instance-id`
PUBLIC_HOSTNAME=${HOSTNAME}
PUBLIC_IPV4=`curl http://169.254.169.254/latest/meta-data/public-ipv4`
ZONE=`curl http://169.254.169.254/latest/meta-data/placement/availability-zone`
MAC=`curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/`
VPC_SUBNET_ID=`curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/$MAC/subnet-id`

if [ "${VPC_SUBNET_ID:0:5}" == "<?xml" ]
then
    VPC_SUBNET_ID=""
fi

if [ "${PUBLIC_IPV4:0:5}" == "<?xml" ]
then
PUBLIC_IPV4=`curl http://169.254.169.254/latest/meta-data/local-ipv4`
fi

USER_DATA="`curl http://169.254.169.254/latest/user-data`"

BROKER_OPTIONS=$(echo $USER_DATA | awk -F',' '{print $1}')
if [ "${BROKER_OPTIONS:0:5}" == "<?xml" ]
then
    BROKER_OPTIONS=""
fi
echo "Broker options: $BROKER_OPTIONS " >> /var/log/sfengine.log

RESOURCES_NFS_OPTIONS=$(echo $USER_DATA | awk -F',' '{print $2}')
echo "Resources nfs mount options: $RESOURCES_NFS_OPTIONS " >> /var/log/sfengine.log

RESOURCES_NFS_MOUNT=$(echo $USER_DATA | awk -F',' '{print $3}')
echo "Resources nfs local mount point: $RESOURCES_NFS_MOUNT " >> /var/log/sfengine.log

DATA_NFS_OPTIONS=$(echo $USER_DATA | awk -F',' '{print $4}')
echo "Data nfs options: $DATA_NFS_OPTIONS " >> /var/log/sfengine.log

DATA_NFS_MOUNT=$(echo $USER_DATA | awk -F',' '{print $5}')
echo "Data nfs mount: $DATA_NFS_MOUNT " >> /var/log/sfengine.log

RESOURCES2_NFS_OPTIONS=$(echo $USER_DATA | awk -F',' '{print $6}')
echo "Resource2 nfs options: $RESOURCES2_NFS_OPTIONS " >> /var/log/sfengine.log

RESOURCES2_NFS_MOUNT=$(echo $USER_DATA | awk -F',' '{print $7}')
echo "Resource2 nfs mount: $RESOURCES2_NFS_MOUNT " >> /var/log/sfengine.log

GROUP=$(echo $USER_DATA | awk -F',' '{print $8}')
echo "Group: $GROUP " >> /var/log/${PROG_NAME}.log

ASSET_MGR_ID=$(echo $USER_DATA | awk -F',' '{print $9}')
echo "Asset Manager Id: $ASSET_MGR_ID " >> /var/log/${PROG_NAME}.log

DSENGINE=/opt/DSEngine
echo "DSEngine install dir is $DSENGINE " >> /var/log/sfengine.log
cd $DSENGINE

# Check for missing shell script
ENGINE_SH=engine.sh
test -x $ENGINE_SH || { echo "$ENGINE_SH not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

# Check for existence of needed config file
ENGINE_CONFIG=configure.sh
test -x $ENGINE_CONFIG || { echo "$ENGINE_CONFIG not existing";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 6; fi; }

# init status of this service
rc=0

if [ "$1" == "start" -o "$1" == "restart" ]
then
    if [ "${BROKER_OPTIONS}" != "" ]
    then
        ## Configure engine
        echo "$DSENGINE/$ENGINE_CONFIG ${BROKER_OPTIONS}" >> /var/log/sfengine.log
            $DSENGINE/$ENGINE_CONFIG ${BROKER_OPTIONS} >> /var/log/sfengine.log 2>&1
        chown -R fabric:fabric $DSENGINE
    else
        echo "Error: no broker options found" >> /var/log/sfengine.log
            exit 6
    fi
fi


case "$1" in
    start)
        echo "Starting engine " >> /var/log/sfengine.log

    # mount resources directory
    if [ "${RESOURCES_NFS_OPTIONS}" != "" ]
    then
        ## NFS resources directory
        if  [ "${RESOURCES_NFS_MOUNT}" != "" ]
        then
            echo "Mounting ${RESOURCES_NFS_OPTIONS} " >> /var/log/sfengine.log
            mkdir -p $RESOURCES_NFS_MOUNT
            chown -R fabric $RESOURCES_NFS_MOUNT
            chgrp -R fabric $RESOURCES_NFS_MOUNT
            mount -t nfs ${RESOURCES_NFS_OPTIONS} ${RESOURCES_NFS_MOUNT}
        fi

    else
        ## local resources directory
        mkdir -p /mnt/resources
        chown -R fabric /mnt/resources
        chgrp -R fabric /mnt/resources
        rm -rf ./resources
        ln -s /mnt/resources ./resources
    fi

    if [ "${DATA_NFS_OPTIONS}" != "" ]
    then
        ## NFS resources directory
        if [ "${DATA_NFS_MOUNT}" != "" ]
        then
            mkdir -p $DATA_NFS_MOUNT
            chown -R fabric $DATA_NFS_MOUNT
            chgrp -R fabric $DATA_NFS_MOUNT
            echo "Mounting ${DATA_NFS_OPTIONS} " >> /var/log/sfengine.log
            mount -t nfs ${DATA_NFS_OPTIONS} ${DATA_NFS_MOUNT}
        fi
    fi

    if [ "${RESOURCES2_NFS_OPTIONS}" != "" ]
    then
        ## NFS resources directory
        if [ "${RESOURCES2_NFS_MOUNT}" != "" ]
        then
            mkdir -p $RESOURCES2_NFS_MOUNT
            chown -R fabric $RESOURCES2_NFS_MOUNT
            chgrp -R fabric $RESOURCES2_NFS_MOUNT
            echo "Mounting ${RESOURCES2_NFS_OPTIONS} " >> /var/log/sfengine.log
            mount -t nfs ${RESOURCES2_NFS_OPTIONS} ${RESOURCES2_NFS_MOUNT}
        fi
    fi

    ## cleanup
    /bin/rm -rf work data profiles boot.log .#dsDirID

    ## setup engine session properties
    rm -rf ./engine-session.properties
    echo "ec2AmiId=$AMI_ID" >> ./engine-session.properties
    echo "ec2InstanceType=$INSTANCE_TYPE" >> ./engine-session.properties
    echo "ec2InstanceId=$INSTANCE_ID" >> ./engine-session.properties
    echo "ec2PublicHostname=$PUBLIC_HOSTNAME" >> ./engine-session.properties
    echo "ec2PublicIpv4=$PUBLIC_IPV4" >> ./engine-session.properties
    echo "ec2Zone=$ZONE" >> ./engine-session.properties
        echo "ec2PrivateIpv4s=$PRIVATE_IPV4S" >> ./engine-session.properties
        echo "DockerEnabled=true" >> ./engine-session.properties
        echo "DockerVersionInfo=`docker -v`" >> ./engine-session.properties
    if [ "$VPC_SUBNET_ID" != "" ]
    then
        echo "vpcSubnetId=$VPC_SUBNET_ID" >> ./engine-session.properties
    fi

    if [ "$GROUP" != "" ]
    then
        echo "Group=$GROUP" >> ./engine-session.properties
    fi

    if [ "$ASSET_MGR_ID" != "" ]
    then
        echo "AssetManagerId=$ASSET_MGR_ID" >> ./engine-session.properties
    fi

    echo "alternateRoutingAddress=$PUBLIC_HOSTNAME" >> ./engine-session.properties
    echo "alternateRedirectAddress=$PUBLIC_HOSTNAME" >> ./engine-session.properties

        ## Start engine
    echo "$DSENGINE/$ENGINE_SH start" >> /var/log/sfengine.log
        su --session-command="$DSENGINE/$ENGINE_SH start" fabric >> /var/log/sfengine.log 2>&1
    
        # Remember status and be verbose
        [ $? -ne 0 ] && rc=1 
        while [ ! -f profiles/${HOSTNAME}/pid.${HOSTNAME} ]
    do
        sleep 1
    done
        cp "profiles/${HOSTNAME}/pid.${HOSTNAME}" /opt/sfengine.pid
        ;;
    stop)
        echo "Stopping engine " >> /var/log/sfengine.log
        ## Stop engine
        su --session-command="$DSENGINE/$ENGINE_SH stop" fabric >> /var/log/sfengine.log 2>&1

    # umount nfs directories
    if [ "$RESOURCES_NFS_MOUNT" != "" ]
    then
        umount $RESOURCES_NFS_MOUNT
    fi

    if [ "$DATA_NFS_MOUNT" != "" ]
    then
        umount $DATA_NFS_MOUNT
    fi

    if [ "$RESOURCES2_NFS_MOUNT" != "" ]
    then
        umount $RESOURCES2_NFS_MOUNT
    fi

        # Remember status and be verbose
        [ $? -ne 0 ] && rc=1 
    rm -f /opt/sfengine.pid
        ;;
    restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start

        # Remember status and be quiet
        [ $? -ne 0 ] && rc=1 
        ;;
    reload)
        ## does not support reload:
        rc=3
        ;;
    status)
        echo "Checking for service engine " >> /var/log/sfengine.log
        ## Check status with checkproc(8), if process is running
        ## checkproc will return with exit status 0.

        # Return value is slightly different for the status command:
        # 0 - service up and running
        # 1 - service dead, but /var/run/  pid  file exists
        # 2 - service dead, but /var/lock/ lock file exists
        # 3 - service not running (unused)
        # 4 - service status unknown :-(
        # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)

        # NOTE: checkproc returns LSB compliant status values.
        checkproc engine
    [ $? -ne 0 ] && rc=1
        ;;
    *)
        ## If no parameters are given, print which are avaiable.
        echo "Usage: $0 {start|stop|status|restart|reload}"
        rc=1
        ;;
esac

exit $rc