- Replace unreliable pexp patterns with PID-file approach - Add graceful shutdown with timeout handling in rc.d script - Implement process validation after startup - Add SIGHUP config reload support for Unix services - Ensure PID-file cleanup on service exit - Update systemd service to use PIDFile parameter Platform improvements: - OpenBSD: rc_check/rc_stop functions now PID-file based - Linux: systemd Type=forking with proper PIDFile support - Cross-platform: /var/run/furt.pid standard location Resolves service status detection issues where rcctl check showed (failed) despite running service due to process name variations across platforms.
126 lines
3.3 KiB
Bash
Executable file
126 lines
3.3 KiB
Bash
Executable file
#!/bin/sh
|
|
# scripts/start.sh
|
|
set -e
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m'
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
|
|
echo -e "${GREEN}=== Furt Lua HTTP-Server Startup ===${NC}"
|
|
|
|
# User can override this manually if needed:
|
|
LUA_COMMAND=""
|
|
|
|
# Config check first
|
|
if [ "$(uname)" = "OpenBSD" ] || [ "$(uname)" = "FreeBSD" ]; then
|
|
CONFIG_FILE="/usr/local/etc/furt/furt.conf"
|
|
PID_FILE="/var/run/furt.pid"
|
|
else
|
|
CONFIG_FILE="/etc/furt/furt.conf"
|
|
PID_FILE="/var/run/furt.pid"
|
|
fi
|
|
|
|
if [ ! -f "$CONFIG_FILE" ] && [ ! -f "$PROJECT_DIR/config/furt.conf" ]; then
|
|
echo -e "${RED}Error: furt.conf not found${NC}"
|
|
echo "Create config first in $CONFIG_FILE or $PROJECT_DIR/config/furt.conf"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$LUA_COMMAND" ]; then
|
|
# Test standard distribution paths
|
|
for cmd in lua51 lua5.1; do
|
|
if command -v "$cmd" >/dev/null 2>&1; then
|
|
LUA_COMMAND="$cmd"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -z "$LUA_COMMAND" ]; then
|
|
echo -e "${RED}Error: No Lua 5.1 found${NC}"
|
|
echo "Install options:"
|
|
echo " Arch: pacman -S lua51"
|
|
echo " OpenBSD: pkg_add lua51"
|
|
echo " Debian: apt install lua5.1"
|
|
echo ""
|
|
echo "Or set: LUA_COMMAND=/custom/path/lua51 at top of this script"
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}Found Lua:${NC} $LUA_COMMAND"
|
|
|
|
# Dependency checks
|
|
# Socket check
|
|
$LUA_COMMAND -e "require('socket')" 2>/dev/null || {
|
|
echo -e "${RED}Error: lua-socket not found${NC}"
|
|
echo "Install options:"
|
|
echo " Arch: pacman -S lua51-socket"
|
|
echo " OpenBSD: pkg_add lua-socket"
|
|
echo " Debian: apt install lua-socket"
|
|
exit 1
|
|
}
|
|
|
|
# JSON library check
|
|
if ! ($LUA_COMMAND -e "require('cjson')" 2>/dev/null || $LUA_COMMAND -e "require('dkjson')" 2>/dev/null); then
|
|
echo -e "${RED}Error: No JSON library found${NC}"
|
|
echo "Install options:"
|
|
echo " Arch: pacman -S lua51-dkjson"
|
|
echo " OpenBSD: pkg_add lua-cjson"
|
|
echo " Debian: apt install lua-cjson"
|
|
exit 1
|
|
fi
|
|
|
|
# SSL/TLS library check
|
|
$LUA_COMMAND -e "require('ssl')" 2>/dev/null || {
|
|
echo -e "${RED}Error: SSL/TLS library not found${NC}"
|
|
echo "Install options:"
|
|
echo " Arch: pacman -S lua51-sec"
|
|
echo " OpenBSD: pkg_add luasec"
|
|
echo " Debian: apt install lua-sec"
|
|
exit 1
|
|
}
|
|
|
|
cd "$PROJECT_DIR"
|
|
|
|
echo -e "${GREEN}Starting Furt...${NC}"
|
|
|
|
# PID-File cleanup function
|
|
cleanup_pid() {
|
|
if [ -f "$PID_FILE" ]; then
|
|
rm -f "$PID_FILE"
|
|
fi
|
|
}
|
|
|
|
# Service vs Interactive Detection
|
|
if [ ! -t 0 ] || [ ! -t 1 ]; then
|
|
# Service mode - Background + PID-File
|
|
echo -e "${GREEN}Service mode: Background + PID-File${NC}"
|
|
|
|
# Start process in background
|
|
"$LUA_COMMAND" src/main.lua &
|
|
PID=$!
|
|
|
|
# Write PID-File
|
|
echo "$PID" > "$PID_FILE"
|
|
echo -e "${GREEN}Furt started (PID: $PID, PID-File: $PID_FILE)${NC}"
|
|
|
|
# Verify process is still running after short delay
|
|
sleep 1
|
|
if ! kill -0 "$PID" 2>/dev/null; then
|
|
echo -e "${RED}Error: Process died immediately${NC}"
|
|
cleanup_pid
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "${GREEN}Service startup successful${NC}"
|
|
else
|
|
# Interactive mode - Foreground (no PID-File)
|
|
echo -e "${GREEN}Interactive mode: Foreground${NC}"
|
|
exec "$LUA_COMMAND" src/main.lua
|
|
fi
|
|
|