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
Copyright © Cloud Software Group, Inc. All rights reserved.
