Alle Drucker immer sichtbar - warum?

Hallo Holger!
Boah, habe ich mich über diesen Satz geärgert. Mit dieser Denkweise kann man auch noch Autos mit Anlasskurbel verkaufen wollen: Nehme den Autofahrern nicht alles ab, sonst werden sie zu schwach.

Warum zeigt der Client Funktionalität an, wo keine ist? Würdest du in einem Onlineshop einkaufen, dass dir bei der Farbauswahl deines Produktes zehn Farben zur Auswahl lässt, nur um dir bei jeder Wahl (bis auf einer) zu melden, dass diese Farbe gerade nicht lieferbar ist? Oder um im Bild zu bleiben, einfach gar nicht liefert!

Aus Ärger entsteht ja auch manchmal Gutes. Ich habe mich hingesetzt und überlegt, wie es gehen könnte:
Man kann in der /etc/cups-browsed.conf Filter definieren. Etwa so:
BrowseFilter NOT name ^R114_Laser
Dies zeigt alle Drucker nicht an, die R114_Laser heißen.

Durch ein einfaches wget kann man abfragen, ob man einen Drucker benutzen darf:

cupsserver=„10.16.1.1“
printurl=„/printers/R114_Laser“
wget -q -O /dev/null http://$cupsserver:631$printerurl
if [ $? -eq 8 ]
then
echo „Drucker nicht erreichbar → sollte gefiltert werden“
fi

Das könnte man für alle erreichbare Drucker einmal beim Systemstart, wenn das Netzwerk verfügbar ist, machen. Hier wäre ein Systemd script dafür

#cat /etc/systemd/system/cups-browse-filter-setup.service
[Unit]
Description=Filter forbidden Printers.
After=network-online.target
Before=cups-browsed.service

[Service]
Type=simple
ExecStart=/usr/local/sbin/cupsBrowseFilter.sh

[Install]
WantedBy=multi-user.target

Und so könnte das eigentliche Erstellen der Filter aussehen:
Vorbedingung:

mv /etc/cups/cups-browsed.conf /etc/cups/cups-browsed.conf.template

Zuerst alle Drucker auflisten, dann jeden Drucker aufrufen. Wenn auf den Drucker nicht zugegriffen werden kann, wird ein Filter erstellt und der Filter wird die Datei $cupsfilterfile geschrieben. Am Ende wird die Datei /etc/cups/cups-browsed.conf.template nach /etc/cups/cups-browsed.conf kopiert und die Filterliste angehängt.

cat /usr/local/sbin/cupsBrowseFilter.sh

#!/bin/bash
cupsserver=„10.16.1.1“
cupsfilterfile=„/etc/cups/LinuxmusterFilterList.conf“

printerurllist=$(wget -q -O - http://:631$cupsserver/printers | grep ‚HREF="/printers‘ | grep -v ‚HREF=„/printers/“‘ | grep -v ‚HREF="/printers/?‘ | awk -F’"’ ‚{print $2}‘)
if [ „$printerurllist“ == „“ ]
then
echo „no printers found.“
exit 1
fi

rm „$cupsfilterfile“

for printerurl in $printerurllist
do
printername=$(echo $printerurl | awk -F’/’ ‚{print $3}‘)
wget -q -O /dev/null http://$cupsserver:631$printerurl

if [ $? -eq 8 ] 
then
	echo "printer $printername not available!"
	echo "BrowseFilter NOT name ^$printername" >> "$cupsfilterfile"
fi

done

echo -e „Do not edit this file! It will get overwriten!\n\n“ > /etc/cups/cups-browsed.conf
echo -e „letzte aktualisierung dieser Datei: $(date)“ > /etc/cups/cups-browsed.conf
cat /etc/cups/cups-browsed.conf.template >> /etc/cups/cups-browsed.conf
cat „$cupsfilterfile“ >> /etc/cups/cups-browsed.conf

Man müsste avahi opfern. Avahi hört bei GTK2 Programmen wie Firefox nicht auf Filter.
Da es einem mit systemd nicht gelingt avahi vollständig zu deaktivieren, könnte man es so machen:

#cat /etc/avahi/avahi-daemon.conf

use-ipv4=no
use-ipv6=no


In der cups-browsed.conf müsste dann noch hinzugefügt werden:

BrowseAllow server1
BrowsePoll server1

Ehrlich gesagt: Diese Gedanken sind Gefrickel. Das könnte Cupsbrowsed besser alleine machen. Keine Ahnung, warum es das nicht tut. Aber funktionieren würde es. Aber dann würden die User ja nicht mehr denken.
Gruß
Frithjof