summaryrefslogtreecommitdiff
path: root/gempost.sh
diff options
context:
space:
mode:
authorSteph Enders <steph@senders.io>2023-04-09 15:44:31 -0400
committerSteph Enders <steph@senders.io>2023-04-09 15:51:53 -0400
commit15c85716b2c22cd7aac616d1b46756a5736b6d52 (patch)
treed3053630080cd8e9f2c4b9ce46be915b10c67889 /gempost.sh
Create a bash script to publish gemlogsmain
This script and configuration enables users to simply publish a gemtext file and modify their index file with the link. The readme.txt goes into how this will work. Error codes are also noted. The basic usage is built around how my capsule is laid out - so I have an index file at: gemini://senders.io/gemlog/ that uses a descending post order. This is useful for folks so the most recent post is at the top. But index files can be disabled - but if you're doing that then you're basically just using scp :) which I'd say write your own bash script for!
Diffstat (limited to 'gempost.sh')
-rwxr-xr-xgempost.sh146
1 files changed, 146 insertions, 0 deletions
diff --git a/gempost.sh b/gempost.sh
new file mode 100755
index 0000000..1183da9
--- /dev/null
+++ b/gempost.sh
@@ -0,0 +1,146 @@
+#!/usr/bin/env bash
+set -e
+HELP="
+Usage: ./gempost.sh <file-to-post>
+Example:
+ ./gempost.sh Docs/gemlog/hello-world.gmi
+See gempost(1) for details"
+DETAILS="
+To use gempost you need a few things:
+
+1. ssh setup
+2. a configuration with SSH setup:
+ GEMPOST_SSH_HOST=user@gemserver.space
+ GEMPOST_REMOTE_PATH=/var/gemlog/
+ GEMPOST_INDEX_ON=1
+ GEMPOST_INDEX_FILE=/var/gemlog/index.gmi
+ GEMPOST_PREVIOUS_FILE=index-previous-entry.txt
+ This config will default into ~/.config/gempost/
+ But can be overwritten with the environment variable GEMPOST_HOME
+ If index is enabled it will default to the file shown above in your GEMPOST_HOME
+3. sed
+"
+# Invalid arguments - Missing file to post
+ERR_MISSING_TARGET_FILE=2
+# Supplied file is not found
+ERR_TARGET_FILE_NOT_FOUND=3
+# No configuration file in expected locations
+ERR_CONFIG_FILE_NOT_FOUND=4
+# GEMPOST_INDEX_ON enabled but the previous title file supplied is empty
+ERR_PREV_TITLE_EMPTY=5
+# GEMPOST_INDEX_ON enabled but no previous title file found in expected locations
+ERR_PREV_TITLE_FILE_NOT_FOUND=6
+
+function init_config() {
+ if [[ -n $GEMPOST_HOME ]]; then
+ if [[ -f $GEMPOST_HOME/config.sh ]]; then
+ source $GEMPOST_HOME/config.sh
+ return;
+ fi
+ fi
+ if [[ -n $XDG_CONFIG_HOME ]]; then
+ if [[ -f $XDG_CONFIG_HOME/gempost/config.sh ]]; then
+ source $XDG_CONFIG_HOME/gempost/config.sh
+ return;
+ fi
+ fi
+ if [[ -f $HOME/.config/gempost/config.sh ]]; then
+ source $HOME/.config/gempost/config.sh
+ return
+ fi
+ echo "Unable to find gempost.conf - please see help for details..." >&2
+ exit $ERR_CONFIG_FILE_NOT_FOUND;
+}
+
+init_prev_title() {
+ if [[ -f $GEMPOST_PREVIOUS_TITLE_FILE ]]; then
+ PREV_TITLE=$(cat ${GEMPOST_PREVIOUS_TITLE_FILE})
+ if [[ -n ${PREV_TITLE} ]]; then
+ PREV_TITLE_FILE=$GEMPOST_PREVIOUS_TITLE_FILE
+ return;
+ else
+ echo "GEMPOST_INDEX_ON is enabled but $GEMPOST_PREVIOUS_TITLE_FILE is empty. Please add the title of the previous index file entry to bootstrap the process. This only needs to happen once, subsequent posts will properly manage this for you." >&2
+ exit $ERR_PREV_TITLE_EMPTY;
+ fi
+ fi
+ if [[ -f $XDG_DATA_HOME/gempost/previous-index-title.txt ]]; then
+ PREV_TITLE=$(cat $XDG_DATA_HOME/gempost/previous-index-title.txt)
+ if [[ -n $PREV_FILE ]]; then
+ PREV_TITLE_FILE=$XDG_DATA_HOME/gempost/previous-index-title.txt
+ return;
+ else
+ echo "GEMPOST_INDEX_ON is enabled but $XDG_DATA_HOME/gempost/previous-index-title.txt is empty. Please add the title of the previous index file entry to bootstrap the process. This only needs to happen once, sunsequent posts will properly manage this for you." >&2
+ exit $ERR_PREV_TITLE_EMPTY;
+ fi
+ fi
+ if [[ -f $HOME/.local/share/gempost/previous-index-title.txt ]]; then
+ PREV_TITLE=$(cat $HOME/.local/share/gempost/previous-index-title.txt)
+ if [[ -n $PREV_TITLE ]]; then
+ PREV_TITLE_FILE=$HOME/.local/share/gempost/previous-index-title.txt
+ return;
+ else
+ echo "GEMPOST_INDEX_ON is enabled but $HOME/.local/share/gempost/previous-index-title.txt is empty. Please add the title of the previous index file entry to bootstrap the process. This only needs to happen once, sunsequent posts will properly manage this for you." >&2
+ exit $ERR_PREV_TITLE_EMPTY;
+ fi
+ fi
+ echo "GEMPOST_INDEX_ON but no previous index title file found. Please see help for details..." >&2
+ exit $ERR_PREV_TITLE_FILE_NOT_FOUND;
+}
+
+
+function main() {
+ # Read parameters
+ if [[ $# -eq 0 ]]; then
+ echo "Missing arguments
+ ${HELP}" >&2
+ exit $ERR_MISSING_ARGUMENTS;
+ fi
+
+ # init target file
+ TARGET_FILE=$1
+ if [[ ! -f $TARGET_FILE ]]; then
+ echo "TARGET_FILE $TARGET_FILE not found" >&2
+ exit $ERR_TARGET_FILE_NOT_FOUND
+ fi
+
+
+ init_config;
+ if [[ $GEMPOST_INDEX_ON -gt 0 ]]; then
+ # populates $INDEX_TITLE
+ init_prev_title;
+ if [[ $# -eq 2 ]]; then
+ LINK_DESC=$2
+ fi
+ fi
+
+ # Grab the name of the file
+ TARGET_FILE_NAME=$(basename $TARGET_FILE)
+ # Send the file to the remote server
+ echo "Posting file: ${TARGET_FILE_NAME}..."
+ scp $TARGET_FILE "${GEMPOST_SSH_HOST}:${GEMPOST_REMOTE_PATH}/${TARGET_FILE_NAME}"
+ echo "File posted"
+ if [[ $GEMPOST_INDEX_ON -gt 0 ]]; then
+ echo "Updating index file"
+
+ if [[ -n $LINK_DESC ]]; then
+ NEW_INDEX_LINE="=> ${GEMPOST_INDEX_LINK_PREFIX}/${TARGET_FILE_NAME} ${LINK_DESC}"
+ else
+ NEW_INDEX_LINE="=> ${GEMPOST_INDEX_LINK_PREFIX}/${TARGET_FILE_NAME}"
+ fi
+ echo "Modifying remote index file..."
+ ssh $GEMPOST_SSH_HOST \
+ "sed -i '/${PREV_TITLE}/i ${NEW_INDEX_LINE}' ${GEMPOST_REMOTE_INDEX_FILE}"
+ echo ${TARGET_FILE_NAME} > ${PREV_TITLE_FILE}
+ echo "Index file updated!"
+ fi
+
+ if [[ -n $GEMPOST_REMOTE_POST_PROCESS ]]; then
+ ssh $GEMPOST_SSH_HOST \
+ "${GEMPOST_REMOTE_POST_PROCESS}"
+ echo "Done running remote post process"
+ fi
+}
+
+main "$@";
+echo "Completed successfully"
+