Added hook to actually delete a note if requested Removed old, commented code Simplified create and delete logic by removing unnecessary checks that make no sense to me now Cleaned up output from create event
289 lines
8.3 KiB
Bash
Executable File
289 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
|
#==========================================================
|
|
# Simple Note System, v2.0a5
|
|
# Copyright 2014, Xenese Labs/Sicron-Perion XNF
|
|
#==========================================================
|
|
|
|
if [ -z "/Users/xilmwa" ]; then HOME=/home/"$(whoami)"; fi
|
|
|
|
PROD_STR="Simple Note System"
|
|
VER_STR="v2.0a5"
|
|
ROOTDIR="$HOME"/.config/sns
|
|
BASEDIR="$ROOTDIR"/notes
|
|
CONFIGURATION="$ROOTDIR/sns.conf"
|
|
|
|
|
|
# Section: Functions
|
|
function w_conf {
|
|
if [ ! -r "$ROOTDIR" ]; then mkdir -p "$ROOTDIR"; fi
|
|
cat > "$CONFIGURATION" << EOF
|
|
#==========================================================
|
|
# Simple Note System Config, v2.0a5
|
|
# Copyright 2014, Xenese Labs/Sicron-Perion XNF
|
|
#==========================================================
|
|
|
|
#File extension to use (for listing notes)
|
|
EXT=note
|
|
|
|
#Preferred Editor
|
|
if [ -z "$EDITOR" ]; then
|
|
EDITOR=vim
|
|
fi
|
|
|
|
#Encryption
|
|
#WARNING: ANY PREVIOUSLY UNENCRYPTED NOTES WILL BE LOST
|
|
ENCRYPTION="FALSE"
|
|
ENC_KEY=""
|
|
EOF
|
|
|
|
chmod 600 "$CONFIGURATION"
|
|
}
|
|
function pause {
|
|
read -p " Press [Enter] to continue."
|
|
echo ""
|
|
}
|
|
function help {
|
|
echo ""
|
|
echo "usage: sns [-ce] NAME NOTEBOOK SECTION"
|
|
echo " sns [-d ] NAME NOTEBOOK SECTION"
|
|
echo " sns [-lp] NOTEBOOK"
|
|
echo " sns [-w ]"
|
|
echo " sns [-h ]"
|
|
|
|
echo ""
|
|
echo " -c | --create : Create note"
|
|
echo " -d | --delete : Delete note"
|
|
echo " -e | --edit : Open note for editing"
|
|
echo " -h | --help : Display this message"
|
|
echo " -p | --print : Print note to console"
|
|
echo " -l | --list : List all notes in NOTEBOOK"
|
|
echo " -w | --wconf : Rewrite default configuration"
|
|
echo ""
|
|
}
|
|
function p_header(){
|
|
printf "TITLE: %s\nDATE: %s\n" "$NAME" "$(date)"
|
|
}
|
|
function encrypt(){
|
|
openssl enc -aes-256-cbc -salt -in "$TARGET" -out "$NOTE" -pass pass:"$ENC_KEY"
|
|
}
|
|
|
|
function decrypt(){
|
|
TARGET="$ROOTDIR"/tmp/"$RANDOM"
|
|
openssl enc -d -aes-256-cbc -in "$NOTE" -pass pass:"$ENC_KEY" > "$TARGET"
|
|
}
|
|
function create(){
|
|
if [ -e "$NOTE" ]; then
|
|
printf "\nERROR: Note already exists\nHint: use -e to edit the note.\n"
|
|
exit
|
|
else
|
|
mkdir -p "$NOTEDIR"
|
|
fi
|
|
|
|
if [ -z "$ENCRYPTION" ]; then
|
|
echo "TITLE: $NAME" > "$NOTE"
|
|
echo "DATE: $(date)" >> "$NOTE"
|
|
elif [ "$ENCRYPTION" == "TRUE" ]; then
|
|
touch "$NOTE"
|
|
p_header | openssl enc -aes-256-cbc -salt -out "$NOTE"\
|
|
-pass pass:"$ENC_KEY"
|
|
fi
|
|
|
|
if [ -e "$NOTE" ]; then
|
|
echo "Created note: $NOTEBOOK/$SECTION/$NAME."
|
|
fi
|
|
|
|
}
|
|
function delete(){
|
|
if [ "$DELETE" == "TRUE" ]; then
|
|
if [ -e "$NOTE" ]; then
|
|
rm "$NOTE"
|
|
echo ""
|
|
echo "Deleted note: $NOTEBOOK/$SECTION/$NAME."
|
|
exit
|
|
else
|
|
echo ""
|
|
echo "ERROR: Note $NOTEBOOK/$SECTION/$NAME does not exist."
|
|
exit
|
|
fi
|
|
fi
|
|
}
|
|
function edit(){
|
|
if [ ! -r "$NOTE" ]; then
|
|
echo "ERROR: Note cannot be opened for editing."
|
|
exit 40;
|
|
fi
|
|
|
|
if [ "$ENCRYPTION" == "TRUE" ]; then decrypt
|
|
else TARGET="$NOTE"; fi
|
|
|
|
|
|
if [ -z "$CREATE" ]; then printf "\nEDIT %s" "$(date)" >> "$TARGET"; fi
|
|
|
|
"$EDITOR" "$TARGET"
|
|
|
|
if [ "$ENCRYPTION" == "TRUE" ]; then encrypt; fi
|
|
|
|
|
|
|
|
}
|
|
function print(){
|
|
if [ "$PRINT" == "TRUE" ]; then
|
|
if [ -r "$NOTE" ] || [ -r "${NOTE%.*}" ]; then
|
|
if [ -z "$CREATE" ]; then
|
|
if [ "$ENCRYPTION" == "TRUE" ]; then
|
|
openssl enc -d -aes-256-cbc -in "${NOTE%.*}" -pass pass:"$ENC_KEY"
|
|
else
|
|
cat "$NOTE"
|
|
echo "" >> "$NOTE"
|
|
fi
|
|
else
|
|
echo ""
|
|
echo "ERROR: Note cannot be found."
|
|
echo ""
|
|
|
|
fi
|
|
fi
|
|
fi
|
|
}
|
|
function list(){
|
|
if [ -d "$BASEDIR"/"$NOTEBOOK" ]; then
|
|
printf "\nNotes in %s:\n" "$(basename "$NOTEBOOK")"
|
|
|
|
NOTES=( $(find "$BASEDIR"/"$NOTEBOOK" -name "*.$EXT" -print0 | sed s:"$BASEDIR"/"$NOTEBOOK"/: " " :g | sed -e s:".$EXT"::g | tr "/" " ") )
|
|
let i=0
|
|
for NOTE in "${NOTES[@]}"; do
|
|
if [ -d "$BASEDIR"/"$NOTEBOOK"/"$NOTE" ]; then
|
|
if [ "$LAST_SECTION" != "$NOTE" ]; then
|
|
printf " Section: %s\n" "$NOTE"
|
|
fi
|
|
LAST_SECTION="$NOTE"
|
|
else
|
|
#if [ $(($i % 1)) -eq 0 ]; then
|
|
# printf "\n "
|
|
#fi
|
|
printf " %s\n" "$NOTE"
|
|
fi
|
|
let i++
|
|
done
|
|
printf "\n"
|
|
else
|
|
echo ""
|
|
echo "ERROR: Notebook $NOTEBOOK does not exist."
|
|
echo ""
|
|
fi
|
|
}
|
|
# End Section: Functions
|
|
|
|
#==============================================================================
|
|
# Section: Configuration
|
|
#==============================================================================
|
|
if [ -r "$CONFIGURATION" ]; then
|
|
source "$CONFIGURATION"
|
|
else
|
|
w_conf
|
|
source "$CONFIGURATION"
|
|
fi
|
|
|
|
if [ "$ENCRYPTION" == "TRUE" ]; then
|
|
if [ -z "$ENC_KEY" ]; then
|
|
ERR_NO_KEY="TRUE"
|
|
ENCRYPTION="FALSE"
|
|
fi
|
|
command -v openssl >/dev/null 2>&1 || { ERR_NO_SSL="TRUE"; ENCRYPTION="FALSE"; }
|
|
fi
|
|
|
|
if [ "$ENCRYPTION" == "TRUE" ]; then
|
|
PROD_STR="Simple Note System (Encryption Enabled)"
|
|
EXT="$EXT"
|
|
if [ ! -d "$BASEDIR"/tmp ]; then
|
|
mkdir -p "$BASEDIR"/tmp
|
|
fi
|
|
fi
|
|
|
|
echo "$PROD_STR, $VER_STR"
|
|
if [ -n "$ERR_NO_SSL" ]; then
|
|
echo >&2 " Warning: OpenSSL not installed. Encryption disabled."
|
|
fi
|
|
if [ -n "$ERR_NO_KEY" ]; then
|
|
echo " Warning: No encryption key was provided. Encryption disabled."
|
|
fi
|
|
|
|
if [ -n "$ERR_NO_SSL" ] || [ -n "$ERR_NO_KEY" ]; then
|
|
pause
|
|
fi
|
|
|
|
#==============================================================================
|
|
# End Section: Configuration
|
|
#==============================================================================
|
|
#==============================================================================
|
|
# Section: Argument Parsing
|
|
#==============================================================================
|
|
|
|
NAME=""
|
|
NOTEBOOK=""
|
|
SECTION=""
|
|
if [ -z "$1" ]; then help; exit 20
|
|
else
|
|
ARGS=( "$@" )
|
|
for ARG in "${ARGS[@]}"; do
|
|
if [ "$ARG" = "-c" ] || [ "$ARG" = "--create" ]; then CREATE="TRUE"
|
|
elif [ "$ARG" = "-d" ] || [ "$ARG" = "--delete" ]; then DELETE="TRUE"
|
|
elif [ "$ARG" = "-e" ] || [ "$ARG" = "--edit" ]; then EDIT="TRUE"
|
|
elif [ "$ARG" = "-ce" ] || [ "$ARG" = "-ec" ]; then EDIT="TRUE"; CREATE="TRUE"
|
|
elif [ "$ARG" = "-p" ] || [ "$ARG" = "--print" ]; then PRINT="TRUE"
|
|
elif [ "$ARG" = "-l" ] || [ "$ARG" = "--list" ]; then LIST="TRUE"
|
|
elif [ "$ARG" = "-h" ] || [ "$ARG" == "--help" ]; then help; exit 0
|
|
elif [ "$ARG" = "-w" ] || [ "$ARG" == "--wconf" ]; then w_conf; exit 0
|
|
else
|
|
if [ -z "$NAME" ] && [ -n "$ARG" ]; then NAME="$ARG"
|
|
elif [ -z "$NOTEBOOK" ] && [ -n "$ARG" ]; then NOTEBOOK="$ARG"
|
|
elif [ -z "$SECTION" ] && [ -n "$ARG" ]; then SECTION="$ARG"
|
|
fi
|
|
fi
|
|
done
|
|
if [ -n "$NAME" ] && [ -z "$NOTEBOOK" ] && [ -n "$LIST" ]; then
|
|
# If we got a note title above, but no notebook, and the list option
|
|
# was specified, we assume that the detected note title is actually a
|
|
# notebook name.
|
|
NOTEBOOK="$NAME"
|
|
NAME=""
|
|
fi
|
|
fi
|
|
|
|
# Note: w_conf and help have highest priority, as they are the only functions
|
|
# that can work without any arguments.
|
|
|
|
#==============================================================================
|
|
# End Section: Argument Parsing
|
|
#==============================================================================
|
|
# Help requires no arguments, and is exclusive.
|
|
if [ -n "$HELP" ]; then help; exit 0; fi
|
|
|
|
# List only requires a notebook, and is exclusive.
|
|
if [ -z "$NOTEBOOK" ]; then
|
|
echo " ERROR: Insufficient arguments:"
|
|
echo " Notebook not specified"
|
|
exit 30
|
|
fi
|
|
|
|
if [ -n "$LIST" ]; then
|
|
list
|
|
exit 0
|
|
fi
|
|
|
|
#All other functions require a note title and notebook.
|
|
|
|
if [ -z "$NAME" ]; then
|
|
echo " ERROR: Insufficient arguments:"
|
|
echo " Title not specified"
|
|
exit 30
|
|
fi
|
|
|
|
NOTEDIR="$BASEDIR"/"$NOTEBOOK"/"$SECTION"/
|
|
NOTE="$NOTEDIR""$NAME"."$EXT"
|
|
|
|
if [ "$ENCRYPTION" == "TRUE" ]; then NOTE="$NOTE".enc; fi
|
|
if [ "$PRINT" == "TRUE" ]; then print; exit 0; fi
|
|
if [ "$DELETE" == "TRUE" ]; then delete; exit 0; fi
|
|
if [ "$CREATE" == "TRUE" ]; then create; fi
|
|
if [ "$EDIT" == "TRUE" ]; then edit; fi |