#!/usr/bin/env bash
# Copyright © 2020-2022 Xavier G. <xavier.yamltab@kindwolf.org>
# This work is free. You can redistribute it and/or modify it under the
# terms of the Do What The Fuck You Want To Public License, Version 2,
# as published by Sam Hocevar. See the COPYING file for more details.
# Helper variables:
yamltab="${YAMLTAB_PATH:-yamltab}"
# Helper functions:
function edit {
if `which editor > /dev/null`; then
editor "$@"
else
"${EDITOR:-vi}" "$@"
fi
}
function cleanup {
[ -f "${tmp_file}" ] && unlink "${tmp_file}"
[ -f "${tmp_file}.yaml" ] && unlink "${tmp_file}.yaml"
[ -d "${tmp_dir}" ] && rmdir "${tmp_dir}"
}
function exit {
cleanup
builtin exit $1
}
# Expect a keytab file as single argument:
keytab="${1:?Usage: $0 keytab}"
keytab_filename="$(basename "${keytab}")"
# Redundant with the chmod below; might compensate for some whacky editors?
umask 0077
# Prepare temporary files:
tmp_dir="$(mktemp --directory)" || exit $?
tmp_file="${tmp_dir}/${keytab_filename}"
touch "${tmp_file}" "${tmp_file}.yaml" || exit $?
chmod go-rwx "${tmp_file}" "${tmp_file}.yaml" || exit $?
# Dump the given keytab as YAML:
"${yamltab}" "${keytab}" > "${tmp_file}.yaml" || exit $?
md5_before="$(md5sum "${tmp_file}.yaml")"
# Edit the keytab as YAML:
edit "${tmp_file}.yaml"
rc=$?
# If the YAML dump was not modified, leave the keytab untouched:
md5_after="$(md5sum "${tmp_file}.yaml")"
if [ "${md5_before}" == "${md5_after}" ]; then
echo "No changes detected, ${keytab} left untouched."
exit 0
else
# Convert the YAML into a binary keytab:
"${yamltab}" "${tmp_file}.yaml" > "${tmp_file}" || exit $?
# Replace the old keytab with the new one:
cat "${tmp_file}" > "${keytab}" || exit $?
fi
exit $rc