Skip to content

Instantly share code, notes, and snippets.

@tammersaleh
Last active July 22, 2018 21:22
Show Gist options
  • Save tammersaleh/8d909de4189641bbb4a7af999edc3c93 to your computer and use it in GitHub Desktop.
Save tammersaleh/8d909de4189641bbb4a7af999edc3c93 to your computer and use it in GitHub Desktop.
etcd frontend server
#!/usr/bin/env bash
set -e -x
# /var/vcap/packages/frontend
cp -a frontend/* ${BOSH_INSTALL_TARGET}
cd ${BOSH_INSTALL_TARGET}
/var/vcap/packages/ruby_2.4.1/bin/bundle install \
--local \
--deployment \
--without development test
check process frontend
with pidfile /var/vcap/sys/run/frontend/pid
start program "/var/vcap/jobs/frontend/bin/frontend_ctl start"
stop program "/var/vcap/jobs/frontend/bin/frontend_ctl stop"
group vcap
require 'rubygems'
require 'sinatra'
require 'httparty'
$stdout.sync = true
$stderr.sync = true
$etcd_servers = ENV["ETCD_SERVERS"].split(",")
def random_etcd_server
$etcd_servers.sample
end
def value_url
"http://" + random_etcd_server + ":4001/v2/keys/frontend"
end
def get_value
JSON.parse(HTTParty.get(value_url).body)["node"]["value"] rescue ""
end
def set_value(new_value)
HTTParty.put(value_url, body: "value=#{new_value}")
end
def html_escape(v)
Rack::Utils.escape_html(v)
end
get '/' do
<<-HTML
<!DOCTYPE html>
<html><body>
<h1>Etcd Frontend</h1>
<pre><code>#{html_escape(get_value)}</code></pre>
<form action="/" method="POST">
<label>New value:</label>
<input type="text" name="value"/>
<input type="submit" value="Change"/>
</form>
</body></html>
HTML
end
post '/' do
set_value(params[:value])
redirect '/'
end
#!/bin/bash
RUN_DIR=/var/vcap/sys/run/frontend
LOG_DIR=/var/vcap/sys/log/frontend
PIDFILE=${RUN_DIR}/pid
RUBYBIN=/var/vcap/packages/ruby_2.4.1/bin
export ETCD_SERVERS="<%= p('frontend.etcd_servers').join(',') %>"
case $1 in
start)
mkdir -p $RUN_DIR $LOG_DIR
chown -R vcap:vcap $RUN_DIR $LOG_DIR
echo $$ > $PIDFILE
cd /var/vcap/packages/frontend
export PATH=$RUBYBIN:$PATH
exec $RUBYBIN/bundle exec \
rackup -p <%= p("frontend.port") %> -o 0.0.0.0 \
>> $LOG_DIR/frontend.stdout.log \
2>> $LOG_DIR/frontend.stderr.log
;;
stop)
kill -9 `cat $PIDFILE`
rm -f $PIDFILE
;;
*)
echo "Usage: ctl {start|stop}"
exit 2
;;
esac
---
name: frontend
templates:
frontend_ctl.erb: bin/frontend_ctl
packages:
- frontend
- ruby_2.4.1
properties:
frontend.port:
description: Port that the frontend app listens on
default: 80
frontend.etcd_servers:
description: IP addresses of backend Etcd servers
---
name: frontend
dependencies:
- ruby_2.4.1
files:
- frontend/**/*
#!/usr/bin/env bash
set -e -x
# BOSH_INSTALL_TARGET => /var/vcap/packages/ruby_2.4.1
tar -xzf ruby-2.4.1.tar.gz
pushd ruby-2.4.1
./configure \
--prefix=${BOSH_INSTALL_TARGET} \
--disable-install-doc
make
make install
popd
tar -zxvf rubygems-2.6.12.tgz
pushd rubygems-2.6.12
${BOSH_INSTALL_TARGET}/bin/ruby setup.rb
popd
${BOSH_INSTALL_TARGET}/bin/gem install bundler-1.15.3.gem --no-ri --no-rdoc
---
name: ruby_2.4.1
dependencies: []
files:
- ruby-2.4.1.tar.gz # https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
- rubygems-2.6.12.tgz # https://rubygems.org/rubygems/rubygems-2.6.12.tgz
- bundler-1.15.3.gem # https://rubygems.org/downloads/bundler-1.15.3.gem
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment