190 lines
4.8 KiB
Bash
Executable File
190 lines
4.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -o pipefail
|
|
|
|
readonly program="$(basename "${0}")"
|
|
skip_curl_verify=0
|
|
verbose=0
|
|
|
|
syntax_error() {
|
|
echo "${program}: ${1}" >&2
|
|
echo "Try \`${program} --help\` for more information." >&2
|
|
exit 1
|
|
}
|
|
|
|
depends_on() {
|
|
formula="${1}"
|
|
[[ "$#" -eq 2 ]] && cmd="${2}" || cmd=$(basename "${formula}")
|
|
|
|
if [[ ! $(which "${cmd}") ]]; then
|
|
echo -e "$(tput setaf 1)
|
|
This script depends on '${cmd}'.
|
|
If you have [Homebrew](http://brew.sh), you can install it with 'brew install ${formula}'.
|
|
$(tput sgr0)" | sed -E 's/ {6}//' >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
depends_on 'tsparber/tiny-scripts/curl-check-url'
|
|
|
|
usage() {
|
|
echo "
|
|
This script changes the url, appcast and homepage stanzas to https
|
|
|
|
After changing to https a HTTP GET request is performed to verify if the url is reachable.
|
|
If the https url is not reachable it is reverted to the previous version.
|
|
|
|
Known Issues: If multiple url/appcast stanzas are present, all urls are changed but only
|
|
those for the current os are verified.
|
|
|
|
If no cask name is given the current work directory is scanned with the given options.
|
|
|
|
usage: $program [options] [<cask_name>]
|
|
options:
|
|
-s, --skip-verify Skip checking for a HTTP 200 Status Code using curl.
|
|
--verbose Show more verbose output.
|
|
-h, --help Show this help.
|
|
|
|
Based on: https://github.com/vitorgalvao/tiny-scripts/blob/master/cask-repair
|
|
" | sed -E 's/^ {4}//'
|
|
}
|
|
|
|
# available flags
|
|
while [[ "${1}" ]]; do
|
|
case "${1}" in
|
|
-h | --help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
-s | --skip-verify)
|
|
skip_curl_verify=1
|
|
;;
|
|
--verbose)
|
|
verbose=1
|
|
;;
|
|
-*)
|
|
syntax_error "unrecognized option: ${1}"
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# define function to check if given URL exists and is reachable using HTTPS
|
|
check_url_for_https() {
|
|
cask_url="${1}"
|
|
verbose_option=''
|
|
|
|
[[ "${verbose}" -ne 0 ]] && verbose_option="-v "
|
|
|
|
# check if the URL sends a 200 HTTP code, else abort
|
|
curl-check-url "${verbose_option}" "${cask_url}" > /dev/null
|
|
exit_code="$?"
|
|
|
|
if [[ "${exit_code}" -ne 0 ]]; then
|
|
echo "curl returned ${exit_code}: FAIL for ${cask_url}"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# define function to modify part of stanza
|
|
replace_protocol_of_stanza() {
|
|
cask_file="${1}"
|
|
stanza="${2}"
|
|
old_value="${3}"
|
|
new_value="${4}"
|
|
|
|
sed "s|${stanza} \(['\"]\)${old_value}://|${stanza} \1${new_value}://|g" "${cask_file}" > tmpfile
|
|
mv tmpfile "${cask_file}"
|
|
}
|
|
|
|
# define abort function, that will reset the state
|
|
finish() {
|
|
# show message
|
|
if [[ "${1}" == 'abort' ]]; then
|
|
echo -e "$(tput setaf 1)${2}$(tput sgr0)\n"
|
|
[[ ! -z "${cask_file}" ]] && git checkout -- "${cask_file}"
|
|
exit 1
|
|
elif [[ "${1}" == 'success' ]]; then
|
|
echo -e "$(tput setaf 2)Updated: ${cask_name} is now using HTTPS$(tput sgr0)\n"
|
|
exit 0
|
|
fi
|
|
}
|
|
|
|
# cleanup if aborted with ⌃C
|
|
trap 'finish abort "You aborted"' SIGINT
|
|
|
|
# exit if not inside a 'homebrew-*/Casks' directory
|
|
casks_dir=$(pwd | perl -ne 'print m{homebrew-[^/]+/Casks}')
|
|
if [[ -z "${casks_dir}" ]]; then
|
|
echo -e "\n$(tput setaf 1)You need to be inside a '/homebrew-*/Casks' directory$(tput sgr0)\n"
|
|
exit 1
|
|
fi
|
|
|
|
# exit if no argument was given: Run in current directory
|
|
if [[ -z "${1}" ]]; then
|
|
options=""
|
|
[[ ${skip_curl_verify} -ne 0 ]] && options+=" --skip-verify"
|
|
[[ ${verbose} -ne 0 ]] && options+=" --verbose"
|
|
|
|
for file in *.rb;
|
|
do
|
|
"${0}" "${options}" "${file}"
|
|
done
|
|
|
|
exit 0
|
|
fi
|
|
|
|
# clean the cask's name, and check if it is valid
|
|
cask_name="${1%.rb}" # remove '.rb' extension, if present
|
|
cask_file="./${cask_name}.rb"
|
|
[[ ! -f "${cask_file}" ]] && finish abort 'There is no such cask'
|
|
|
|
# initial tasks
|
|
git checkout -- "${cask_file}"
|
|
|
|
# check if a http url exists
|
|
cask_contains_http=$(grep "['\"]http://" "${cask_file}")
|
|
if [[ -z ${cask_contains_http} ]]; then
|
|
echo -e "Skipped ${cask_name} no http found\n"
|
|
exit 0
|
|
fi
|
|
|
|
updated_stanzas=0
|
|
for stanza in url appcast homepage; do
|
|
# Check if the stanza exists
|
|
stanza_contained=$(grep "${stanza} ['\"]" "${cask_file}")
|
|
[[ -z ${stanza_contained} ]] && continue
|
|
|
|
stanza_contains_https=$(grep "${stanza} ['\"]http://" "${cask_file}")
|
|
if [[ -z ${stanza_contains_https} ]]; then
|
|
# echo "Skipped stanza ${stanza} in ${cask_name} no http url found"
|
|
continue
|
|
fi
|
|
|
|
replace_protocol_of_stanza "${cask_file}" "${stanza}" "http" "https"
|
|
|
|
if [[ ${skip_curl_verify} -eq 0 ]]; then
|
|
check_url_for_https "$(brew cask _stanza "${stanza}" "${cask_name}")"
|
|
else
|
|
true
|
|
fi
|
|
|
|
if [[ $? -ne 0 ]]; then
|
|
echo "Restored original value for stanza ${stanza} as curl check failed"
|
|
replace_protocol_of_stanza "${cask_file}" "${stanza}" "https" "http"
|
|
else
|
|
updated_stanzas=$((updated_stanzas+1))
|
|
fi
|
|
done
|
|
|
|
if [[ ${updated_stanzas} -ne 0 ]]; then
|
|
finish success
|
|
else
|
|
finish abort "no updated stanzas after verify for ${cask_name}"
|
|
fi
|