#!/bin/ksh # OpenBSD ksh daemon script to process remote spool files over SSH # Fall back to the running user's home if $HOME is unset USER_HOME="${HOME:-$(eval echo "~${USER}")}" SSH_CONFIG="${USER_HOME}/.ssh/config" SSH_HOST="lex-spool" SPOOL_DIR="/var/www/var/lex/spool/new" DICT_DIR="/var/www/var/lex/dict" SOCKET_PATH="/var/run/lexd/sock" SLEEP_INTERVAL=5 log_err() { logger -t spool_proc -p daemon.err "$1" } log_info() { logger -t spool_proc -p daemon.info "$1" } while true; do # Fetch one file SPOOL_FILE=$(ssh -F "${SSH_CONFIG}" -n "${SSH_HOST}" \ "ls -1 '${SPOOL_DIR}' 2>/dev/null | head -n 1") if [ $? -ne 0 ]; then log_err "Failed connection attempt to ${SSH_HOST}" sleep "${SLEEP_INTERVAL}" continue fi # If spool is empty, wait and retry if [ -z "${SPOOL_FILE}" ]; then sleep "${SLEEP_INTERVAL}" continue fi ( set -e # Fetch remote spool file content raw_prompt=$(ssh -F "${SSH_CONFIG}" -n "${SSH_HOST}" \ "cat '${SPOOL_DIR}/${SPOOL_FILE}'") if [ -z "${raw_prompt}" ]; then log_err "Empty spool file: ${SPOOL_FILE}" exit 1 fi # Log truncated input string (up to 60 characters) trunc_prompt=$(print -r -- "${raw_prompt}" | cut -c1-60) log_info "Processing: \"${trunc_prompt}\"" # Pass prompt to socket response=$(print -r -- "${raw_prompt}" | nc -w 3 -U "${SOCKET_PATH}") if [ -z "${response}" ]; then log_err "Empty socket response for: ${SPOOL_FILE}" exit 1 fi # Extract first word (lowercased) target_word=$(print -r -- "${response}" \ | awk '{print tolower($1); exit}') if [ -z "${target_word}" ]; then log_err "No target filename for: ${SPOOL_FILE}" exit 1 fi # Validate target word case "${target_word}" in *[!a-z-]*) log_err "Invalid word '${target_word}': ${SPOOL_FILE}" exit 1 ;; [!a-z]*|*[!a-z]) log_err "Bad bounds '${target_word}': ${SPOOL_FILE}" exit 1 ;; esac target_file="${DICT_DIR}/${target_word}" # Write remote dict file & remove spool file print -r -- "${response}" \ | ssh -F "${SSH_CONFIG}" "${SSH_HOST}" \ "cat > '${target_file}' && rm -f '${SPOOL_DIR}/${SPOOL_FILE}'" log_info "Finished processing: ${target_word}" ) if [ $? -ne 0 ]; then log_err "Processing failed for file: ${SPOOL_FILE}" fi sleep "${SLEEP_INTERVAL}" done