From 1458b2b562bb0d2e0328bae45480bbbb635b71f2 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Sat, 22 Aug 2026 10:41:25 +0800 Subject: Install scripts, run file for spool processor. --- Makefile | 4 +- deploy.cgi.sh | 76 ------------------------------------ install.cgi.sh | 76 ++++++++++++++++++++++++++++++++++++ install.lexd_spool.sh | 43 +++++++++++++++++++++ lexd-spool.rc | 16 ++++++++ lexd-spool.sh | 100 ++++++++++++++++++++++++++++++++++++++++++++++++ sub.sh | 100 ------------------------------------------------ uninstall.lexd_spool.sh | 46 ++++++++++++++++++++++ 8 files changed, 283 insertions(+), 178 deletions(-) delete mode 100644 deploy.cgi.sh create mode 100644 install.cgi.sh create mode 100644 install.lexd_spool.sh create mode 100644 lexd-spool.rc create mode 100755 lexd-spool.sh delete mode 100755 sub.sh create mode 100644 uninstall.lexd_spool.sh diff --git a/Makefile b/Makefile index 4fb8a1e..b37ecfe 100644 --- a/Makefile +++ b/Makefile @@ -96,7 +96,7 @@ install-user: @if ! id -u $(SERVICE_USER) >/dev/null 2>&1; then \ echo "===> Creating service user..."; \ groupadd $(SERVICE_GROUP) 2>/dev/null || true; \ - useradd -g $(SERVICE_GROUP) -s /sbin/nologin -d /var/empty -c "lexd daemon user" $(SERVICE_USER); \ + useradd -g $(SERVICE_GROUP) -s /sbin/nologin -m -c "lexd daemon user" $(SERVICE_USER); \ fi install: $(TARGET) install-user @@ -121,7 +121,7 @@ uninstall: @echo "Note: The data directory and service accounts were preserved." @echo "To remove all remaining data, run:" @echo " # rm -rf $(VARDIR)" - @echo " # userdel $(SERVICE_USER)" + @echo " # userdel -r $(SERVICE_USER)" @echo " # groupdel $(SERVICE_GROUP)" clean: diff --git a/deploy.cgi.sh b/deploy.cgi.sh deleted file mode 100644 index e6d5eeb..0000000 --- a/deploy.cgi.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/sh -# -# Sets up /var/www/cgi-bin/lex.cgi and its supporting directory tree -# under /var/www/var/lex. - -set -eu - -# source location: current directory -SRCDIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) - -if [ "$(id -u)" -ne 0 ]; then - echo "ERROR: operation not permitted" >&2 - exit 1 -fi - -if [ ! -d "/var/www/cgi-bin" ]; then - echo "ERROR: /var/www/cgi-bin does not exist." >&2 - exit 1 -fi - -if [ ! -f "$SRCDIR/lex.cgi" ]; then - echo "ERROR: source file not found: $SRCDIR/lex.cgi" >&2 - exit 1 -fi - -if [ ! -f "$SRCDIR/pubring.gpg" ]; then - echo "ERROR: source file not found: $SRCDIR/pubring.gpg" >&2 - exit 1 -fi - -# directory tree -mkdir -p "/var/www/var" -chown root:daemon "/var/www/var" -chmod 755 "/var/www/var" - -mkdir -p "/var/www/var/lex" -chown www:tool "/var/www/var/lex" -chmod 710 "/var/www/var/lex" - -mkdir -p "/var/www/var/lex/locks" -chown www:www "/var/www/var/lex/locks" -chmod 750 "/var/www/var/lex/locks" - -mkdir -p "/var/www/var/lex/spool" -chown www:tool "/var/www/var/lex/spool" -chmod 710 "/var/www/var/lex/spool" - -mkdir -p "/var/www/var/lex/spool/tmp" -chown www:tool "/var/www/var/lex/spool/tmp" -chmod 750 "/var/www/var/lex/spool/tmp" - -mkdir -p "/var/www/var/lex/spool/new" -chown www:tool "/var/www/var/lex/spool/new" -chmod 2770 "/var/www/var/lex/spool/new" - -mkdir -p "/var/www/var/lex/dict" -chown lex:tool "/var/www/var/lex/dict" -chmod 770 "/var/www/var/lex/dict" - -mkdir -p "/var/www/var/log" -chmod 1770 "/var/www/var/log" -chown www:tool "/var/www/var/log" - -# pubring.gpg -cp -f "$SRCDIR/pubring.gpg" "/var/www/var/lex/pubring.gpg" -chmod 440 "/var/www/var/lex/pubring.gpg" -chown www:tool "/var/www/var/lex/pubring.gpg" -echo "copied: $SRCDIR/pubring.gpg -> /var/www/var/lex/pubring.gpg" - -# lex.cgi -cp -f "$SRCDIR/lex.cgi" "/var/www/cgi-bin/lex.cgi" -chmod 755 "/var/www/cgi-bin/lex.cgi" -chown root:daemon "/var/www/cgi-bin/lex.cgi" -echo "copied: $SRCDIR/lex.cgi -> /var/www/cgi-bin/lex.cgi" - -echo "done." diff --git a/install.cgi.sh b/install.cgi.sh new file mode 100644 index 0000000..e6d5eeb --- /dev/null +++ b/install.cgi.sh @@ -0,0 +1,76 @@ +#!/bin/sh +# +# Sets up /var/www/cgi-bin/lex.cgi and its supporting directory tree +# under /var/www/var/lex. + +set -eu + +# source location: current directory +SRCDIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd) + +if [ "$(id -u)" -ne 0 ]; then + echo "ERROR: operation not permitted" >&2 + exit 1 +fi + +if [ ! -d "/var/www/cgi-bin" ]; then + echo "ERROR: /var/www/cgi-bin does not exist." >&2 + exit 1 +fi + +if [ ! -f "$SRCDIR/lex.cgi" ]; then + echo "ERROR: source file not found: $SRCDIR/lex.cgi" >&2 + exit 1 +fi + +if [ ! -f "$SRCDIR/pubring.gpg" ]; then + echo "ERROR: source file not found: $SRCDIR/pubring.gpg" >&2 + exit 1 +fi + +# directory tree +mkdir -p "/var/www/var" +chown root:daemon "/var/www/var" +chmod 755 "/var/www/var" + +mkdir -p "/var/www/var/lex" +chown www:tool "/var/www/var/lex" +chmod 710 "/var/www/var/lex" + +mkdir -p "/var/www/var/lex/locks" +chown www:www "/var/www/var/lex/locks" +chmod 750 "/var/www/var/lex/locks" + +mkdir -p "/var/www/var/lex/spool" +chown www:tool "/var/www/var/lex/spool" +chmod 710 "/var/www/var/lex/spool" + +mkdir -p "/var/www/var/lex/spool/tmp" +chown www:tool "/var/www/var/lex/spool/tmp" +chmod 750 "/var/www/var/lex/spool/tmp" + +mkdir -p "/var/www/var/lex/spool/new" +chown www:tool "/var/www/var/lex/spool/new" +chmod 2770 "/var/www/var/lex/spool/new" + +mkdir -p "/var/www/var/lex/dict" +chown lex:tool "/var/www/var/lex/dict" +chmod 770 "/var/www/var/lex/dict" + +mkdir -p "/var/www/var/log" +chmod 1770 "/var/www/var/log" +chown www:tool "/var/www/var/log" + +# pubring.gpg +cp -f "$SRCDIR/pubring.gpg" "/var/www/var/lex/pubring.gpg" +chmod 440 "/var/www/var/lex/pubring.gpg" +chown www:tool "/var/www/var/lex/pubring.gpg" +echo "copied: $SRCDIR/pubring.gpg -> /var/www/var/lex/pubring.gpg" + +# lex.cgi +cp -f "$SRCDIR/lex.cgi" "/var/www/cgi-bin/lex.cgi" +chmod 755 "/var/www/cgi-bin/lex.cgi" +chown root:daemon "/var/www/cgi-bin/lex.cgi" +echo "copied: $SRCDIR/lex.cgi -> /var/www/cgi-bin/lex.cgi" + +echo "done." diff --git a/install.lexd_spool.sh b/install.lexd_spool.sh new file mode 100644 index 0000000..e613c5d --- /dev/null +++ b/install.lexd_spool.sh @@ -0,0 +1,43 @@ +#!/bin/ksh +# +# install.lexd_spool.sh - install lexd-spool binary and rc.d script. +# +# Usage: doas ./install.lexd_spool.sh + +set -e + +BIN_SRC="./lexd-spool.sh" +BIN_DST="/usr/local/bin/lexd-spool" +RC_SRC="./lexd-spool.rc" +RC_DST="/etc/rc.d/lexd_spool" + +if [ "$(id -u)" -ne 0 ]; then + echo "error: this script must be run as root" >&2 + exit 1 +fi + +if [ ! -f "$BIN_SRC" ]; then + echo "error: $BIN_SRC not found" >&2 + exit 1 +fi + +if [ ! -f "$RC_SRC" ]; then + echo "error: $RC_SRC not found" >&2 + exit 1 +fi + +if [ ! -e "$BIN_DST" ]; then + echo "installing $BIN_DST" + install -o root -g wheel -m 0755 "$BIN_SRC" "$BIN_DST" +else + echo "$BIN_DST already exists, skipping" +fi + +if [ ! -e "$RC_DST" ]; then + echo "installing $RC_DST" + install -o root -g wheel -m 0555 "$RC_SRC" "$RC_DST" +else + echo "$RC_DST already exists, skipping" +fi + +echo "done." diff --git a/lexd-spool.rc b/lexd-spool.rc new file mode 100644 index 0000000..7ae53cc --- /dev/null +++ b/lexd-spool.rc @@ -0,0 +1,16 @@ +#!/bin/ksh + +daemon="/usr/local/bin/lexd-spool" +daemon_user="_lexd" +pexp="/bin/ksh ${daemon}" + +. /etc/rc.d/rc.subr + +rc_bg=YES +rc_reload=NO + +rc_check() { + pgrep -q -u "${daemon_user}" -f "^/bin/ksh ${daemon}" +} + +rc_cmd $1 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 + diff --git a/sub.sh b/sub.sh deleted file mode 100755 index 3d68184..0000000 --- a/sub.sh +++ /dev/null @@ -1,100 +0,0 @@ -#!/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 - diff --git a/uninstall.lexd_spool.sh b/uninstall.lexd_spool.sh new file mode 100644 index 0000000..39a863a --- /dev/null +++ b/uninstall.lexd_spool.sh @@ -0,0 +1,46 @@ +#!/bin/ksh +# +# uninstall.lexd_spool.sh - remove lexd-spool binary and rc.d script. +# +# Usage: doas ./uninstall.lexd_spool.sh + +set -e + +BIN_DST="/usr/local/bin/lexd-spool" +RC_DST="/etc/rc.d/lexd_spool" +SERVICE="lexd_spool" + +if [ "$(id -u)" -ne 0 ]; then + echo "error: this script must be run as root" >&2 + exit 1 +fi + +# stop the service if it's running +if [ -e "$RC_DST" ] && rcctl check "$SERVICE" >/dev/null 2>&1; then + echo "stopping $SERVICE" + rcctl stop "$SERVICE" +fi + +# disable the service if it's enabled +if [ -e "$RC_DST" ] && rcctl ls on | grep -qx "$SERVICE"; then + echo "disabling $SERVICE" + rcctl disable "$SERVICE" +fi + +# remove the rc.d script +if [ -e "$RC_DST" ]; then + echo "removing $RC_DST" + rm -f "$RC_DST" +else + echo "$RC_DST not present, skipping" +fi + +# remove the binary +if [ -e "$BIN_DST" ]; then + echo "removing $BIN_DST" + rm -f "$BIN_DST" +else + echo "$BIN_DST not present, skipping" +fi + +echo "done." -- cgit v1.2.3