From 02880b82ee1ab651b7b377e4b66b8f2366f5dd67 Mon Sep 17 00:00:00 2001 From: Justin Scott Date: Thu, 24 Oct 2019 15:56:28 -0700 Subject: [PATCH] Add update_checker.sh (#238) This adds a script that parses create_stack for component versions and URLs and compares them to the latest versions available. Signed-off-by: Justin Scott --- clr-k8s-examples/hack/update_checker.sh | 166 ++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100755 clr-k8s-examples/hack/update_checker.sh diff --git a/clr-k8s-examples/hack/update_checker.sh b/clr-k8s-examples/hack/update_checker.sh new file mode 100755 index 0000000..29fab52 --- /dev/null +++ b/clr-k8s-examples/hack/update_checker.sh @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +### +# update_checker.sh +# Parses create_stack.sh for urls and versions +# Curls urls for latest version and reports the comparison +## + +# first argument is path to create_stach.sh +COMPONENT_FILE="${1:-$create_stack.sh}" +# set CLRK8S_DEBUG=1 for debug output +DEBUG=${CLRK8S_DEBUG:-0} +# set CLRK8S_NO_COLOR=1 for no colors +NO_COLOR=${CLRK8S_NO_COLOR:-""} +# set CLRK8S_ALL=1 for all results, not just changed +ALL=${CLRK8S_ALL:-""} +# add components to skip (not check) +# - canal doesn't use git repo tags for revisions +declare -a COMPONENT_SKIP=( CANAL ) + +# internal vars +declare -A COMPONENT_VER +declare -A COMPONENT_URL +LATEST_URL="" + +# usage prints help and exit +function usage(){ + echo "Compare default component versions to latest release" + echo "usage: update_checker.sh " + exit 0 +} +# log echoes to stdout +function log(){ + echo "$1" +} +# debug echoes to stdout if debug is enabled +function debug(){ + if [[ "${DEBUG}" -ne 0 ]]; then + echo "$1" + fi +} +# extract_component_data scans file for component versions and urls and add them to maps +function extract_component_data(){ + file=${1:-$COMPONENT_FILE} + name="" + version="" + url="" + while read -r line + do + # versions + if [[ $line =~ "_VER=" ]]; then + debug "Found component version $line" + name=${line%%_*} + if [[ "$COMPONENT_SKIP" =~ (^|[[:space:]])"$name"($|[[:space:]]) ]]; then + debug "Skipping component $name" + continue + fi + versions=${line#*=} + if [[ $versions =~ ":-" ]]; then + version=${line#*:-} + fi + # cleanup value + version=${version%\}} + version=${version%\}\"} + if [[ -n "$name" && ${COMPONENT_VER[$name]} == "" ]]; then + debug "Adding component $name=$version to COMPONENT_VER" + COMPONENT_VER[$name]=$version + fi + fi + + # urls + if [[ $line =~ "_URL=" ]]; then + debug "Found component URL $line" + name=${line%%_*} + if [[ $COMPONENT_SKIP =~ (^|[[:space:]])"$name"($|[[:space:]]) ]]; then + debug "Skipping component $name" + continue + fi + urls=${line#*=} + + if [[ $urls =~ ":-" ]]; then + urls=${line#*:-} + fi + # cleanup value + url=${urls%\"} + url=${url#\"} + if [[ -n "$name" && ${COMPONENT_URL[$name]} == "" ]]; then + debug "Adding component $name=$url to COMPONENT_URL" + COMPONENT_URL[$name]=$url + fi + fi + + done < $file + +} +# resolve_latest_url extracts the real release/latest url from a repo url +function resolve_latest_url(){ + repo=$1 + url=${repo%.git*}/releases/latest + LATEST_URL=$(curl -Ls -o /dev/null -w %{url_effective} $url) + if [[ "$?" -gt 0 ]]; then + echo "curl error, exiting." + exit 1 + fi +} +# function_exists checks if a function exists +function function_exists() { + declare -f -F "$1" > /dev/null + return $? +} +function report(){ + if [[ -z $NO_COLOR ]]; then + BOLD="\e[1m\e[33m" + BOLD_OFF="\e[0m" + fi + mode="changed" + out="" + if [[ -n "$1" ]]; then + mode="all" + fi + out+="\n" + out+="Components ($mode)\n" + out+="--------------------------\n" + echo -e $out + out="NAME CURRENT LATEST\n" + # loop thru each url, get latest version and report + for k in "${!COMPONENT_URL[@]}"; + do + name=$k + resolve_latest_url "${COMPONENT_URL[$k]}" + latest_url="$LATEST_URL" + latest_ver="${latest_url#*tag/}" + current_ver="${COMPONENT_VER[$name]}" + if [[ "${current_ver}" != "${latest_ver}" ]]; then + out+="$name $current_ver $BOLD $latest_ver $BOLD_OFF\n"; + fi + if [[ "${current_ver}" == "${latest_ver}" && -n $ALL ]]; then + out+="$name $current_ver $latest_ver\n"; + fi + done; + echo -e "${out}" | column -t + if [[ "${#COMPONENT_SKIP[@]}" -gt 0 ]]; then + echo "---" + echo "WARNING: Skipped comparisions for the following components:" + for s in "${!COMPONENT_SKIP[@]}" + do + echo "${COMPONENT_SKIP[$s]}" + done + fi +} +### +# Main +## + +# print help if no args +if [[ "$#" -eq 0 ]]; then + usage +fi + +# get the versions +extract_component_data "$1" +# output +report "${ALL}" + + +