111 lines
3.9 KiB
Bash
111 lines
3.9 KiB
Bash
#!/bin/sh
|
|
# Startup script for the containerized CUPS print server.
|
|
#
|
|
# Starts the D-Bus system bus, Avahi (mDNS/DNS-SD) and CUPS, then registers
|
|
# the Brother HL-4150CDN queue if it does not exist yet. The CUPS daemon is
|
|
# kept in the foreground so the container lives as long as the print server.
|
|
#
|
|
# Configuration (all optional, via environment):
|
|
# PRINTER_IP IP address / host name of the network printer.
|
|
# PRINTER_URI Full device URI; overrides PRINTER_IP when set.
|
|
# PRINTER_PROTOCOL lpd (default), socket or ipp - used with PRINTER_IP.
|
|
# PRINTER_NAME CUPS queue name and advertised (DNS-SD) name.
|
|
# PRINTER_DESCRIPTION CUPS Description (lpadmin -D) shown in the web UI.
|
|
# PPD_FILE PPD used for the queue.
|
|
set -eu
|
|
|
|
PRINTER_NAME="${PRINTER_NAME:-HL4150CDN}"
|
|
PRINTER_IP="${PRINTER_IP:-}"
|
|
PRINTER_URI="${PRINTER_URI:-}"
|
|
PRINTER_PROTOCOL="${PRINTER_PROTOCOL:-lpd}"
|
|
PRINTER_DESCRIPTION="${PRINTER_DESCRIPTION:-}"
|
|
PPD_FILE="${PPD_FILE:-/usr/share/cups/model/brhl4150cdn.ppd}"
|
|
|
|
LOG_PREFIX="[entrypoint]"
|
|
log() { echo "${LOG_PREFIX} $*"; }
|
|
|
|
# Build a device URI from PRINTER_IP unless an explicit PRINTER_URI is given.
|
|
if [ -z "${PRINTER_URI}" ] && [ -n "${PRINTER_IP}" ]; then
|
|
case "${PRINTER_PROTOCOL}" in
|
|
lpd)
|
|
PRINTER_URI="lpd://${PRINTER_IP}/binary_p1"
|
|
;;
|
|
socket)
|
|
PRINTER_URI="socket://${PRINTER_IP}:9100"
|
|
;;
|
|
ipp)
|
|
PRINTER_URI="ipp://${PRINTER_IP}/ipp/print"
|
|
;;
|
|
*)
|
|
log "unknown PRINTER_PROTOCOL '${PRINTER_PROTOCOL}', defaulting to lpd"
|
|
PRINTER_URI="lpd://${PRINTER_IP}/binary_p1"
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
# --- D-Bus system bus -------------------------------------------------------
|
|
mkdir -p /run/dbus /var/lib/dbus
|
|
if [ ! -s /etc/machine-id ] && [ ! -s /var/lib/dbus/machine-id ]; then
|
|
log "generating D-Bus machine id"
|
|
dbus-uuidgen > /var/lib/dbus/machine-id
|
|
fi
|
|
if [ ! -S /run/dbus/system_bus_socket ]; then
|
|
log "starting dbus-daemon (system bus)"
|
|
dbus-daemon --system --fork
|
|
fi
|
|
|
|
# --- Avahi / mDNS -----------------------------------------------------------
|
|
mkdir -p /run/avahi-daemon
|
|
if ! pgrep -x avahi-daemon >/dev/null 2>&1; then
|
|
log "starting avahi-daemon"
|
|
avahi-daemon --daemonize --no-chroot
|
|
fi
|
|
|
|
# --- CUPS -------------------------------------------------------------------
|
|
log "starting cupsd"
|
|
/usr/sbin/cupsd -f &
|
|
CUPSD_PID=$!
|
|
|
|
# Wait until CUPS accepts requests.
|
|
i=0
|
|
while [ "$i" -lt 30 ]; do
|
|
if lpstat -r >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
i=$((i + 1))
|
|
sleep 0.5
|
|
done
|
|
|
|
# Share printers on the network and allow remote administration.
|
|
cupsctl --share-printers --remote-admin >/dev/null 2>&1 || true
|
|
|
|
# --- Brother HL-4150CDN queue ----------------------------------------------
|
|
if lpstat -p "${PRINTER_NAME}" >/dev/null 2>&1; then
|
|
log "printer ${PRINTER_NAME} already exists"
|
|
elif [ -n "${PRINTER_URI}" ]; then
|
|
if [ -f "${PPD_FILE}" ]; then
|
|
log "adding printer ${PRINTER_NAME} -> ${PRINTER_URI}"
|
|
lpadmin -p "${PRINTER_NAME}" -E -v "${PRINTER_URI}" -P "${PPD_FILE}" \
|
|
|| log "warning: lpadmin failed to add ${PRINTER_NAME}"
|
|
else
|
|
log "warning: PPD ${PPD_FILE} not found; skipping printer creation"
|
|
fi
|
|
else
|
|
log "neither PRINTER_URI nor PRINTER_IP is set; skipping automatic printer creation"
|
|
fi
|
|
|
|
# Make sure the queue is shared, named for advertising and set as default.
|
|
if lpstat -p "${PRINTER_NAME}" >/dev/null 2>&1; then
|
|
lpadmin -p "${PRINTER_NAME}" -o printer-is-shared=true -E >/dev/null 2>&1 || true
|
|
if [ -n "${PRINTER_DESCRIPTION}" ]; then
|
|
lpadmin -p "${PRINTER_NAME}" -D "${PRINTER_DESCRIPTION}" >/dev/null 2>&1 || true
|
|
fi
|
|
lpadmin -d "${PRINTER_NAME}" >/dev/null 2>&1 || true
|
|
log "queue ${PRINTER_NAME} is shared and set as default"
|
|
fi
|
|
|
|
log "ready: CUPS on 631/tcp, mDNS on 5353/udp"
|
|
|
|
# Keep the container running by waiting on cupsd.
|
|
wait "${CUPSD_PID}"
|