From 400be8581e7d61addd5b3b2295efeba8a24d6e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Theilgaard?= Date: Wed, 25 Aug 2021 10:54:03 +0200 Subject: [PATCH] `checkLabels.sh` script MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With a bit of improvements to explaining that labels are small case letters with numbers, “_”, and “-”. And nothing else. --- CheckLabels.sh | 221 ++++++++++++++++++++++++++++++++++++ README.md | 4 +- utils/buildCaseStatement.sh | 9 +- 3 files changed, 229 insertions(+), 5 deletions(-) create mode 100755 CheckLabels.sh diff --git a/CheckLabels.sh b/CheckLabels.sh new file mode 100755 index 0000000..fde5da3 --- /dev/null +++ b/CheckLabels.sh @@ -0,0 +1,221 @@ +#!/bin/zsh + +# Check Installomator labels from fragments +# 2020 Søren Theilgaard (@theilgaard) + +# This script will test labels and check if download link is active, and if version is defined. +# If labels are written to the script only those will be tested. +# If none are provided, it will test all labels. + +# Labels should be named in small caps, numbers 0-9, “-”, and “_”. No other characters allowed. + +# To check this script use these labels: +# desktoppr dbeaverce brave microsoftteams whatsapp citrixworkspace aircall devonthink + + +# MARK: Constants +SELF=$(basename $0) +SELFLOCATION=$(dirname $0) +pathToLabels="fragments/labels" + +#echo "Script: $SELFLOCATION/$SELF\n" + +# MARK: check minimal macOS requirement +if [[ $(sw_vers -buildVersion ) < "18" ]]; then + echo "Installomator requires at least macOS 10.14 Mojave." + exit 98 +fi + + +# MARK: Functions + +printlog(){ + echo "$1" +} + +runAsUser() { + if [[ $currentUser != "loginwindow" ]]; then + uid=$(id -u "$currentUser") + launchctl asuser $uid sudo -u $currentUser "$@" + fi +} + +# will get the latest release download from a github repo +downloadURLFromGit() { # $1 git user name, $2 git repo name + gitusername=${1?:"no git user name"} + gitreponame=${2?:"no git repo name"} + + #githubPart="$gitusername/$gitreponame/releases/download" + #echo "$githubPart" + downloadURL="https://github.com/$gitusername/$gitreponame/releases/latest" + echo "$downloadURL" + return 0 +} + +versionFromGit() { # $1 git user name, $2 git repo name + gitusername=${1?:"no git user name"} + gitreponame=${2?:"no git repo name"} + + appNewVersion=$(curl --silent --fail "https://github.com/$gitusername/$gitreponame/releases/latest" | sed -E 's/.*tag\/(.*)\">.*/\1/g' | sed 's/[^0-9\.]//g') + if [ -z "$appNewVersion" ]; then + printlog "could not retrieve version number for $gitusername/$gitreponame: $appNewVersion" + exit 9 + else + echo "$appNewVersion" + return 0 + fi +} + + +# Handling of differences in xpath between Catalina and Big Sur +xpath() { + # the xpath tool changes in Big Sur and now requires the `-e` option + if [[ $(sw_vers -buildVersion) > "20A" ]]; then + /usr/bin/xpath -e $@ + else + /usr/bin/xpath $@ + fi +} + +# Handling architecture, so I can verify both architectures +arch () { + echo $fixedArch +} + + +# MARK: Script +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[1;34m' +NC='\033[0m' # No Color + +# Labels with the $(arch) call for different versions for Intel and Apple Silicon should be listed here: +archLabels=( $(grep "$(arch)" "${pathToLabels}"/* | awk '{print $1}' | sed -E 's/.*\/([a-z0-9\_-]*)\..*/\1/g'| uniq ) ) +echo "${BLUE}Labels with \"\$(arch)\" call:${NC}\n${archLabels}\n" + +if [[ $# -eq 0 ]]; then + allLabels=( $(ls "${pathToLabels}"/*.sh | sed -E 's/.*\/([a-z0-9\_-]*)\..*/\1/g') ) +else + allLabels=( ${=@} ) +fi +echo "${BLUE}Total labels:${NC}\n${allLabels}\n" + +secondRoundLabels="" # variable for labels with $(arch) call in them +countWarning=0 +countError=0 +for fixedArch in i386 arm64; do +echo "${BLUE}Architecture: $fixedArch${NC}" +echo + +# Go through all labels +for label in $allLabels; do + echo "########## $label" + labelWarning=0; labelError=0; expectedExtension=""; URLextension="" + name=""; type=""; downloadURL=""; appNewVersion=""; expectedTeamID=""; blockingProcesses=""; updateTool=""; updateToolArguments=""; archiveName="" + + #caseLabel + cat "${pathToLabels}/${label}.sh" | grep -v -E '^[a-z0-9\_-]*(\)|\|\\)$' | grep -v ";;" > checkLabelCurrent.sh + source checkLabelCurrent.sh + + echo "Name: $name" + echo "Download URL: $downloadURL" + echo "Type: $type" + case $type in + dmg|pkg|zip|tbz) + expectedExtension="$type" + ;; + pkgInDmg) + expectedExtension="dmg" + ;; + *InZip) + expectedExtension="zip" + ;; + *) + echo "Cannot handle type $type" + ;; + esac + if [[ "$appNewVersion" == "" ]] ; then + echo "No appNewVersion!" + else + if [[ $( echo "$appNewVersion" | grep -i "[0-9.]" ) == "" || $appNewVersion == "" ]]; then + echo "${RED}-> !! ERROR in appNewVersion${NC}" + labelError=1 + else + if [[ $appNewVersion != $( echo "$appNewVersion" | sed -E 's/[^0-9]*([0-9.]*)[^0-9]*/\1/g' ) ]]; then + echo "${YELLOW}Warning: Version contain not only numbers and dots.${NC}" + labelWarning=1 + fi + echo "Version: $appNewVersion" ; + fi + fi + if curl -sfL --output /dev/null -r 0-0 "$downloadURL" ; then + echo "${GREEN}OK: downloadURL works OK${NC}" + if [[ $(echo "$downloadURL" | sed -E 's/.*\.([a-zA-Z]*)\s*/\1/g' ) == "${expectedExtension}" ]]; then + echo "${GREEN}OK: download extension MATCH on ${expectedExtension}${NC}" + else + if [[ $(echo "$downloadURL" | grep -io "github.com") != "github.com" ]]; then + URLheader=$( curl -fsIL "$downloadURL" ) + if [[ "${URLheader}" != "" ]]; then + URLlocation=$( echo "${URLheader}" | grep -i "^location" ) + URLfilename=$( echo "${URLheader}" | grep -i "filename=" ) + if [[ "${URLlocation}" != "" ]]; then + URLextension=$( echo "${URLlocation}" | tail -1 | sed -E 's/.*\.([a-zA-Z]*)\s*/\1/g' | tr -d '\r\n' ) + else + URLextension=$( echo "${URLfilename}" | tail -1 | sed -E 's/.*\.([a-zA-Z]*)\s*/\1/g' | tr -d '\r\n' ) + fi + URLextension=${URLextension:l} + if [[ "${URLextension}" == "${expectedExtension}" ]]; then + echo "${GREEN}OK: download extension MATCH on ${URLextension}${NC}" + else + echo "${RED}-> !! ERROR in download extension, expected ${expectedExtension}, but got ${URLextension}.${NC}" + labelError=1 + fi + else + echo "no header provided from server." + fi + else + githubPart="$(echo "$downloadURL" | cut -d "/" -f4-6)" + if [[ "$(curl -fsL "$downloadURL" | grep -io "${githubPart}.*\.${expectedExtension}")" != "" ]]; then + echo "${GREEN}OK: download extension MATCH on ${expectedExtension}${NC}" + else + echo "${RED}-> !! ERROR in download extension, expected ${expectedExtension}, but it was wrong${NC}" + labelError=1 + fi + fi + fi + else + echo "${RED}-> !! ERROR in downloadURL${NC}" + labelError=1 + fi + if [[ $labelWarning != 0 ]]; then; echo "${YELLOW}########## Warning in label: $label${NC}"; ((countWarning++)); fi + if [[ $labelError != 0 ]]; then; echo "${RED}########## ERROR in label: $label${NC}"; ((countError++)); fi + + if (($archLabels[(Ie)$label])); then + secondRoundLabels+=( "$label" ) + fi + + echo +done +allLabels=( ${=secondRoundLabels} ) +archLabels=() +echo +done + +rm checkLabelCurrent.sh + +#${SELFLOCATION}/Installomator.sh version +#echo + +if [[ countWarning > 0 ]]; then + echo "${YELLOW}Warnings counted: $countWarning${NC}" +else + echo "${GREEN}No warnings detected!${NC}" +fi +if [[ countError > 0 ]]; then + echo "${RED}ERRORS counted: $countError${NC}" +else + echo "${GREEN}No errors detected!${NC}" +fi + +echo "Done!" diff --git a/README.md b/README.md index 98ac02b..8bb2b17 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,9 @@ googlechrome) When you know how to extract these pieces of information from the application and/or download, then you can add an application to Installomator. -The script buildCaseStatement.sh can help with the label creation. +The script `buildCaseStatement.sh` can help with the label creation. + +Please note: Labels should be named in small caps, numbers 0-9, “-”, and “_”. No other characters allowed. ### Not specific to a management system diff --git a/utils/buildCaseStatement.sh b/utils/buildCaseStatement.sh index 81943e0..9d18ef3 100755 --- a/utils/buildCaseStatement.sh +++ b/utils/buildCaseStatement.sh @@ -122,6 +122,7 @@ elif [ "$archiveExt" = "zip" ] || [ "$archiveExt" = "tbz" ]; then fi +echo "Labels should be named in small caps, numbers 0-9, “-”, and “_”. No other characters allowed." echo echo "appNewVersion is often difficult to find. Can sometimes be found in the filename, but also on a web page. See archivePath above if link contains information about this." echo @@ -140,9 +141,9 @@ fi echo " ;;" echo -#if [ -e "${tmpDir}" ]; then -# #echo "deleting tmp dir" -# rm -rf "${tmpDir}" -#fi +if [ -e "${tmpDir}" ]; then + #echo "deleting tmp dir" + rm -rf "${tmpDir}" +fi exit 0