mirror of
https://gitlab.com/psuapp/psu.git
synced 2024-08-30 18:12:34 +00:00
Merge deploy and undeploy scripts into psu script
This commit is contained in:
212
deploy → psu
Normal file → Executable file
212
deploy → psu
Normal file → Executable file
@ -42,7 +42,117 @@ check_for_errors () {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deploy () {
|
||||||
|
STACK_YAML_PATH=$DOCKER_COMPOSE_FILE
|
||||||
|
|
||||||
|
STACK_YAML_CONTENT=$(cat "$STACK_YAML_PATH")
|
||||||
|
|
||||||
|
# Escape carriage returns
|
||||||
|
STACK_YAML_CONTENT="${STACK_YAML_CONTENT//$'\r'/''}"
|
||||||
|
|
||||||
|
# Escape double quotes
|
||||||
|
STACK_YAML_CONTENT="${STACK_YAML_CONTENT//$'"'/'\"'}"
|
||||||
|
|
||||||
|
# Escape newlines
|
||||||
|
STACK_YAML_CONTENT="${STACK_YAML_CONTENT//$'\n'/'\n'}"
|
||||||
|
|
||||||
|
if [ -z "$STACK" ]; then
|
||||||
|
echo "Result: Stack $STACK_NAME not found."
|
||||||
|
|
||||||
|
echo "Getting swarm cluster (if any)..."
|
||||||
|
SWARM_ID=$(http \
|
||||||
|
--check-status \
|
||||||
|
--ignore-stdin \
|
||||||
|
--verify=$HTTPIE_VERIFY_SSL \
|
||||||
|
"$PORTAINER_URL/api/endpoints/$PORTAINER_ENDPOINT/docker/info" \
|
||||||
|
"Authorization: Bearer $AUTH_TOKEN")
|
||||||
|
check_for_errors $? "$SWARM_ID"
|
||||||
|
SWARM_ID=$(echo $SWARM_ID | jq -r ".Swarm.Cluster.ID // empty")
|
||||||
|
|
||||||
|
echo "Creating stack $STACK_NAME..."
|
||||||
|
if [ -z "$SWARM_ID" ];then
|
||||||
|
DATA_PREFIX="{\"Name\":\"$STACK_NAME\",\"StackFileContent\":\""
|
||||||
|
DATA_SUFFIX="\"}"
|
||||||
|
echo "$DATA_PREFIX$STACK_YAML_CONTENT$DATA_SUFFIX" > json.tmp
|
||||||
|
|
||||||
|
CREATE=$(http \
|
||||||
|
--check-status \
|
||||||
|
--ignore-stdin \
|
||||||
|
--verify=$HTTPIE_VERIFY_SSL \
|
||||||
|
--timeout=300 \
|
||||||
|
"$PORTAINER_URL/api/stacks" \
|
||||||
|
"Authorization: Bearer $AUTH_TOKEN" \
|
||||||
|
type==2 \
|
||||||
|
method==string \
|
||||||
|
endpointId==$PORTAINER_ENDPOINT \
|
||||||
|
@json.tmp)
|
||||||
|
else
|
||||||
|
DATA_PREFIX="{\"Name\":\"$STACK_NAME\",\"SwarmID\":\"$SWARM_ID\",\"StackFileContent\":\""
|
||||||
|
DATA_SUFFIX="\"}"
|
||||||
|
echo "$DATA_PREFIX$STACK_YAML_CONTENT$DATA_SUFFIX" > json.tmp
|
||||||
|
|
||||||
|
CREATE=$(http \
|
||||||
|
--check-status \
|
||||||
|
--ignore-stdin \
|
||||||
|
--verify=$HTTPIE_VERIFY_SSL \
|
||||||
|
--timeout=300 \
|
||||||
|
"$PORTAINER_URL/api/stacks" \
|
||||||
|
"Authorization: Bearer $AUTH_TOKEN" \
|
||||||
|
type==1 \
|
||||||
|
method==string \
|
||||||
|
endpointId==$PORTAINER_ENDPOINT \
|
||||||
|
@json.tmp)
|
||||||
|
fi
|
||||||
|
check_for_errors $? "$CREATE"
|
||||||
|
|
||||||
|
rm json.tmp
|
||||||
|
else
|
||||||
|
echo "Result: Stack $STACK_NAME found."
|
||||||
|
|
||||||
|
STACK_ID="$(echo "$STACK" | jq -j ".Id")"
|
||||||
|
STACK_ENV_VARS="$(echo -n "$STACK"| jq ".Env" -jc)"
|
||||||
|
DATA_PREFIX="{\"Id\":\"$STACK_ID\",\"StackFileContent\":\""
|
||||||
|
DATA_SUFFIX="\",\"Env\":"$STACK_ENV_VARS",\"Prune\":$PORTAINER_PRUNE}"
|
||||||
|
echo "$DATA_PREFIX$STACK_YAML_CONTENT$DATA_SUFFIX" > json.tmp
|
||||||
|
|
||||||
|
echo "Updating stack $STACK_NAME..."
|
||||||
|
UPDATE=$(http \
|
||||||
|
--check-status \
|
||||||
|
--ignore-stdin \
|
||||||
|
--verify=$HTTPIE_VERIFY_SSL \
|
||||||
|
--timeout=300 \
|
||||||
|
PUT "$PORTAINER_URL/api/stacks/$STACK_ID" \
|
||||||
|
"Authorization: Bearer $AUTH_TOKEN" \
|
||||||
|
endpointId==$PORTAINER_ENDPOINT \
|
||||||
|
@json.tmp)
|
||||||
|
check_for_errors $? "$UPDATE"
|
||||||
|
|
||||||
|
rm json.tmp
|
||||||
|
fi
|
||||||
|
echo "Done"
|
||||||
|
}
|
||||||
|
|
||||||
|
undeploy () {
|
||||||
|
if [ -z "$STACK" ]; then
|
||||||
|
echo "Result: Stack $STACK_NAME not found."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Result: Stack $STACK_NAME found."
|
||||||
|
|
||||||
|
STACK_ID="$(echo "$STACK" | jq -j ".Id")"
|
||||||
|
|
||||||
|
echo "Deleting stack $STACK_NAME..."
|
||||||
|
DELETE=$(http \
|
||||||
|
--ignore-stdin \
|
||||||
|
--verify=$HTTPIE_VERIFY_SSL \
|
||||||
|
DELETE "$PORTAINER_URL/api/stacks/$STACK_ID" \
|
||||||
|
"Authorization: Bearer $AUTH_TOKEN")
|
||||||
|
check_for_errors $? "$DELETE"
|
||||||
|
echo "Done"
|
||||||
|
}
|
||||||
|
|
||||||
# Set arguments through envvars
|
# Set arguments through envvars
|
||||||
|
ACTION=${ACTION}
|
||||||
PORTAINER_USER=${PORTAINER_USER}
|
PORTAINER_USER=${PORTAINER_USER}
|
||||||
PORTAINER_PASSWORD=${PORTAINER_PASSWORD}
|
PORTAINER_PASSWORD=${PORTAINER_PASSWORD}
|
||||||
PORTAINER_URL=${PORTAINER_URL}
|
PORTAINER_URL=${PORTAINER_URL}
|
||||||
@ -53,8 +163,9 @@ PORTAINER_PRUNE=${PORTAINER_PRUNE:-"false"}
|
|||||||
HTTPIE_VERIFY_SSL=${HTTPIE_VERIFY_SSL:-"yes"}
|
HTTPIE_VERIFY_SSL=${HTTPIE_VERIFY_SSL:-"yes"}
|
||||||
|
|
||||||
# Set arguments through flags
|
# Set arguments through flags
|
||||||
while getopts u:p:l:n:c:e:rs option; do
|
while getopts a:u:p:l:n:c:e:rs option; do
|
||||||
case "${option}" in
|
case "${option}" in
|
||||||
|
a) ACTION=${OPTARG} ;;
|
||||||
u) PORTAINER_USER=${OPTARG} ;;
|
u) PORTAINER_USER=${OPTARG} ;;
|
||||||
p) PORTAINER_PASSWORD=${OPTARG} ;;
|
p) PORTAINER_PASSWORD=${OPTARG} ;;
|
||||||
l) PORTAINER_URL=${OPTARG} ;;
|
l) PORTAINER_URL=${OPTARG} ;;
|
||||||
@ -67,25 +178,13 @@ while getopts u:p:l:n:c:e:rs option; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
# Check required arguments have been provided
|
# Check required arguments have been provided
|
||||||
|
check_argument "$ACTION" "action" "ACTION" "a"
|
||||||
check_argument "$PORTAINER_USER" "portainer user" "PORTAINER_USER" "u"
|
check_argument "$PORTAINER_USER" "portainer user" "PORTAINER_USER" "u"
|
||||||
check_argument "$PORTAINER_PASSWORD" "portainer password" "PORTAINER_PASSWORD" "p"
|
check_argument "$PORTAINER_PASSWORD" "portainer password" "PORTAINER_PASSWORD" "p"
|
||||||
check_argument "$PORTAINER_URL" "portainer url" "PORTAINER_URL" "l"
|
check_argument "$PORTAINER_URL" "portainer url" "PORTAINER_URL" "l"
|
||||||
check_argument "$PORTAINER_STACK_NAME" "portainer stack name" "PORTAINER_STACK_NAME" "n"
|
check_argument "$PORTAINER_STACK_NAME" "portainer stack name" "PORTAINER_STACK_NAME" "n"
|
||||||
check_argument "$DOCKER_COMPOSE_FILE" "docker compose file" "DOCKER_COMPOSE_FILE" "c"
|
|
||||||
|
|
||||||
STACK_NAME=$PORTAINER_STACK_NAME
|
STACK_NAME=$PORTAINER_STACK_NAME
|
||||||
STACK_YAML_PATH=$DOCKER_COMPOSE_FILE
|
|
||||||
|
|
||||||
STACK_YAML_CONTENT=$(cat "$STACK_YAML_PATH")
|
|
||||||
|
|
||||||
# Escape carriage returns
|
|
||||||
STACK_YAML_CONTENT="${STACK_YAML_CONTENT//$'\r'/''}"
|
|
||||||
|
|
||||||
# Escape double quotes
|
|
||||||
STACK_YAML_CONTENT="${STACK_YAML_CONTENT//$'"'/'\"'}"
|
|
||||||
|
|
||||||
# Escape newlines
|
|
||||||
STACK_YAML_CONTENT="${STACK_YAML_CONTENT//$'\n'/'\n'}"
|
|
||||||
|
|
||||||
echo "Getting auth token..."
|
echo "Getting auth token..."
|
||||||
AUTH_TOKEN=$(http \
|
AUTH_TOKEN=$(http \
|
||||||
@ -111,77 +210,16 @@ check_for_errors $? "$STACKS"
|
|||||||
STACK=$(echo "$STACKS" \
|
STACK=$(echo "$STACKS" \
|
||||||
| jq --arg STACK_NAME "$STACK_NAME" -jc '.[] | select(.Name == $STACK_NAME)')
|
| jq --arg STACK_NAME "$STACK_NAME" -jc '.[] | select(.Name == $STACK_NAME)')
|
||||||
|
|
||||||
if [ -z "$STACK" ]; then
|
if [ $ACTION == "deploy" ]; then
|
||||||
echo "Result: Stack $STACK_NAME not found."
|
check_argument "$DOCKER_COMPOSE_FILE" "docker compose file" "DOCKER_COMPOSE_FILE" "c"
|
||||||
|
deploy
|
||||||
echo "Getting swarm cluster (if any)..."
|
exit 0
|
||||||
SWARM_ID=$(http \
|
|
||||||
--check-status \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
"$PORTAINER_URL/api/endpoints/$PORTAINER_ENDPOINT/docker/info" \
|
|
||||||
"Authorization: Bearer $AUTH_TOKEN")
|
|
||||||
check_for_errors $? "$SWARM_ID"
|
|
||||||
SWARM_ID=$(echo $SWARM_ID | jq -r ".Swarm.Cluster.ID // empty")
|
|
||||||
|
|
||||||
echo "Creating stack $STACK_NAME..."
|
|
||||||
if [ -z "$SWARM_ID" ];then
|
|
||||||
DATA_PREFIX="{\"Name\":\"$STACK_NAME\",\"StackFileContent\":\""
|
|
||||||
DATA_SUFFIX="\"}"
|
|
||||||
echo "$DATA_PREFIX$STACK_YAML_CONTENT$DATA_SUFFIX" > json.tmp
|
|
||||||
|
|
||||||
CREATE=$(http \
|
|
||||||
--check-status \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
--timeout=300 \
|
|
||||||
"$PORTAINER_URL/api/stacks" \
|
|
||||||
"Authorization: Bearer $AUTH_TOKEN" \
|
|
||||||
type==2 \
|
|
||||||
method==string \
|
|
||||||
endpointId==$PORTAINER_ENDPOINT \
|
|
||||||
@json.tmp)
|
|
||||||
else
|
|
||||||
DATA_PREFIX="{\"Name\":\"$STACK_NAME\",\"SwarmID\":\"$SWARM_ID\",\"StackFileContent\":\""
|
|
||||||
DATA_SUFFIX="\"}"
|
|
||||||
echo "$DATA_PREFIX$STACK_YAML_CONTENT$DATA_SUFFIX" > json.tmp
|
|
||||||
|
|
||||||
CREATE=$(http \
|
|
||||||
--check-status \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
--timeout=300 \
|
|
||||||
"$PORTAINER_URL/api/stacks" \
|
|
||||||
"Authorization: Bearer $AUTH_TOKEN" \
|
|
||||||
type==1 \
|
|
||||||
method==string \
|
|
||||||
endpointId==$PORTAINER_ENDPOINT \
|
|
||||||
@json.tmp)
|
|
||||||
fi
|
|
||||||
check_for_errors $? "$CREATE"
|
|
||||||
|
|
||||||
rm json.tmp
|
|
||||||
else
|
|
||||||
echo "Result: Stack $STACK_NAME found."
|
|
||||||
|
|
||||||
STACK_ID="$(echo "$STACK" | jq -j ".Id")"
|
|
||||||
STACK_ENV_VARS="$(echo -n "$STACK"| jq ".Env" -jc)"
|
|
||||||
DATA_PREFIX="{\"Id\":\"$STACK_ID\",\"StackFileContent\":\""
|
|
||||||
DATA_SUFFIX="\",\"Env\":"$STACK_ENV_VARS",\"Prune\":$PORTAINER_PRUNE}"
|
|
||||||
echo "$DATA_PREFIX$STACK_YAML_CONTENT$DATA_SUFFIX" > json.tmp
|
|
||||||
|
|
||||||
echo "Updating stack $STACK_NAME..."
|
|
||||||
UPDATE=$(http \
|
|
||||||
--check-status \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
--timeout=300 \
|
|
||||||
PUT "$PORTAINER_URL/api/stacks/$STACK_ID" \
|
|
||||||
"Authorization: Bearer $AUTH_TOKEN" \
|
|
||||||
endpointId==$PORTAINER_ENDPOINT \
|
|
||||||
@json.tmp)
|
|
||||||
check_for_errors $? "$UPDATE"
|
|
||||||
|
|
||||||
rm json.tmp
|
|
||||||
fi
|
fi
|
||||||
echo "Done"
|
|
||||||
|
if [ $ACTION == "undeploy" ]; then
|
||||||
|
undeploy
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Error: Unknown action \"$ACTION\"."
|
||||||
|
exit 1
|
85
undeploy
85
undeploy
@ -1,85 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# Checks for error exit codes from httpie #
|
|
||||||
# Arguments: #
|
|
||||||
# $1 Httpie exit code #
|
|
||||||
# $2 Response returned by Portainer API #
|
|
||||||
###########################################
|
|
||||||
check_for_errors () {
|
|
||||||
local exit_code=$1
|
|
||||||
local response=$2
|
|
||||||
if [ $exit_code -ne 0 ]; then
|
|
||||||
case $exit_code in
|
|
||||||
2) echo 'Request timed out!' ;;
|
|
||||||
3) echo 'Unexpected HTTP 3xx Redirection!' ;;
|
|
||||||
4) echo 'HTTP 4xx Client Error!' && echo $response ;;
|
|
||||||
5) echo 'HTTP 5xx Server Error!' && echo $response ;;
|
|
||||||
6) echo 'Exceeded --max-redirects=<n> redirects!' ;;
|
|
||||||
*) echo 'Unholy Error!' ;;
|
|
||||||
esac
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
PORTAINER_USER=${PORTAINER_USER:-"user"}
|
|
||||||
PORTAINER_PASSWORD=${PORTAINER_PASSWORD:-"password"}
|
|
||||||
PORTAINER_URL=${PORTAINER_URL:-"https://portainer.example.com"}
|
|
||||||
PORTAINER_PRUNE=${PORTAINER_PRUNE:-"false"}
|
|
||||||
PORTAINER_ENDPOINT=${PORTAINER_ENDPOINT:-"1"}
|
|
||||||
HTTPIE_VERIFY_SSL=${HTTPIE_VERIFY_SSL:-"yes"}
|
|
||||||
|
|
||||||
if [ -z ${1+x} ]; then
|
|
||||||
echo "Error: Parameter #1 missing (stack name)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
STACK_NAME="$1"
|
|
||||||
|
|
||||||
echo "Getting auth token..."
|
|
||||||
AUTH_TOKEN=$(http \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
$PORTAINER_URL/api/auth \
|
|
||||||
username=$PORTAINER_USER \
|
|
||||||
password=$PORTAINER_PASSWORD \
|
|
||||||
| jq -r .jwt)
|
|
||||||
|
|
||||||
AUTH_TOKEN=$(http \
|
|
||||||
--check-status \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
$PORTAINER_URL/api/auth \
|
|
||||||
username=$PORTAINER_USER \
|
|
||||||
password=$PORTAINER_PASSWORD)
|
|
||||||
check_for_errors $? "$AUTH_TOKEN"
|
|
||||||
AUTH_TOKEN=$(echo $AUTH_TOKEN | jq -r .jwt)
|
|
||||||
echo "Done"
|
|
||||||
|
|
||||||
echo "Getting stack $STACK_NAME..."
|
|
||||||
STACKS=$(http \
|
|
||||||
--check-status \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
"$PORTAINER_URL/api/stacks" \
|
|
||||||
"Authorization: Bearer $AUTH_TOKEN")
|
|
||||||
check_for_errors $? "$STACKS"
|
|
||||||
|
|
||||||
STACK=$(echo "$STACKS" \
|
|
||||||
| jq --arg STACK_NAME "$STACK_NAME" -jc '.[] | select(.Name == $STACK_NAME)')
|
|
||||||
|
|
||||||
if [ -z "$STACK" ]; then
|
|
||||||
echo "Result: Stack $STACK_NAME not found."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Result: Stack $STACK_NAME found."
|
|
||||||
|
|
||||||
STACK_ID="$(echo "$STACK" | jq -j ".Id")"
|
|
||||||
|
|
||||||
echo "Deleting stack $STACK_NAME..."
|
|
||||||
DELETE=$(http \
|
|
||||||
--ignore-stdin \
|
|
||||||
--verify=$HTTPIE_VERIFY_SSL \
|
|
||||||
DELETE "$PORTAINER_URL/api/stacks/$STACK_ID" \
|
|
||||||
"Authorization: Bearer $AUTH_TOKEN")
|
|
||||||
check_for_errors $? "$DELETE"
|
|
||||||
echo "Done"
|
|
Reference in New Issue
Block a user