diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2026-08-22 10:41:25 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2026-08-22 10:41:25 +0800 |
| commit | 1458b2b562bb0d2e0328bae45480bbbb635b71f2 (patch) | |
| tree | dac47d9b18bac1f23cad3471c938afca9c899fa9 /lexd-spool.sh | |
| parent | 0682cf927984628bcae3e6bcbff7022ae5ff0aa6 (diff) | |
| download | lex-1458b2b562bb0d2e0328bae45480bbbb635b71f2.tar.gz | |
Install scripts, run file for spool processor.
Diffstat (limited to 'lexd-spool.sh')
| -rwxr-xr-x | lexd-spool.sh | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lexd-spool.sh b/lexd-spool.sh new file mode 100755 index 0000000..825d13c --- /dev/null +++ b/lexd-spool.sh @@ -0,0 +1,100 @@ +#!/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=30 + +log_err() { + logger -t lexd-spool -p daemon.err "$1" +} + +log_info() { + logger -t lexd-spool -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 45 characters) + trunc_prompt=$(print -r -- "${raw_prompt}" | cut -c1-45) + log_info "Processing: \"${trunc_prompt}\"" + + # Pass prompt to socket + response=$(print -r -- "${raw_prompt}" | nc -w 300 -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 + |
