Contexte

Nous considérons :

2 vlans (mais il n'y a pas de limite) :

  • vlan 1 : administration, adresse de type 192.168.1.x
  • vlan 2 : public, adresse de type 192.168.2.x
Des imprimantes réseau, de plusieurs types, dans mon cas, j'ai configuré des Xerox Workcentre Pro 232/255/5655, Phaser 8200N, Ricoh Aficio 2232C. Toutes sur le vlan 1. Certaines imprimantes réclament un code d'accès.

Les postes clients sont de plusieurs types : Windows 2000/XP/Vista, Linux (Ubuntu dans plusieurs versions).

La machine "serveur" utilisée pour ce test est un Dell Optiplex GX150 recyclé.

Configuration

Configuration sur base d'Ubuntu Server 10.04 avec choix de Printserver, quelques paquets supplémentaires : ocsinventory-agent (pour l'inventaire du parc), openssh-server (pour l'accès à distance).

Une adresse IP fixe est déterminée, dans mon cas via une réservation dans le DHCP, le serveur CUPS est accessible via : http://192.168.1.61:631 (avec https pour l'administrer). Toutes les imprimantes seront partagées, l'administration à distance autorisée.

Une règle est par contre importante dans mon cas, les jobs d'impression, y compris leur titre, doivent rester confidentiels, le fichier de configuration de CUPS est proposé à la fin de cet article.

Les imprimantes s'installent sans souci particulier, les fichiers PPD sont disponibles sur les sites des fabricants, ou inclus dans les drivers Windows/Mac.

Sur une machine Windows, vous installez une imprimante réseau dont l'adresse est : http://192.168.1.61:631/printers/Xerox5655_accueil (par exemple). Sur Ubuntu, il suffit de connecter le serveur CUPS local au serveur CUPS distant.

VLAN

Le serveur est relié à une porte de switch correctement configurée, dans mon cas : configuration en vlan 1 untagged et vlan 2 tagged.

Installation du package vlan :

sudo apt-get install vlan

Ajouter la ligne 8021q au fichier /etc/modules

Modifier le fichier /etc/network/interfaces :

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0 vlan2
iface eth0 inet dhcp

# VLAN 2 - public
iface vlan2 inet static
address 192.168.2.61
netmask 255.255.255.0
vlan_raw_device eth0


Redémarrer l'interface réseau :

sudo /etc/init.d/networking restart

OK, CUPS répond aussi sur http://192.168.2.61:631

Le test d'impression depuis le vlan 2 se passe sans souci.

Confidentialité

Je ne souhaite pas que les utilisateurs aient accès aux titres des jobs, ni via l'onglet Jobs, nia via Printers, ni via les boutons de la page Administration.

Modifier le /etc/cups/cupsd.conf

Ajouter Get-Jobs à la clause :

<Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default CUPS-Get-Devices Get-Jobs>
AuthType Default
Require user @SYSTEM
Order deny,allow
</Limit>

Quelques références :
http://www.cups.org/documentation.php/ref-cupsd-conf.html
http://www.cups.org/documentation.php/policies.html

Personnalisation de CUPS

CUPS permet égalemment de définir des "classes", une classe est une collection d'imprimantes et comme le dit la documentation : Jobs sent to a class are forwarded to the first available printer in the class.

Personnaliser la page d'accueil de CUPS en modifiant : /usr/share/cups/doc-root/index.html

Modification de la rotation des logs, via /etc/logrotate.d/cups : changer daily en monthly.

Statistiques

La génération des statistiques sera installée sur une autre machine (dans mon cas), un serveur LAMP classique (adresse http://192.168.1.72).

Installation de :
Pour ce dernier, adaptation de /var/www/phpPrintAnalyzer/inc/config.inc.php pour connecter le CUPS distant et de index.php (petit bug sur les colonnes), en remplaçant : $tabLigneTmp[1] par $tabLigneTmp[2]

Modifier le /etc/cups/cupsd.conf pour n'autoriser que ce serveur à accéder aux logs :

<Location /admin/log>
Order allow,deny
Allow from 192.168.1.72
</Location>

Les statistiques sont en erreur quand un utilisateur (ici salle lecture2) contient un espace.

Ma correction, dans index.php :

// laurent : bug si le nom de user contient un espace, correction :
$evalue_user = $tabLigneTmp[3];
$premier = $evalue_user{0};
if ($premier!="[")
{
// user avec espace
$indice_user=4;
$userTmp = strtolower($tabLigneTmp[2]);
$userTmp = $userTmp." ".strtolower($tabLigneTmp[3]);
} else {
// user sans espace
$indice_user=3;
$userTmp = strtolower($tabLigneTmp[2]);

}


Ensuite dans le code, remplacer $tabLigneTmp[2] par $userTmp.