feat: détection erreurs imprimante via IPP direct (Selphy CP1300)
- script_print.sh : après lp, polling CUPS + sondage IPP direct ipp://IP:631/ipp/print Détecte input-tray-missing / media-empty en ~3-6s sans attendre le timeout CUPS - printer_service.py : ajout _get_printer_ip(), _query_ipp_direct() _get_printer_status() utilise IPP pour état/raisons/encre (source de vérité) - Timeout porté à 120s côté Python, fallback lpstat conservé
This commit is contained in:
@@ -136,8 +136,26 @@ if [ -z "$JOB_ID" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# --- Preparation du sondage IPP direct sur l'imprimante ---
|
||||
# La Selphy CP1300 expose un serveur IPP natif (port 631, sans auth).
|
||||
# Cela permet de detecter les erreurs physiques en quelques secondes
|
||||
# sans attendre un timeout CUPS (qui ne rapporte pas les erreurs papier).
|
||||
|
||||
PRINTER_IP=$(lpstat -v "$SELECTED_PRINTER" 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | head -1)
|
||||
IPP_URI=""
|
||||
IPP_TEST="/usr/share/cups/ipptool/get-printer-attributes.test"
|
||||
if [ -n "$PRINTER_IP" ] && command -v ipptool &>/dev/null && [ -f "$IPP_TEST" ]; then
|
||||
IPP_URI="ipp://${PRINTER_IP}:631/ipp/print"
|
||||
log_info "Sondage IPP direct actif: $IPP_URI"
|
||||
else
|
||||
log_info "Sondage IPP desactive (IP=${PRINTER_IP:-inconnu}, ipptool=$(command -v ipptool || echo absent))"
|
||||
fi
|
||||
|
||||
# Mots-cles d'erreur dans printer-state-reasons
|
||||
IPP_ERROR_REASONS="input-tray-missing|media-empty|media-needed|marker-supply-empty|cover-open|door-open|offline-report"
|
||||
|
||||
# --- Suivi du job CUPS (attend la completion physique) ---
|
||||
MAX_WAIT=90 # secondes max (Selphy CP1300 ~ 60s)
|
||||
MAX_WAIT=90 # secondes max (Selphy CP1300 imprime en ~47s)
|
||||
POLL_INTERVAL=3
|
||||
elapsed=0
|
||||
|
||||
@@ -147,7 +165,7 @@ while [ $elapsed -lt $MAX_WAIT ]; do
|
||||
sleep $POLL_INTERVAL
|
||||
elapsed=$((elapsed + POLL_INTERVAL))
|
||||
|
||||
# Succes : job dans la liste des jobs termines
|
||||
# 1. Succes : job dans la liste des jobs termines par CUPS
|
||||
if lpstat -W completed 2>/dev/null | grep -q "^${JOB_ID} "; then
|
||||
log_info "Job $JOB_ID termine avec succes (${elapsed}s)"
|
||||
echo "PRINTED:${SELECTED_PRINTER}:${copies}"
|
||||
@@ -155,13 +173,27 @@ while [ $elapsed -lt $MAX_WAIT ]; do
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Erreur : imprimante stoppee (papier absent, capot ouvert, etc.)
|
||||
# 2. Sondage IPP direct (detecte papier absent, capot ouvert, etc. en ~3s)
|
||||
if [ -n "$IPP_URI" ]; then
|
||||
ipp_reasons=$(ipptool -tv "$IPP_URI" "$IPP_TEST" 2>/dev/null \
|
||||
| grep "printer-state-reasons" | head -1)
|
||||
if echo "$ipp_reasons" | grep -qiE "$IPP_ERROR_REASONS"; then
|
||||
reason=$(echo "$ipp_reasons" | grep -oiE "$IPP_ERROR_REASONS" | head -1)
|
||||
log_error "Erreur imprimante detectee via IPP: $reason (${elapsed}s)"
|
||||
cancel "$JOB_ID" 2>/dev/null || true
|
||||
echo "PRINT_ERROR:${SELECTED_PRINTER}:${reason}"
|
||||
[ -f "$filename_print" ] && rm -f "$filename_print" 2>/dev/null
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 3. Fallback CUPS : imprimante stoppee cote CUPS
|
||||
printer_state=$(lpstat -p "$SELECTED_PRINTER" 2>/dev/null || true)
|
||||
if echo "$printer_state" | grep -qiE "stopped|disabled"; then
|
||||
reason=$(lpstat -l -p "$SELECTED_PRINTER" 2>/dev/null \
|
||||
| grep -i "Reason:" | head -1 \
|
||||
| sed 's/.*Reason:[[:space:]]*//' | xargs)
|
||||
log_error "Imprimante $SELECTED_PRINTER en erreur: ${reason:-stopped} (apres ${elapsed}s)"
|
||||
log_error "Imprimante $SELECTED_PRINTER stoppee (CUPS): ${reason:-stopped} (${elapsed}s)"
|
||||
cancel "$JOB_ID" 2>/dev/null || true
|
||||
echo "PRINT_ERROR:${SELECTED_PRINTER}:${reason:-stopped}"
|
||||
[ -f "$filename_print" ] && rm -f "$filename_print" 2>/dev/null
|
||||
|
||||
Reference in New Issue
Block a user