.PHONY: all clean norm author author-stop author-restart author-status help VENV := .venv PY := $(VENV)/bin/python PIP := $(VENV)/bin/pip PERM_DIR := /home/zaine/master-folder/projects/scripts/bash-scripts AUTHOR_PORT := 8765 AUTHOR_URL := http://127.0.0.1:$(AUTHOR_PORT) AUTHOR_PID := /home/zaine/logs/authoring-server.pid AUTHOR_LOG := /home/zaine/logs/authoring-server.log AUTHOR_PAGES_CHECK := /tmp/authoring-server-pages.json all: set-perms clean-output build search clean-venv author-restart build: @echo "Building project..." emacs -Q --script build-site.el set-perms: @echo "Setting permissions for output directory..." cd $(PERM_DIR) && sudo ./master-perms.sh search: $(VENV) @echo "Generating search index" $(PY) search-index-json.py $(VENV): @echo "Generating virtual environment" python3 -m venv $(VENV) $(PIP) install -r requirements.txt clean-output: @echo "Cleaning output directory..." rm -rf output/ clean-venv: @echo "Cleaning virtual environment..." rm -rf $(VENV) norm: @echo "sorting out the backups..." find . -path ./backups -prune -o -type f -name '*~' -exec mv {} backups/ \; author: $(VENV) @echo "Starting local authoring UI in foreground..." $(PY) authoring_server.py author-stop: @echo "Stopping existing authoring UI if running..." @mkdir -p /home/zaine/logs @if [ -f "$(AUTHOR_PID)" ]; then \ PID=$$(cat "$(AUTHOR_PID)"); \ if kill -0 $$PID 2>/dev/null; then \ echo "Stopping PID $$PID"; \ kill $$PID 2>/dev/null || true; \ for i in 1 2 3 4 5; do \ if ! kill -0 $$PID 2>/dev/null; then break; fi; \ sleep 1; \ done; \ if kill -0 $$PID 2>/dev/null; then \ echo "PID $$PID did not stop cleanly; killing it."; \ kill -9 $$PID 2>/dev/null || true; \ fi; \ fi; \ rm -f "$(AUTHOR_PID)"; \ fi @fuser -k $(AUTHOR_PORT)/tcp >/dev/null 2>&1 || true author-restart: $(VENV) author-stop @echo "Starting authoring UI on port $(AUTHOR_PORT)..." @mkdir -p /home/zaine/logs @start-stop-daemon --start --background --make-pidfile --pidfile "$(AUTHOR_PID)" \ --chdir "$(CURDIR)" --startas "$(CURDIR)/$(PY)" -- \ authoring_server.py > "$(AUTHOR_LOG)" 2>&1 @echo "Waiting for authoring UI and page list to respond..." @for i in 1 2 3 4 5 6 7 8 9 10; do \ PID=$$(cat "$(AUTHOR_PID)"); \ if ! kill -0 $$PID 2>/dev/null; then \ echo "Authoring UI process exited before becoming healthy. Last logs:"; \ tail -n 40 "$(AUTHOR_LOG)" || true; \ exit 1; \ fi; \ if curl -fsS "$(AUTHOR_URL)/api/pages" -o "$(AUTHOR_PAGES_CHECK)" && $(PY) -c 'import json,sys; data=json.load(sys.stdin); sys.exit(0 if isinstance(data, list) and data else 1)' < "$(AUTHOR_PAGES_CHECK)"; then \ echo "Authoring UI is running on $(AUTHOR_URL)/"; \ exit 0; \ fi; \ sleep 1; \ done; \ echo "Authoring UI failed to start. Last logs:"; \ tail -n 40 "$(AUTHOR_LOG)" || true; \ exit 1 author-status: @if [ -f "$(AUTHOR_PID)" ] && kill -0 $$(cat "$(AUTHOR_PID)") 2>/dev/null; then \ echo "PID: $$(cat "$(AUTHOR_PID)")"; \ else \ echo "No live authoring UI PID recorded."; \ fi @curl -fsS "$(AUTHOR_URL)/api/pages" -o "$(AUTHOR_PAGES_CHECK)" && $(PY) -c 'import json,sys; print(f"Pages: {len(json.load(sys.stdin))}")' < "$(AUTHOR_PAGES_CHECK)" || true help: @echo "Available targets:" @echo " make - Full rebuild and restart authoring UI" @echo " make build - Rebuild the output directory" @echo " make set-perms - Set permissions for output directory" @echo " make clean-output - Remove output directory" @echo " make clean-venv - Remove venv directory" @echo " make norm - Move backup files" @echo " make author - Start the local authoring UI in foreground" @echo " make author-stop - Stop the authoring UI" @echo " make author-restart - Restart the authoring UI in background" @echo " make author-status - Show authoring UI PID and page count" @echo " make search - Create the search index" @echo " make help - Show this help message"