From 15c85716b2c22cd7aac616d1b46756a5736b6d52 Mon Sep 17 00:00:00 2001 From: Steph Enders Date: Sun, 9 Apr 2023 15:44:31 -0400 Subject: Create a bash script to publish gemlogs 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! --- gempost.sh | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 gempost.sh (limited to 'gempost.sh') 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 +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" + -- cgit v1.2.3-54-g00ecf