condense repetitive code into functions

This commit is contained in:
Jacob Salmela 2017-05-27 15:47:15 -05:00
parent d51e0c49b1
commit 2fea5d428d
No known key found for this signature in database
GPG key ID: 1962FF1A5046135E

View file

@ -1,4 +1,4 @@
#!/usr/bin/env bash
check_critical_program_versions#!/usr/bin/env bash
# Pi-hole: A black hole for Internet advertisements
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
@ -133,48 +133,57 @@ if_directory_exists() {
fi
}
# Checks the core version of the Pi-hole codebase
check_core_version() {
echo_current_diagnostic "Pi-hole versions"
compare_local_version_to_git_version() {
# The git directory to check
local git_dir="${1}"
# The named component of the project (Core or Web)
local pihole_component="${2}"
# If we are checking the Core versions,
if [[ "${pihole_component}" == "Core" ]]; then
# We need to search for "Pi-hole" when using pihole -v
local search_term="Pi-hole"
elif [[ "${pihole_component}" == "Web" ]]; then
local search_term="AdminLTE"
fi
# Display what we are checking
echo_current_diagnostic "${pihole_component} version"
# Store the error message in a variable in case we want to change and/or reuse it
local error_msg="git status failed"
# If the pihole git directory exists,
if_directory_exists "${PIHOLEGITDIR}" && \
if_directory_exists "${git_dir}" && \
# move into it
cd "${PIHOLEGITDIR}" || \
# if not, report an error
log_write "pihole repo does not exist"
# If the git status command completes successfully,
# we can assume we can get the information we want
cd "${git_dir}" || \
# If not, show an error
log_write "${COL_LIGHT_RED}Could not cd into ${git_dir}$COL_NC"
if git status &> /dev/null; then
# The current version the user is on
PI_HOLE_VERSION=$(git describe --tags --abbrev=0);
local remote_version=$(git describe --tags --abbrev=0);
# What branch they are on
PI_HOLE_BRANCH=$(git rev-parse --abbrev-ref HEAD);
local remote_branch=$(git rev-parse --abbrev-ref HEAD);
# The commit they are on
PI_HOLE_COMMIT=$(git describe --long --dirty --tags --always)
local remote_commit=$(git describe --long --dirty --tags --always)
# echo this information out to the user in a nice format
# If the current version matches what pihole -v produces, the user is up-to-date
if [[ "${PI_HOLE_VERSION}" == "$(pihole -v | awk '/Pi-hole/ {print $6}' | cut -d ')' -f1)" ]]; then
log_write "${TICK} Core: ${COL_LIGHT_GREEN}${PI_HOLE_VERSION}${COL_NC}"
if [[ "${remote_version}" == "$(pihole -v | awk '/${search_term}/ {print $6}' | cut -d ')' -f1)" ]]; then
log_write "${TICK} ${pihole_component}: ${COL_LIGHT_GREEN}${remote_version}${COL_NC}"
# If not,
else
# echo the current version in yellow, signifying it's something to take a look at, but not a critical error
# Also add a URL to an FAQ
log_write "${INFO} Core: ${COL_YELLOW}${PI_HOLE_VERSION:-Untagged}${COL_NC} (${COL_CYAN}${FAQ_UPDATE_PI_HOLE}${COL_NC})"
log_write "${INFO} ${pihole_component}: ${COL_YELLOW}${remote_version:-Untagged}${COL_NC} (${COL_CYAN}${FAQ_UPDATE_PI_HOLE}${COL_NC})"
fi
# If the repo is on the master branch, they are on the stable codebase
if [[ "${PI_HOLE_BRANCH}" == "master" ]]; then
if [[ "${remote_branch}" == "master" ]]; then
# so the color of the text is green
log_write "${INFO} Branch: ${COL_LIGHT_GREEN}${PI_HOLE_BRANCH}${COL_NC}"
log_write "${INFO} Branch: ${COL_LIGHT_GREEN}${remote_branch}${COL_NC}"
# If it is any other branch, they are in a developement branch
else
# So show that in yellow, signifying it's something to take a look at, but not a critical error
log_write "${INFO} Branch: ${COL_YELLOW}${PI_HOLE_BRANCH:-Detached}${COL_NC} (${COL_CYAN}${FAQ_CHECKOUT_COMMAND}${COL_NC})"
log_write "${INFO} Branch: ${COL_YELLOW}${remote_branch:-Detached}${COL_NC} (${COL_CYAN}${FAQ_CHECKOUT_COMMAND}${COL_NC})"
fi
# echo the current commit
log_write "${INFO} Commit: ${PI_HOLE_COMMIT}\n"
log_write "${INFO} Commit: ${remote_commit}"
# If git status failed,
else
# Return an error message
@ -182,123 +191,65 @@ check_core_version() {
# and exit with a non zero code
return 1
fi
}
check_web_version() {
# Local variable for the error message
local error_msg="git status failed"
# If the directory exists,
if_directory_exists "${ADMINGITDIR}" && \
# move into it
cd "${ADMINGITDIR}" || \
# if not, give an error message
log_write "repo does not exist"
# If the git status command completes successfully,
# we can assume we can get the information we want
if git status &> /dev/null; then
# The current version the user is on
WEB_VERSION=$(git describe --tags --abbrev=0);
# What branch they are on
WEB_BRANCH=$(git rev-parse --abbrev-ref HEAD);
# The commit they are on
WEB_COMMIT=$(git describe --long --dirty --tags --always)
# If the Web version reported by pihole -v matches the current version
if [[ "${WEB_VERSION}" == "$(pihole -v | awk '/AdminLTE/ {print $6}' | cut -d ')' -f1)" ]]; then
# echo it in green
log_write "${TICK} Web: ${COL_LIGHT_GREEN}${WEB_VERSION}${COL_NC}"
# Otherwise,
else
# Show it in yellow with a link to update Pi-hole
log_write "${INFO} Web: ${COL_YELLOW}${WEB_VERSION:-Untagged}${COL_NC} (${COL_CYAN}${FAQ_UPDATE_PI_HOLE}${COL_NC})"
fi
# If the repo is on the master branch, they are on the stable codebase
if [[ "${WEB_BRANCH}" == "master" ]]; then
# so the color of the text is green
log_write "${TICK} Branch: ${COL_LIGHT_GREEN}${WEB_BRANCH}${COL_NC}"
else
# If it is any other branch, they are in a developement branch
# So show that in yellow, signifying it's something to take a look at, but not a critical error
log_write "${INFO} Branch: ${COL_YELLOW}${WEB_BRANCH:-Detached}${COL_NC} (${COL_CYAN}${FAQ_CHECKOUT_COMMAND}${COL_NC})"
fi
# echo the current commit
log_write "${INFO} Commit: ${WEB_COMMIT}\n"
# If git status failed,
else
# Return an error message
log_write "${error_msg}"
# and exit with a non zero code
return 1
fi
}
check_ftl_version() {
local ftl_name="FTL"
echo_current_diagnostic "${ftl_name} version"
# Use the built in command to check FTL's version
FTL_VERSION=$(pihole-FTL version)
# Compare the current FTL version to the remote version
if [[ "${FTL_VERSION}" == "$(pihole -v | awk '/FTL/ {print $6}' | cut -d ')' -f1)" ]]; then
# If they are the same, FTL is up-to-date
log_write "${TICK} FTL: ${COL_LIGHT_GREEN}${FTL_VERSION}${COL_NC}"
log_write "${TICK} ${ftl_name}: ${COL_LIGHT_GREEN}${FTL_VERSION}${COL_NC}"
else
# If not, show it in yellow, signifying there is an update
log_write "${TICK} FTL: ${COL_YELLOW}${FTL_VERSION}${COL_NC}"
log_write "${TICK} ${ftl_name}: ${COL_YELLOW}${FTL_VERSION}${COL_NC}"
fi
}
# Check the current version of the Web server
check_web_server_version() {
# Store the name in a variable in case we ever want to change it
WEB_SERVER="lighttpd"
# Parse out just the version number
WEB_SERVER_VERSON="$(lighttpd -v |& head -n1 | cut -d '/' -f2 | cut -d ' ' -f1)"
# Checks the core version of the Pi-hole codebase
check_component_versions() {
# Check the Web version, branch, and commit
compare_local_version_to_git_version "${PIHOLEGITDIR}" "Core"
# Check the Web version, branch, and commit
compare_local_version_to_git_version "${ADMINGITDIR}" "Web"
# Check the FTL version
check_ftl_version
}
get_program_version() {
local program_name="${1}"
local program_version
echo_current_diagnostic "${program_name} version"
case "${program_name}" in
"lighttpd") program_version="$(${program_name} -v |& head -n1 | cut -d '/' -f2 | cut -d ' ' -f1)"
;;
"dnsmasq") program_version="$(${program_name} -v |& head -n1 | awk '{print $3}')"
;;
"php") program_version="$(${program_name} -v |& head -n1 | cut -d '-' -f1 | cut -d ' ' -f2)"
;;
*) echo "Unrecognized program";
esac
# If the Web server does not have a version (the variable is empty)
if [[ -z "${WEB_SERVER_VERSON}" ]]; then
if [[ -z "${program_version}" ]]; then
# Display and error
log_write "${CROSS} ${COL_LIGHT_RED}${WEB_SERVER} version could not be detected.${COL_NC}"
log_write "${CROSS} ${COL_LIGHT_RED}${program_name} version could not be detected.${COL_NC}"
else
# Otherwise, display the version
log_write "${TICK} ${WEB_SERVER}: ${WEB_SERVER_VERSON}"
fi
}
# Check the current version of the DNS server
check_resolver_server_version() {
# Store the name in a variable in case we ever want to change it
RESOLVER="dnsmasq"
# Parse out just the version number
RESOVLER_VERSON="$(dnsmasq -v |& head -n1 | awk '{print $3}')"
# If the DNS server does not have a version (the variable is empty)
if [[ -z "${RESOVLER_VERSON}" ]]; then
# Display and error
log_write "${CROSS} ${COL_LIGHT_RED}${RESOLVER} version could not be detected.${COL_NC}"
else
# Otherwise, display the version
log_write "${TICK} ${RESOLVER}: ${RESOVLER_VERSON}"
fi
}
check_php_version() {
# Parse out just the version number
PHP_VERSION=$(php -v |& head -n1 | cut -d '-' -f1 | cut -d ' ' -f2)
# If no version is detected,
if [[ -z "${PHP_VERSION}" ]]; then
# show an error
log_write "${CROSS} ${COL_LIGHT_RED}PHP version could not be detected.${COL_NC}"
else
# Otherwise, show the version
log_write "${TICK} PHP: ${PHP_VERSION}"
log_write "${TICK} ${program_name}: ${program_version}"
fi
}
# These are the most critical dependencies of Pi-hole, so we check for them
# and their versions, using the functions above.
check_critical_dependencies() {
echo_current_diagnostic "Versions of critical dependencies"
check_critical_program_versions() {
# Use the function created earlier and bundle them into one function that checks all the version numbers
check_web_server_version
check_resolver_server_version
check_php_version
get_program_version "dnsmasq"
get_program_version "lighttpd"
get_program_version "php"
}
get_distro_attributes() {
@ -877,9 +828,8 @@ upload_to_tricorder() {
# Run through all the functions we made
make_temporary_log
initiate_debug
check_core_version
check_web_version
check_ftl_version
check_component_versions
check_critical_program_versions
# setupVars.conf needs to be sourced before the networking so the values are
# available to the check_networking function
diagnose_setup_variables
@ -889,7 +839,6 @@ check_networking
check_name_resolution
process_status
check_x_headers
check_critical_dependencies
analyze_gravity_list
check_dnsmasq_d
check_lighttpd_d