From 03201e2f201420626c61a8d8890e7079c1e35ac6 Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Wed, 10 May 2017 13:07:56 +1000 Subject: [PATCH 1/5] Display FTL version & version.sh rewrite While testing to make sure `pihole -v` would output `pihole-FTL version`, I noticed some options didn't work how I expected them to. For example, if I use `pihole -v -p`, I would expect to see the version output of Pi-hole Core. Instead, I'm informed that it's an invalid option. I've had the following things in mind while rewriting this: * I'm operating under the assumption that FTL is only installed if the Admin Console is (Line 113 exit 0) * I have modified the help text to only output with `pihole -v --help` * I have modified all output to be more similar to the output style of `grep` and `curl` (Ditching ":::") Testing output: ``` w3k@MCT:~$ pihole -v Pi-hole version is v3.0.1-14-ga928cd3 (Latest: v3.0.1) Admin Console version is v3.0-9-g3760482 (Latest: v3.0.1) FTL version is v2.6.2 (Latest: v2.6.2) w3k@MCT:~$ pihole -v -c Current Pi-hole version is v3.0.1-14-ga928cd3 Current Admin Console version is v3.0-9-g3760482 Current FTL version is v2.6.2 w3k@MCT:~$ pihole -v -l Latest Pi-hole version is v3.0.1 Latest Admin Console version is v3.0.1 Latest FTL version is v2.6.2 w3k@MCT:~$ pihole -v -p --hash Current Pi-hole hash is a928cd3 w3k@MCT:~$ pihole -v -a --hash Current Admin Console hash is 3760482 w3k@MCT:~$ pihole -v --help Usage: pihole -v [REPO | OPTION] [OPTION] Show Pi-hole, Web Admin & FTL versions w3k@MCT:~$ pihole -v -foo Invalid Option! ``` --- advanced/Scripts/version.sh | 127 +++++++++++++++++++++--------------- 1 file changed, 74 insertions(+), 53 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 7f96e29a..289e4d93 100755 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -66,72 +66,93 @@ getRemoteVersion(){ return 0 } -#PHHASHLATEST=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/commits/master | \ -# grep sha | \ -# head -n1 | \ -# awk -F ' ' '{ print $2 }' | \ -# tr -cd '[[:alnum:]]._-') - -#WEBHASHLATEST=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/commits/master | \ -# grep sha | \ -# head -n1 | \ -# awk -F ' ' '{ print $2 }' | \ -# tr -cd '[[:alnum:]]._-') - - -normalOutput() { - echo "::: Pi-hole version is $(getLocalVersion "${PHGITDIR}") (Latest version is $(getRemoteVersion pi-hole))" - if [ -d "${WEBGITDIR}" ]; then - echo "::: Web-Admin version is $(getLocalVersion "${WEBGITDIR}") (Latest version is $(getRemoteVersion AdminLTE))" - fi +coreOutput() { + [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(getLocalVersion ${PHGITDIR})" + [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion pi-hole)" + [ "$1" = "--hash" ] && hash="$(getLocalHash ${PHGITDIR})" + + if [ -n "$current" -a -n "$latest" ]; then + str="Pi-hole version is $current (Latest: $latest)" + elif [ -n "$current" -a -z "$latest" ]; then + str="Current Pi-hole version is $current" + elif [ -z "$current" -a -n "$latest" ]; then + str="Latest Pi-hole version is $latest" + elif [ -n "$hash" ]; then + str="Current Pi-hole hash is $hash" + else + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 + fi + echo " $str" } webOutput() { - if [ -d "${WEBGITDIR}" ]; then - case "${1}" in - "-l" | "--latest" ) echo $(getRemoteVersion AdminLTE);; - "-c" | "--current" ) echo $(getLocalVersion "${WEBGITDIR}");; - "-h" | "--hash" ) echo $(getLocalHash "${WEBGITDIR}");; - * ) echo "::: Invalid Option!"; exit 1; - esac + [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(getLocalVersion ${WEBGITDIR})" + [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion AdminLTE)" + [ "$1" = "--hash" ] && hash="$(getLocalHash ${WEBGITDIR})" + [ ! -d "${WEBGITDIR}" ] && str="Web interface not installed!" + + if [ -n "$current" -a -n "$latest" ]; then + str="Admin Console version is $current (Latest: $latest)" + elif [ -n "$current" -a -z "$latest" ]; then + str="Current Admin Console version is $current" + elif [ -z "$current" -a -n "$latest" ]; then + str="Latest Admin Console version is $latest" + elif [ -n "$hash" ]; then + str="Current Admin Console hash is $hash" else - echo "::: Web interface not installed!"; exit 1; + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 fi + echo " $str" } -coreOutput() { - case "${1}" in - "-l" | "--latest" ) echo $(getRemoteVersion pi-hole);; - "-c" | "--current" ) echo $(getLocalVersion "${PHGITDIR}");; - "-h" | "--hash" ) echo $(getLocalHash "${PHGITDIR}");; - * ) echo "::: Invalid Option!"; exit 1; - esac +ftlOutput() { + [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(pihole-FTL version)" + [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion FTL)" + [ ! -d "${WEBGITDIR}" ] && exit 0 + + if [ -n "$current" -a -n "$latest" ]; then + str="FTL version is $current (Latest: $latest)" + elif [ -n "$current" -a -z "$latest" ]; then + str="Current FTL version is $current" + elif [ -z "$current" -a -n "$latest" ]; then + str="Latest FTL version is $latest" + else + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 + fi + echo " $str" +} + +defaultOutput() { + coreOutput "$1" + webOutput "$1" + ftlOutput "$1" } helpFunc() { - cat << EOM -::: -::: Show Pi-hole/Web Admin versions -::: -::: Usage: pihole -v [ -a | -p ] [ -l | -c ] -::: -::: Options: -::: -a, --admin Show both current and latest versions of web admin -::: -p, --pihole Show both current and latest versions of Pi-hole core files -::: -l, --latest (Only after -a | -p) Return only latest version -::: -c, --current (Only after -a | -p) Return only current version -::: -h, --help Show this help dialog -::: -EOM + echo "Usage: pihole -v [REPO | OPTION] [OPTION] +Show Pi-hole, Web Admin & FTL versions + +Repositories: + -a, --admin Show both current and latest versions of Web Admin + -f, --ftl Show both current and latest versions of FTL + -p, --pihole Show both current and latest versions of Pi-hole Core + +Options: + -c, --current (Only after -a | -p | -f) Return the current version + -l, --latest (Only after -a | -p | -f) Return the latest version + -h, --hash (Only after -a | -p) Return the current Github hash + --help Show this help dialog +" exit 0 } -if [[ $# = 0 ]]; then - normalOutput -fi - case "${1}" in "-a" | "--admin" ) shift; webOutput "$@";; - "-p" | "--pihole" ) shift; coreOutput "$@" ;; - "-h" | "--help" ) helpFunc;; + "-p" | "--pihole" ) shift; coreOutput "$@";; + "-f" | "--ftl" ) shift; ftlOutput "$@";; + "--help" ) helpFunc;; + * ) defaultOutput "$@";; esac From fe0a35cc7ab50f54f465b6571a3dcefa8f6f1472 Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Thu, 11 May 2017 08:30:49 +1000 Subject: [PATCH 2/5] Update -h to work as --hash Also provide error output as per https://github.com/pi-hole/pi-hole/pull/1447#issuecomment-300600093 --- advanced/Scripts/version.sh | 43 ++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 289e4d93..9b878c8e 100755 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -69,8 +69,9 @@ getRemoteVersion(){ coreOutput() { [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(getLocalVersion ${PHGITDIR})" [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion pi-hole)" - [ "$1" = "--hash" ] && hash="$(getLocalHash ${PHGITDIR})" - + [ "$1" = "-h" -o "$1" = "--hash" ] && hash="$(getLocalHash ${PHGITDIR})" + [ -n "$2" ] && error="true" + if [ -n "$current" -a -n "$latest" ]; then str="Pi-hole version is $current (Latest: $latest)" elif [ -n "$current" -a -z "$latest" ]; then @@ -80,17 +81,24 @@ coreOutput() { elif [ -n "$hash" ]; then str="Current Pi-hole hash is $hash" else - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 + error="true" fi + + if [ "$error" = "true" ]; then + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 + fi + echo " $str" } webOutput() { [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(getLocalVersion ${WEBGITDIR})" [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion AdminLTE)" - [ "$1" = "--hash" ] && hash="$(getLocalHash ${WEBGITDIR})" + [ "$1" = "-h" -o "$1" = "--hash" ] && hash="$(getLocalHash ${WEBGITDIR})" [ ! -d "${WEBGITDIR}" ] && str="Web interface not installed!" + [ -n "$2" ] && error="true" + if [ -n "$current" -a -n "$latest" ]; then str="Admin Console version is $current (Latest: $latest)" @@ -101,9 +109,14 @@ webOutput() { elif [ -n "$hash" ]; then str="Current Admin Console hash is $hash" else - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 + error="true" fi + + if [ "$error" = "true" ]; then + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 + fi + echo " $str" } @@ -111,6 +124,7 @@ ftlOutput() { [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(pihole-FTL version)" [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion FTL)" [ ! -d "${WEBGITDIR}" ] && exit 0 + [ -n "$2" ] && error="true" if [ -n "$current" -a -n "$latest" ]; then str="FTL version is $current (Latest: $latest)" @@ -119,16 +133,21 @@ ftlOutput() { elif [ -z "$current" -a -n "$latest" ]; then str="Latest FTL version is $latest" else - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 + error="true" fi + + if [ "$error" = "true" ]; then + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 + fi + echo " $str" } defaultOutput() { - coreOutput "$1" - webOutput "$1" - ftlOutput "$1" + coreOutput "$1" "$2" + webOutput "$1" "$2" + ftlOutput "$1" "$2" } helpFunc() { From 7fef1fdc831db0c3bafba4c53a888cc492c63c87 Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Thu, 11 May 2017 10:11:04 +1000 Subject: [PATCH 3/5] Fixed indentation --- advanced/Scripts/version.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 9b878c8e..62106342 100755 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -81,12 +81,12 @@ coreOutput() { elif [ -n "$hash" ]; then str="Current Pi-hole hash is $hash" else - error="true" + error="true" fi if [ "$error" = "true" ]; then - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 fi echo " $str" @@ -109,12 +109,12 @@ webOutput() { elif [ -n "$hash" ]; then str="Current Admin Console hash is $hash" else - error="true" + error="true" fi if [ "$error" = "true" ]; then - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 fi echo " $str" @@ -133,12 +133,12 @@ ftlOutput() { elif [ -z "$current" -a -n "$latest" ]; then str="Latest FTL version is $latest" else - error="true" + error="true" fi if [ "$error" = "true" ]; then - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 fi echo " $str" From 2863308090296a43ae69c7ecc4f1ef176b756090 Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Thu, 11 May 2017 13:34:58 +1000 Subject: [PATCH 4/5] Minimise string duplication & other minor changes Instead of duplicating output strings, rewrite core/web/ftlOutput() into one neat versionOutput(). --- advanced/Scripts/version.sh | 123 +++++++++++++----------------------- 1 file changed, 44 insertions(+), 79 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 62106342..8ab95367 100755 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -10,10 +10,16 @@ # Variables DEFAULT="-1" -PHGITDIR="/etc/.pihole/" +COREGITDIR="/etc/.pihole/" WEBGITDIR="/var/www/html/admin/" getLocalVersion() { + # FTL requires a different method + if [ "$1" == "FTL" ]; then + echo $(pihole-FTL version) + return 0 + fi + # Get the tagged version of the local repository local directory="${1}" local version @@ -33,6 +39,12 @@ getLocalVersion() { } getLocalHash() { + # FTL hash is not applicable + if [ "$1" == "FTL" ]; then + echo "N/A" + return 0 + fi + # Get the short hash of the local repository local directory="${1}" local hash @@ -66,88 +78,41 @@ getRemoteVersion(){ return 0 } -coreOutput() { - [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(getLocalVersion ${PHGITDIR})" - [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion pi-hole)" - [ "$1" = "-h" -o "$1" = "--hash" ] && hash="$(getLocalHash ${PHGITDIR})" - [ -n "$2" ] && error="true" - - if [ -n "$current" -a -n "$latest" ]; then - str="Pi-hole version is $current (Latest: $latest)" - elif [ -n "$current" -a -z "$latest" ]; then - str="Current Pi-hole version is $current" - elif [ -z "$current" -a -n "$latest" ]; then - str="Latest Pi-hole version is $latest" - elif [ -n "$hash" ]; then - str="Current Pi-hole hash is $hash" - else - error="true" - fi - - if [ "$error" = "true" ]; then - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 - fi - - echo " $str" -} - -webOutput() { - [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(getLocalVersion ${WEBGITDIR})" - [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion AdminLTE)" - [ "$1" = "-h" -o "$1" = "--hash" ] && hash="$(getLocalHash ${WEBGITDIR})" - [ ! -d "${WEBGITDIR}" ] && str="Web interface not installed!" - [ -n "$2" ] && error="true" - +versionOutput() { + [ "$1" == "pi-hole" ] && GITDIR=${COREGITDIR} + [ "$1" == "AdminLTE" ] && GITDIR=${WEBGITDIR} + [ "$1" == "FTL" ] && GITDIR="FTL" + [ "$2" == "-c" -o "$2" == "--current" -o -z "$2" ] && current=$(getLocalVersion $GITDIR) + [ "$2" == "-l" -o "$2" == "--latest" -o -z "$2" ] && latest=$(getRemoteVersion $1) + [ "$2" == "-h" -o "$2" == "--hash" ] && hash=$(getLocalHash $GITDIR) + if [ -n "$current" -a -n "$latest" ]; then - str="Admin Console version is $current (Latest: $latest)" + output="${1^} version is $current (Latest: $latest)" elif [ -n "$current" -a -z "$latest" ]; then - str="Current Admin Console version is $current" + output="Current ${1^} version is $current" elif [ -z "$current" -a -n "$latest" ]; then - str="Latest Admin Console version is $latest" + output="Latest ${1^} version is $latest" + elif [ "$hash" == "N/A" ]; then + output="" elif [ -n "$hash" ]; then - str="Current Admin Console hash is $hash" + output="Current ${1^} hash is $hash" else - error="true" + errorOutput fi - if [ "$error" = "true" ]; then - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 - fi - - echo " $str" + [ -n "$output" ] && echo " $output" } -ftlOutput() { - [ "$1" = "-c" -o "$1" = "--current" -o -z "$1" ] && current="$(pihole-FTL version)" - [ "$1" = "-l" -o "$1" = "--latest" -o -z "$1" ] && latest="$(getRemoteVersion FTL)" - [ ! -d "${WEBGITDIR}" ] && exit 0 - [ -n "$2" ] && error="true" - - if [ -n "$current" -a -n "$latest" ]; then - str="FTL version is $current (Latest: $latest)" - elif [ -n "$current" -a -z "$latest" ]; then - str="Current FTL version is $current" - elif [ -z "$current" -a -n "$latest" ]; then - str="Latest FTL version is $latest" - else - error="true" - fi - - if [ "$error" = "true" ]; then - echo " Invalid Option! Try 'pihole -v --help' for more information." - exit 1 - fi - - echo " $str" +errorOutput() { + echo " Invalid Option! Try 'pihole -v --help' for more information." + exit 1 } defaultOutput() { - coreOutput "$1" "$2" - webOutput "$1" "$2" - ftlOutput "$1" "$2" + versionOutput "pi-hole" "$@" + versionOutput "AdminLTE" "$@" + versionOutput "FTL" "$@" } helpFunc() { @@ -155,23 +120,23 @@ helpFunc() { Show Pi-hole, Web Admin & FTL versions Repositories: - -a, --admin Show both current and latest versions of Web Admin - -f, --ftl Show both current and latest versions of FTL - -p, --pihole Show both current and latest versions of Pi-hole Core + -p, --pihole Only retrieve info regarding Pi-hole repository + -a, --admin Only retrieve info regarding AdminLTE repository + -f, --ftl Only retrieve info regarding FTL repository Options: - -c, --current (Only after -a | -p | -f) Return the current version - -l, --latest (Only after -a | -p | -f) Return the latest version - -h, --hash (Only after -a | -p) Return the current Github hash + -c, --current Return the current version + -l, --latest Return the latest version + -h, --hash Return the Github hash from your local repositories --help Show this help dialog " exit 0 } case "${1}" in - "-a" | "--admin" ) shift; webOutput "$@";; - "-p" | "--pihole" ) shift; coreOutput "$@";; - "-f" | "--ftl" ) shift; ftlOutput "$@";; + "-p" | "--pihole" ) shift; versionOutput "pi-hole" "$@";; + "-a" | "--admin" ) shift; versionOutput "AdminLTE" "$@";; + "-f" | "--ftl" ) shift; versionOutput "FTL" "$@";; "--help" ) helpFunc;; * ) defaultOutput "$@";; esac From c6596f2c5481d5d266b0bb25db2e9b38dff9f6da Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Thu, 11 May 2017 14:19:13 +1000 Subject: [PATCH 5/5] Modified syntax to be valid for Shellcheck --- advanced/Scripts/version.sh | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 8ab95367..923d86d8 100755 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -16,7 +16,7 @@ WEBGITDIR="/var/www/html/admin/" getLocalVersion() { # FTL requires a different method if [ "$1" == "FTL" ]; then - echo $(pihole-FTL version) + pihole-FTL version return 0 fi @@ -25,8 +25,7 @@ getLocalVersion() { local version cd "${directory}" || { echo "${DEFAULT}"; return 1; } - version=$(git describe --tags --always || \ - echo "${DEFAULT}") + version=$(git describe --tags --always || echo "$DEFAULT") if [[ "${version}" =~ ^v ]]; then echo "${version}" elif [[ "${version}" == "${DEFAULT}" ]]; then @@ -50,8 +49,7 @@ getLocalHash() { local hash cd "${directory}" || { echo "${DEFAULT}"; return 1; } - hash=$(git rev-parse --short HEAD || \ - echo "${DEFAULT}") + hash=$(git rev-parse --short HEAD || echo "$DEFAULT") if [[ "${hash}" == "${DEFAULT}" ]]; then echo "ERROR" return 1 @@ -66,7 +64,7 @@ getRemoteVersion(){ local daemon="${1}" local version - version=$(curl --silent --fail https://api.github.com/repos/pi-hole/${daemon}/releases/latest | \ + version=$(curl --silent --fail "https://api.github.com/repos/pi-hole/${daemon}/releases/latest" | \ awk -F: '$1 ~/tag_name/ { print $2 }' | \ tr -cd '[[:alnum:]]._-') if [[ "${version}" =~ ^v ]]; then @@ -79,19 +77,19 @@ getRemoteVersion(){ } versionOutput() { - [ "$1" == "pi-hole" ] && GITDIR=${COREGITDIR} - [ "$1" == "AdminLTE" ] && GITDIR=${WEBGITDIR} + [ "$1" == "pi-hole" ] && GITDIR=$COREGITDIR + [ "$1" == "AdminLTE" ] && GITDIR=$WEBGITDIR [ "$1" == "FTL" ] && GITDIR="FTL" - [ "$2" == "-c" -o "$2" == "--current" -o -z "$2" ] && current=$(getLocalVersion $GITDIR) - [ "$2" == "-l" -o "$2" == "--latest" -o -z "$2" ] && latest=$(getRemoteVersion $1) - [ "$2" == "-h" -o "$2" == "--hash" ] && hash=$(getLocalHash $GITDIR) + [ "$2" == "-c" ] || [ "$2" == "--current" ] || [ -z "$2" ] && current=$(getLocalVersion $GITDIR) + [ "$2" == "-l" ] || [ "$2" == "--latest" ] || [ -z "$2" ] && latest=$(getRemoteVersion "$1") + [ "$2" == "-h" ] || [ "$2" == "--hash" ] && hash=$(getLocalHash "$GITDIR") - if [ -n "$current" -a -n "$latest" ]; then + if [ -n "$current" ] && [ -n "$latest" ]; then output="${1^} version is $current (Latest: $latest)" - elif [ -n "$current" -a -z "$latest" ]; then + elif [ -n "$current" ] && [ -z "$latest" ]; then output="Current ${1^} version is $current" - elif [ -z "$current" -a -n "$latest" ]; then + elif [ -z "$current" ] && [ -n "$latest" ]; then output="Latest ${1^} version is $latest" elif [ "$hash" == "N/A" ]; then output=""