#!/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"