diaspora/script/server
Alec Leamas 23a5db1013 Creates and maintains a local redis.conf.
Creates config/redis.conf using mater copy in etc. FTM, disables
daemonizing, which doesn't fit script/server (or upstart/systemd).
2010-12-07 19:06:25 +01:00

131 lines
3.4 KiB
Bash
Executable file

#!/bin/bash
#
# Start diaspora websocket and main services
#
realpath=$( ruby -e "puts File.expand_path(\"$0\")")
cd $( dirname $realpath)/..
OS=`uname -s`
[ -e config/server.sh ] && source config/server.sh
function init_public
# Create all dynamically generated files in public/ folder
{
bundle exec thin \
-d --pid log/thin.pid --address localhost --port $THIN_PORT \
start
for ((i = 0; i < 30; i += 1)) do
sleep 2
wget -q -O tmp/server.html http://localhost:$THIN_PORT && \
rm tmp/server.html && break
done
bundle exec thin --pid log/thin.pid stop
if [ -e tmp/server.html ]; then
echo "Cannot get index.html from web server (aborted)" >&2
return 2
fi
bundle exec jammit
}
function chk_service
{
port=${1:?Missing port}
case $OS in
*[Bb][Ss][Dd]*|Darwin)
## checks ipv[46]
netstat -anL | awk '{print $2}' | grep "\.$1$"
;;
*)
# Is someone listening on the ports already? (ipv4 only test ?)
netstat -nl | grep '[^:]:'$port'[ \t]'
;;
esac
}
function redis_config
# Create/update the local redis.conf file from /etc master
{
if [ -r "/etc/redis.conf" ]; then
redis_conf="/etc/redis.conf"
elif [ -r "/etc/redis/redis.conf" ]; then
redis_conf="/etc/redis/redis.conf"
else
echo <<- EOM
Don't know how to configure redis for this platform. Copy
the configuration file redis.conf to the config directory
and patch it manually. In particular, don't daemonize.
EOM
return
fi
if [ config/redis.cont -nt $redis_conf ]
then
return
fi
cp $redis_conf config/redis.conf
sed -i '/^[^#]*daemonize/s/yes/no/' config/redis.conf
}
# Scan for -p, find out what port thin is about to use.
args="$DEFAULT_THIN_ARGS $@"
prev_arg=''
for arg in $( echo $args | awk '{ for (i = 1; i <= NF; i++) print $i}')
do
[ "$prev_arg" = '-p' ] && THIN_PORT="$arg"
prev_arg="$arg"
done
# Is someone listening on the ports already? (ipv4 only test ?)
services=$( chk_service $THIN_PORT )
if [ -n "$services" ]; then
echo "Error: thin port $THIN_PORT is already in use. Exiting" >&2
echo " $services"
exit 64
fi
services=$( chk_service $SOCKET_PORT )
if [ -n "$services" ]; then
echo "Error: websocket port $SOCKET_PORT is already in use. Exiting" >&2
echo " $services"
exit 64
fi
# Check if Mongo is running
if ! ps ax | grep -v grep | grep mongod >/dev/null
then
echo "Error: Mongod not started. Exiting" >&2
exit 64
fi
redis_config
# Force AGPL
if [ -w public -a ! -e public/source.tar.gz ]; then
branch=$( git branch | awk '/^[*]/ {print $2}')
tar czf public/source.tar.gz `git ls-tree -r $branch | awk '{print $4}'`
fi
if [ ! -e public/source.tar.gz ]; then
echo "Error: Can't find, or even create, public/source.tar.gz. Exiting" >&2
exit 65
fi
# Precache jammit assets
if [[ -w public && ! -e 'public/stylesheets/application.css' ]]; then
if [ "$INIT_PUBLIC" != 'no' ]; then
echo "Making first-time server initialization."
init_public
fi
fi
if [ ! -e 'public/stylesheets/application.css' ]; then
echo 'Jammit precache error (now or at install)' >&2
exit 66
fi
mkdir -p -v log/thin/
bundle exec ruby ./script/websocket_server.rb&
redis-server config/redis.conf &>log/redis-console.log &
QUEUE=* bundle exec rake resque:work&
bundle exec thin start $args