Pykota

Da sia.
Vai alla navigazione Vai alla ricerca

pykota

pykota è un sistema di quota sulle code di stampe disponibile su sistemi Linux. Come impostazione predefinita pykota salva le informazioni delle quote su un database PostgreSQL, ma è disponibile anche mysql e ldap.

Grazie alla Biblioteca Umanistica che ha sottoscritto una quota da sostenitori del progetto, sono disponibili i pacchetti debian per sarge. Gli interessati li chiedano al redattore del presente articolo.

Descrizione dell'applicazione

Queste istruzioni si riferiscono alla configurazione di un server di stampa (vm-debian) che è un server membro nello stesso dominio samba (SAMBANFS) che contiene le workstation degli utenti a cui devono essere applicate le quote.

Le quote sono fisse per tutti gli utenti e si applicano "al volo" a mano a mano che gli utenti provano a stampare.

Balance e quota

Pykota gestisce due sistemi di controllo della stampe:

  • balance: si tratta di un "capitale" di stampe che l'utente spende per tutte le stampanti, che a loro volta hanno un costo per pagina che può essere diverso l'una dall'altra
  • quota: è un limite al numero di pagine che un utente può stampare su una certa stampante. Per ogni stampante c'è una quota.

Inizialmente era stato preferito il sistema balance, ma se le stampanti non sono correlate (ad esempio sono in dipartimenti e sedi diversi) è meglio quota.

Impostazioni preliminari

  • installare cupsys e gs-esp sul server e controllare che stampi sulla stampante;
  • installare pykota con le sue dipendenze (python2.3, python-dev ed i pacchetti; pkipplib e pkpgcounter );
  • controllare che pykota abbia attivato il flag di eseguibilità al file /usr/share/pykota/cupspykota (altrimenti eseguire chmod +x) e che la directory /etc/pykota abbia come proprietario l'utente pykota;
  • accertarsi che la stampante sia protetta da connessioni che non provengano dal server;
  • installare PostgreSQL;
  • aggiungere al file /etc/postgresql/pg_hba.conf (o /etc/postgresql/7.4/main/pg-hba.conf), sotto la riga "# Put your actual configuration here":
# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
# Database administrative login by UNIX sockets
local all    postgres                              ident sameuser
local all    all                                   reject
host  pykota postgres    127.0.0.1 255.255.255.255 trust
host  pykota pykotauser  127.0.0.1 255.255.255.255 md5
host  pykota pykotaadmin 127.0.0.1 255.255.255.255 md5
host  pykota all         127.0.0.1 255.255.255.255 reject

e riavviare postgresql;

  • potrebbe essere necessario modificare il file postgresql.conf e abilitare:
tcpip_socket = true
  • inizializzare il database PostgreSQL con le istruzioni del file: /usr/share/pykota/postgresql/README.postgresql.

Installazione di una stampante con pykota

Se esiste già una stampante "Lexmark" in cups, Eseguire:

