134 lines
4.2 KiB
Bash
134 lines
4.2 KiB
Bash
|
#!/bin/bash
|
||
|
|
||
|
PROJECT_NAME=${1:?Project name missing}
|
||
|
shift
|
||
|
SERVICE_NAME=${1:?Service name missing}
|
||
|
shift
|
||
|
FILE_NAME=${1:?File name missing}
|
||
|
shift
|
||
|
VARIABLE_TYPE=${1:?Variable type missing (config or secret)}
|
||
|
shift
|
||
|
ITERATOR_TYPE=${1:?Iterator missing (version or hash)}
|
||
|
shift
|
||
|
|
||
|
case "$VARIABLE_TYPE" in
|
||
|
"config"|"secret")
|
||
|
;;
|
||
|
*)
|
||
|
echo "Invalid variable type"
|
||
|
exit 1
|
||
|
esac
|
||
|
|
||
|
LOCAL_FNAME=${PROJECT_NAME}/files/${SERVICE_NAME}/${FILE_NAME}
|
||
|
|
||
|
function get_variable {
|
||
|
# find latest
|
||
|
if [ "$ITERATOR_TYPE" = "version" ]; then
|
||
|
RETVAL=$(docker $VARIABLE_TYPE ls \
|
||
|
--filter label=org.sysdeploy.project=${PROJECT_NAME} \
|
||
|
--filter label=org.sysdeploy.service=${SERVICE_NAME} \
|
||
|
--filter label=org.sysdeploy.file=${FILE_NAME} \
|
||
|
--format '{{.Label "org.sysdeploy.version"}} {{.Name}}' \
|
||
|
| sort -rn | head -1)
|
||
|
ITERATOR=$(echo "$RETVAL" | cut -d\ -f1)
|
||
|
OBJECT_NAME=$(echo "$RETVAL" | cut -d\ -f2-)
|
||
|
elif [ "$ITERATOR_TYPE" = "hash" ]; then
|
||
|
if [ ! -f "$LOCAL_FNAME" ]; then
|
||
|
echo "Can't find $LOCAL_FNAME"
|
||
|
exit 1
|
||
|
fi
|
||
|
NEW_HASH=$(git log -n 1 --format='format:%H' -- "$LOCAL_FNAME")
|
||
|
ITERATOR="$NEW_HASH"
|
||
|
OBJECT_NAME=$(docker $VARIABLE_TYPE ls \
|
||
|
--filter label=org.sysdeploy.project=${PROJECT_NAME} \
|
||
|
--filter label=org.sysdeploy.service=${SERVICE_NAME} \
|
||
|
--filter label=org.sysdeploy.file=${FILE_NAME} \
|
||
|
--filter label=org.sysdeploy.hash=${ITERATOR} \
|
||
|
--format '{{.Name}}' \
|
||
|
| head -1)
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
function get_content {
|
||
|
local OBJECT_NAME="$1"
|
||
|
shift
|
||
|
docker config inspect "$OBJECT_NAME" |jq -r \
|
||
|
'.[0].Spec.Data'|base64 --decode
|
||
|
}
|
||
|
|
||
|
function set_variable {
|
||
|
NEW_NAME=$(uuidgen)
|
||
|
|
||
|
if [ "$ITERATOR_TYPE" = "version" ]; then
|
||
|
((ITERATOR++))
|
||
|
docker $VARIABLE_TYPE create \
|
||
|
--label=org.sysdeploy.project=${PROJECT_NAME} \
|
||
|
--label=org.sysdeploy.service=${SERVICE_NAME} \
|
||
|
--label=org.sysdeploy.file=${FILE_NAME} \
|
||
|
--label=org.sysdeploy.version=${ITERATOR} \
|
||
|
"$NEW_NAME" "$LOCAL_FNAME"
|
||
|
elif [ "$ITERATOR_TYPE" = "hash" ]; then
|
||
|
docker $VARIABLE_TYPE create \
|
||
|
--label=org.sysdeploy.project=${PROJECT_NAME} \
|
||
|
--label=org.sysdeploy.service=${SERVICE_NAME} \
|
||
|
--label=org.sysdeploy.file=${FILE_NAME} \
|
||
|
--label=org.sysdeploy.hash=${ITERATOR} \
|
||
|
"$NEW_NAME" "$LOCAL_FNAME"
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
get_variable
|
||
|
|
||
|
if [ -n "$OBJECT_NAME" ]; then
|
||
|
echo "Name: $OBJECT_NAME"
|
||
|
echo "Version/hash: $ITERATOR"
|
||
|
else
|
||
|
echo "Can't find any such $VARIABLE_TYPE"
|
||
|
fi
|
||
|
|
||
|
# set
|
||
|
if [ -n "$1" ]; then
|
||
|
set_variable
|
||
|
echo "New name: $NEW_NAME, $ITERATOR_TYPE: $ITERATOR"
|
||
|
fi
|
||
|
|
||
|
# docker config ls \
|
||
|
# --filter label=org.sysdeploy.file=/etc/collectd/collectd.conf.d/thresholds.conf \
|
||
|
# --format '{{.Label "org.sysdeploy.version"}} {{.ID}}'|sort -rn
|
||
|
|
||
|
# Create or rotate
|
||
|
#
|
||
|
# get current
|
||
|
# optional compare
|
||
|
# create a new one
|
||
|
# update references if needed
|
||
|
#
|
||
|
# create a config:
|
||
|
# docker config create \
|
||
|
# --label org.sysdeploy.project=monitoring \
|
||
|
# --label org.sysdeploy.file=/etc/collectd/collectd.conf.d/thresholds.conf \
|
||
|
# --label org.sysdeploy.service=collectd \
|
||
|
# --label org.sysdeploy.version=11 \
|
||
|
# $(uuidgen) thresholds.conf
|
||
|
#
|
||
|
# retrieving config label:
|
||
|
# docker config inspect \
|
||
|
# -f '{{index .Spec.Labels "org.sysdeploy.file"}}' \
|
||
|
# 6fe6qfmjjg606h138nxkbzjyw
|
||
|
#
|
||
|
# finding configs by label matching and reverse order by version
|
||
|
# docker config ls \
|
||
|
# --filter label=org.sysdeploy.file=/etc/collectd/collectd.conf.d/thresholds.conf \
|
||
|
# --format '{{.Label "org.sysdeploy.version"}} {{.ID}}'|sort -rn
|
||
|
#
|
||
|
# labels:
|
||
|
# org.sysdeploy.file = filename inside the container
|
||
|
# org.sysdeploy.version = if versioning incrementally, version is stored
|
||
|
# here
|
||
|
# org.sysdeploy.commit = if versioning by commit, commit is stored here
|
||
|
# org.sysdeploy.service = compose/stack service, not sure this is needed
|
||
|
# org.sysdeploy.project = $COMPOSE_PROJECT_NAME
|
||
|
#
|
||
|
# find the last commit a file was changed:
|
||
|
# git log -n 1 --format='format:%H' -- monitoring/docker-compose.yml
|