#!/bin/bash #Manages an /etc/changelog APP_PATH=$( cd $(dirname ${BASH_SOURCE[0]}) && pwd ) APP_NAME=$( basename ${BASH_SOURCE[0]}) STDIN=$( cat ) ls -lh /proc/self/fd exec 0/dev/null && RUN_SUDO=1 [[ $RUN_SUDO -eq 1 ]] && { echo -e "\nYou cannot write to $CHANGELOG... This doesn't look serious!\n" read -e -i y -n 1 -p "Run as sudo [Yn]? : " [[ "Y" == ${REPLY^} ]] && sudo -E "$APP_PATH/$APP_NAME" && exit 0 } # functions msg(){ echo -e "$@"; } panic(){ msg "${@} Exiting."; exit 1;} ENTRY_FILE=$(mktemp) # This is the main function change(){ TMP="$1" while true ; do echo -e "\nType the nature of the change.\nExample: > mysql: do not start on boot\n" read -e -p "> " SUB echo -e "* $SUB" >> $TMP echo -e "\nTime for some details." for (( ; ; )); do echo "Select number or x to quit" for (( i=0; i<${#PLUGIN_CONTENT_MENU[@]}; i++)) ; do echo "$i) ${PLUGIN_CONTENT_MENU[$i]}" done echo "x) No more details." read -e -n 1 -p "Your choice? :" REPLY if [[ "x" == ${REPLY,,} ]]; then break elif [[ -z "${PLUGIN_CONTENT[$REPLY]}" ]] ; then echo "Unknown Key." else ${PLUGIN_CONTENT[$REPLY]} $TMP fi done read -e -i "n" -p "Another section? [yN]:" END [[ "${END^^}" == "N" ]] && break done } template(){ FILE="$1" cat << HEREDOC $(date "+%Y-%m-%d %H:%M") $CHANGELOG_USERNAME $( cat "$FILE" |sed 's/^/ /' ) HEREDOC } hookContentComment(){ [[ -z "$1" ]] && echo "Enter a simple comment. Ex: systemctl disable nginx" && return TMP="$1" read -e -p "Your comment: " CONTENT echo "$CONTENT" >> $TMP } hookOutputFile(){ [[ -z "$1" ]] && echo "Writing a local changelog entry to $CHANGELOG" && return local TMP=$(mktemp) SOURCE="$1" template "$SOURCE" > "$TMP" [[ -f "$CHANGELOG" ]] && cat /etc/changelog >> "$TMP" cat "$TMP" > $CHANGELOG rm -f "$TMP" } # Build the hook content menu PLUGIN_CONTENT+=("hookContentComment") declare -a PLUGIN_CONTENT_MENU # Build the hook content menu PLUGIN_OUTPUT+=("hookOutputFile") declare -a PLUGIN_OUTPUT_MENU # %PLUGIN% This comment is used to build custom scripts [[ -d "$APP_PATH/plugins-enabled" ]] && [[ -n "$APP_PATH/plugins-enabled/*" ]] && for plugin in "$APP_PATH"/plugins-enabled/*; do source $plugin; done for (( i = 0; i < ${#PLUGIN_OUTPUT[@]} ; i++ )); do TXT=$( ${PLUGIN_OUTPUT[$i]} ) PLUGIN_OUTPUT_MENU+=("$( ${PLUGIN_OUTPUT[$i]} )") done for (( i = 0; i < ${#PLUGIN_CONTENT[@]} ; i++ )); do TXT=$( ${PLUGIN_CONTENT[$i]} ) PLUGIN_CONTENT_MENU+=("$( ${PLUGIN_CONTENT[$i]} )") done # Exec echo -e "\nWelcome to Serious Changelogs Inc. Do you have something for me?\n" # set environment variables [[ -z "$CHANGELOG_USERNAME" ]] && read -e -p "Your name? " NAME&& read -e -p "Your email? " EMAIL && CHANGELOG_USERNAME="${NAME^} <$EMAIL>" && echo "export CHANGELOG_USERNAME=\"$CHANGELOG_USERNAME\"" [[ " <>" == "$CHANGELOG_USERNAME" ]] && panic "srs.ly?" # check changelog exists [[ ! -f "$CHANGELOG" ]] && template "* Changelog: Added $CHANGELOG file\nIt was not serious. Fixed!\n\n" > "$CHANGELOG" # Detect piped content if [[ -n "$STDIN" ]] ; then echo -e "$STDIN" > $ENTRY_FILE #OR enter interactive mode else change "$ENTRY_FILE" fi # confirm the output echo -e "\nHere is the content you are about to add:\n\n$(cat $ENTRY_FILE)\n" read -e -p "OK? [Yn]: " -i y RETURN [[ "N" == ${RETURN^^} ]] && exit 1 # Send data to outputs for (( i=0; i<${#PLUGIN_OUTPUT_MENU[@]}; i++)) ; do echo "${PLUGIN_OUTPUT_MENU[$i]}" ${PLUGIN_OUTPUT[$i]} $ENTRY_FILE done rm "$ENTRY_FILE"