pkturnkey -f
pkprinters -a -c 1 Lexmark
pkprinters -l
Lexmark [printer created from pkturnkey] (0.0 + #*1.0)
    Passthrough mode : OFF
    Maximum job size : Unlimited
    Routed through PyKota : NO

Prependere "cupspykota" al DeviceUri di Lexmark in /etc/cups/printers.conf:

DeviceURI cupspykota:socket://lexmark.unimo.it:9100

A questo punto, dopo aver riavviato cupsys, pkprinters -l dice che la coda di stampa è inoltrata tramite pykota, e nei log di pykota (/var/log/lpr.log) si vedono i messaggi di pykota.

Rendere la stampante visibile per MS Windows

L'howto più chiaro per stampare con samba-cups e la pagina man del comando cupsaddsmb.

Il Samba-Howto contiene invece una descrizione fin troppo dettagliata della gestione del processo di stampa tra windows, samba e cups.

L'idea fondamentale è quella di inserire un filtro per ottenere dai client delle stampe in postscript. Per windows 95/98, si usano i driver postscript di Abobe che vanno inseriti nella directory /usr/share/cups/drivers; per le piattaforme windows più recenti si usano i driver MS Windows presi dalla cartella c:\System di un client.

Se in cups la stampante non è stata create raw, ma ha un ppd (anche un postscript generico va bene), creare l'utente root di samba (con smbpasswd), accertarsi che in smb.conf root non compaia tra gli utenti invalidi, e eseguire

cupsaddsmb -Uroot -H vm-debian -v Lexmark

Adesso si può provare a stampare come utente windows (magari da un altro PC) con:

smbspool smb://user:pass@sambanfs/vm-debian.lab.unimo.it/lexmark 1 user limits 1 "test" file_to_print

Si dovrebbe vedere una riga sul server di stampa in /var/log/cups/page_log

Stabilire le regole per le quote

A questo punto dovrebbe essere sufficiente aggiungere in coda a /etc/pykota/pykota.conf

[Lexmark]
gracedelay: 0
enforcement : strict
hardwarn: La stampa e' stata arrestata perche' sono state superate le copie \
disponibili per questa settimana, oppure il numero di pagine della stampa eccede la quota.

mailto: external(echo "%(message)s" | /usr/bin/iconv --to-code utf-8 \
--from-code iso-8859-15 | /usr/bin/smbclient -M "%(username)s" 2>&1 >/dev/null)

policy: external(/usr/bin/autopykota --initbalance 20.0)
onaccountererror: stop

Le policy se il limite è quota

Il comando autopykota svolge il proprio lavoro nel caso di limite con balance. Nel caso di limite con quota, sostituire la riga che inizia con policy con:

policy: external(/usr/bin/mio-autopykota)

in cui mio-autopykota potrebbe essere:

 
#/bin/bash

logger -p info -t pykota "Creo l'utente: "$PYKOTAUSERNAME
autopykota
pkusers --limitby quota $PYKOTAUSERNAME
edpykota --add -S 20 -H 20 --printer $PYKOTAPRINTERNAME $PYKOTAUSERNAME

Configurazione dei client

Affinché i client ricevano il messaggio istantaneo che spiega il motivo per cui la stampa è stata rifiutata, bisogna attivare il servizio Messenger di windows (che è disabilitato di default su Windows XP).

Amministrazione di pykota

Gestione utenti se il limite è balance

Per modificare il limite di stampe dell'utente_u e portarlo a numero_n:

pkusers -b numero_n utente_x

Questo comando si può mettere in un file cron per permettere un certo numero di stampe ogni certo periodo. Ad esempio all'inizio di ogni settimana si possono cancellare tutte le quote e resettarle a un certo valore: in questa maniera gli utenti possono stampare solo qual valore di copie alla settimana.

Gestione utenti se il limite è quota

Per modificare il limite di stampe dell'utente_u e portarlo a numero_n:

edpykota -S numero_n -H numero_n utente_x


Come diventare amministratori di pykota

Se un utente può o meno invocare il comando pkusers dipende se riesce a meno a leggere il file /etc/pykota/pykotadmin.conf. Si consiglia di dare:

chown pykota:pykota /etc/pykota/pykotadmin.conf
chmod 640 /etc/pykota/pykotadmin.conf

E di inserire nel gruppo pykota coloro che hanno bisogno di fare amministrazione delle quote.

Se autopykota non riesce a funzionare, controllare con quale utente lo esegue. Se ad esempio è lp, aggiungere lp tra i proprietari di

/etc/pykota/pykotadmin.conf.

Questo controllo si può fare se si mettere

debug = yes

in pykota.conf, poi si legge l'output di lpr.log in cerca di qualcosa tipo:

 Running as user 'lp'.

Per farsi mandare un report delle stampe che passano per pykota si può mettere in crontab questo script:

#!/bin/bash
dati=$( dumpykota -d history -s start=`date +%Y%m%d -d yesterday` | tail -n 1 )
print=$( echo $dati | awk -F ',' '{print $9}' )
wprint=$( echo $dati | awk -F ',' '{print $20}' )
message="Pagine stampate ieri, `date +%d/%m/%Y -d yesterday`: $print\n
Pagine mandate in stampa: $wprint.\n\nLa differenza significa che qualcuno ha  tentato di superare la propria quota.\n
Cordialmente\n\nIl reporter di pykota"
echo -e $message | mail -s "Report della stampante" malvezzi@unimo.it

E se tutto questo controllo non e' sufficiente?

pykota offre due strumenti per intervenire nel processo di decisione della stampa:

  • pre- e posthook
  • overwrite_jobticket

tutti questi sistemi permettono l'esecuzione di un comando esterno di shell cui sono passati, tramite le variabili d'ambiente, tutti i dati della stampe.

I pre- e posthook sembrano più adatti alla diagnostica, al logging e a trasmettere feedback all'utente.

overwrite_jobticket invece permette di bloccare una stampa ad esempio in base all'IP del richidente:

#!/usr/bin/ruby

ip = ENV["PYKOTAJOBORIGINATINGHOSTNAME"]
unless ip.match(/155\.185\.30\.7[0-5]/)
then
        puts "DENY"
end

E' sufficiente dare un nome a questo script (chmod +x) e impostare:

overwrite_jobticket: /etc/pykota/nome_script.rb

in pykota.conf

--Malvezzi 11:13, 30 January 2007 (CET)