Files
dokku-redis/functions
Jose Diaz-Gonzalez ac50d9c37c first - broken - pass at start/stop commands and working expose/expose commands
note that at the moment the iptables calls complete successfully but the container isn't actually exposed. We'll probably need to use the ambassador pattern to do this properly.
2015-08-31 15:29:23 -04:00

238 lines
6.3 KiB
Bash
Executable File

#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$(dirname "$0")/config"
get_random_port() {
local port=$RANDOM
local quit=0
while [ "$quit" -ne 1 ]; do
netstat -a | grep $port >> /dev/null
if [ $? -gt 0 ]; then
quit=1
else
port=$((port + 1))
fi
done
echo $port
}
get_container_ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$1"
}
verify_service_name() {
local SERVICE="$1"
[[ ! -n "$SERVICE" ]] && dokku_log_fail "(verify_service_name) SERVICE must not be null"
[[ ! -d "$PLUGIN_DATA_ROOT/$SERVICE" ]] && dokku_log_fail "$PLUGIN_SERVICE service $SERVICE does not exist"
return 0
}
service_alias() {
local SERVICE="$1"
local ALIAS_FILE="$PLUGIN_DATA_ROOT/$SERVICE/ALIAS"
verify_service_name "$1"
if [[ -f "$ALIAS_FILE" ]]; then
cat "$ALIAS_FILE"
else
echo "$PLUGIN_DEFAULT_ALIAS"
fi
}
service_info() {
local SERVICE="$1"
local SERVICE_URL=$(service_url "$SERVICE")
echo " DSN: $SERVICE_URL"
}
service_list() {
local SERVICES=$(ls $PLUGIN_DATA_ROOT 2> /dev/null)
if [[ -z $SERVICES ]]; then
dokku_log_warn "There are no $PLUGIN_SERVICE services"
else
dokku_log_info1_quiet "$PLUGIN_SERVICE services:"
for SERVICE in $SERVICES; do
dokku_log_verbose "$SERVICE $(service_status $SERVICE)"
done
fi
}
service_link() {
local APP="$2"
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS"
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
touch "$LINKS_FILE"
echo "$APP" >> "$LINKS_FILE"
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
dokku_log_info1 "Restarting app $APP"
dokku ps:restart "$APP"
}
service_logs() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID=$(cat "$SERVICE_ROOT/ID")
if [[ $2 == "-t" ]]; then
DOKKU_LOGS_ARGS="--follow"
else
DOKKU_LOGS_ARGS="--tail 100"
fi
docker logs $DOKKU_LOGS_ARGS "$ID"
}
service_set_alias() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ALIAS_FILE="$SERVICE_ROOT/ALIAS"
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
touch "$ALIAS_FILE"
echo "$2" > "$ALIAS_FILE"
}
service_status() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")"
is_container_status "$ID" "Dead" && echo "(dead)" && return 0
is_container_status "$ID" "OOMKilled" && echo "(oomkilled)" && return 0
is_container_status "$ID" "Paused" && echo "(paused)" && return 0
is_container_status "$ID" "Restarting" && echo "(restarting)" && return 0
is_container_status "$ID" "Running" && echo "(running)" && return 0
echo "(stopped)" && return 0
}
service_port_expose() {
service_port_unpause "$1" "true"
}
service_port_pause() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PORT_FILE="$SERVICE_ROOT/PORT"
local DESTINATION_FILE="$SERVICE_ROOT/IPTABLES_DESTINATION"
local LOG_FAIL="$2"
if [[ "$LOG_FAIL" == "true" ]]; then
[[ ! -f "$PORT_FILE" ]] && dokku_log_fail "Service not exposed"
else
[[ ! -f "$PORT_FILE" ]] && return 0
fi
local ID=$(cat "$SERVICE_ROOT/ID")
local IP=$(get_container_ip "$ID")
local PORT=$(cat "$PORT_FILE")
local DESTINATION=$(cat "$DESTINATION_FILE")
sudo /sbin/iptables -t nat -D DOCKER -p tcp --dport "$PORT" -j DNAT --to-destination "$DESTINATION"
}
service_port_unexpose() {
service_port_pause "$1" "true"
rm -rf "$PORT_FILE"
}
service_port_unpause() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local PORT_FILE="$SERVICE_ROOT/PORT"
local DESTINATION_FILE="$SERVICE_ROOT/IPTABLES_DESTINATION"
local LOG_FAIL="$2"
local PORT=$(get_random_port)
local ID=$(cat "$SERVICE_ROOT/ID")
local IP=$(get_container_ip "$ID")
local DESTINATION="$IP:$PLUGIN_DATASTORE_PORT"
if [[ "$LOG_FAIL" == "true" ]]; then
[[ -f "$PORT_FILE" ]] && PORT=$(cat "$PORT_FILE") && dokku_log_fail "Service $SERVICE already exposed on port $PORT"
else
[[ ! -f "$PORT_FILE" ]] && return 0
PORT=$(cat "$PORT_FILE") && sudo /sbin/iptables -t nat -D DOCKER -p tcp --dport "$PORT" -j DNAT --to-destination "$DESTINATION"
fi
echo "$PORT" > "$PORT_FILE"
echo "$DESTINATION" > "$DESTINATION_FILE"
echo "$DESTINATION"
sudo /sbin/iptables -t nat -A DOCKER -p tcp --dport "$PORT" -j DNAT --to-destination "$DESTINATION"
if [[ "$LOG_FAIL" == "true" ]]; then
dokku_log_info1 "Service $SERVICE exposed on port $PORT"
fi
}
service_start() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
dokku_log_verbose_quiet "Starting container"
if [[ -f "$SERVICE_ROOT/ID" ]] && docker ps -aq --no-trunc | grep -q $(cat "$SERVICE_ROOT/ID"); then
ID=$(cat "$SERVICE_ROOT/ID")
docker start "$ID" > /dev/null
service_port_unpause "$SERVICE"
dokku_log_info2 "Container started"
else
dokku_log_verbose_quiet "No container exists for $SERVICE"
fi
}
service_stop() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE";
if [[ -f "$SERVICE_ROOT/ID" ]] && docker ps -aq --no-trunc | grep -q $(cat "$SERVICE_ROOT/ID"); then
dokku_log_verbose_quiet "Stopping container"
ID=$(cat "$SERVICE_ROOT/ID")
docker stop "$ID" > /dev/null
service_port_pause "$SERVICE"
dokku_log_info2 "Container stopped"
else
dokku_log_verbose_quiet "No container exists for $SERVICE"
fi
}
service_unlink() {
local APP="$2"
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local LINKS_FILE="$SERVICE_ROOT/LINKS"
mkdir -p "$SERVICE_ROOT" || dokku_log_fail "Unable to create service directory"
touch "$LINKS_FILE"
sed -i "/^$APP\$/d" "$LINKS_FILE"
sort "$LINKS_FILE" -u -o "$LINKS_FILE"
dokku_log_info1 "Restarting app $APP"
dokku ps:restart "$APP"
}
service_url() {
local SERVICE="$1"
local SERVICE_ROOT="$PLUGIN_DATA_ROOT/$SERVICE"
local ID="$(cat "$SERVICE_ROOT/ID")"
local IP="$(get_container_ip "$ID")"
echo "$PLUGIN_SCHEME://$IP:$PLUGIN_DATASTORE_PORT/0"
}
is_container_status () {
local CID=$1
local TEMPLATE="{{.State.$2}}"
local CONTAINER_STATUS=$(docker inspect -f "$TEMPLATE" "$CID" || true)
if [[ "$CONTAINER_STATUS" == "true" ]]; then
return 0
else
return 1
fi
}